xref: /illumos-gate/usr/src/uts/common/smbsrv/smb.h (revision bfe5e737326ea1aafea02849716d8aceacf5c2eb)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
25  */
26 
27 #ifndef _SMBSRV_SMB_H
28 #define	_SMBSRV_SMB_H
29 
30 
31 /*
32  * SMB definitions and interfaces, mostly defined in the SMB and CIFS specs.
33  */
34 #include <sys/types.h>
35 #include <smbsrv/string.h>
36 #include <smbsrv/msgbuf.h>
37 
38 #include <smb/ntstatus.h>
39 #include <smb/nterror.h>
40 #include <smb/lmerr.h>
41 #include <smb/doserror.h>
42 #include <smb/ntaccess.h>
43 
44 /*
45  * Macintosh Extensions for CIFS
46  */
47 #include <smbsrv/mac_cifs.h>
48 
49 /*
50  * NT Installable File System (IFS) interface.
51  */
52 #include <smbsrv/ntifs.h>
53 
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57 
58 /*
59  * The msgbuf format and length of an SMB header.
60  */
61 #define	SMB_HEADER_DOS_FMT	"Mbbbwbww10.wwww"
62 #define	SMB_HEADER_NT_FMT	"Mblbww#c2.wwww"
63 #define	SMB_HEADER_LEN		32
64 #define	SMB_SIG_SIZE		8	/* SMB signature size */
65 
66 #define	SMB_HEADER_ED_FMT	"Mbbbwbww8c2.wwww"
67 #define	SMB_HEADER_ED_LEN	(4+1+1+1+2+1+2+12+2+2+2+2)
68 #define	SMB_TRANSHDR_ED_FMT	"wwwwb.wl2.wwwwb."
69 #define	SMB_TRANSHDR_ED_LEN	(2+2+2+2+1+1+2+4+2+2+2+2+2+1+1)
70 #define	SMB_TRANSSHDR_ED_FMT	"wwwwwwwww"
71 #define	SMB_TRANSSHDR_ED_LEN	(2+2+2+2+2+2+2+2)
72 #define	SMB_TRANS2SHDR_ED_FMT	"wwwwwwwww"
73 #define	SMB_TRANS2SHDR_ED_LEN	(2+2+2+2+2+2+2+2+2)
74 /* There is something wrong with this. Should be 38 bytes. It is 37 bytes */
75 #define	SMB_NT_TRANSHDR_ED_FMT	"b2.llllllllbw"
76 #define	SMB_NT_TRANSHDR_ED_LEN	(1+2+4+4+4+4+4+4+4+4+1+2)
77 
78 /*
79  * CIFS definition for the SMB header (CIFS Section 3.2). Note that the
80  * pid_high field is not documented in the 1997 CIFS specificaction. This
81  * is a decoded or memory-based definition, which may be padded to align
82  * its elements on word boundaries. See smb_hdrbuf_t for the network
83  * ready structure.
84  */
85 typedef struct smb_hdr {
86 	uint8_t protocol[4];
87 	uint8_t command;
88 
89 	union {
90 		struct {
91 			uint8_t error_class;
92 			uint8_t reserved;
93 			uint16_t error;
94 		} dos_error;
95 		uint32_t ntstatus;
96 	} status;
97 
98 	uint8_t flags;
99 	uint16_t flags2;
100 	uint16_t pid_high;
101 
102 	union {
103 		uint16_t pad[5];
104 		struct {
105 			uint16_t reserved;
106 			uint8_t security_sig[SMB_SIG_SIZE];
107 		} extra;
108 	} extra;
109 
110 	uint16_t tid;
111 	uint16_t pid;
112 	uint16_t uid;
113 	uint16_t mid;
114 } smb_hdr_t;
115 
116 /*
117  * Encoded or packed SMB header in network ready format.
118  */
119 typedef struct smb_hdrbuf {
120 	uint8_t hdr[SMB_HEADER_LEN];
121 } smb_hdrbuf_t;
122 
123 /*
124  * Protocol magic value as a 32-bit.  This will be 0xff 0x53 0x4d 0x42 on
125  * the wire.
126  */
127 
128 #define	SMB_PROTOCOL_MAGIC	0x424d53ff
129 #define	SMB2_PROTOCOL_MAGIC	0x424d53fe
130 
131 /*
132  * Time and date encoding (CIFS Section 3.6). The date is encoded such
133  * that the year has a range of 0-119, which represents 1980-2099. The
134  * month range is 1-12, and the day range is 1-31.
135  */
136 typedef struct smb_date {
137 	uint16_t day   : 5;
138 	uint16_t month : 4;
139 	uint16_t year  : 7;
140 } smb_date_t;
141 
142 /*
143  * The hours range is 0-23, the minutes range is 0-59 and the two_sec
144  * range is 0-29.
145  */
146 typedef struct smb_time {
147 	uint16_t two_sec : 5;
148 	uint16_t minutes : 6;
149 	uint16_t hours    : 5;
150 } smb_time_t;
151 
152 /*
153  * This is a 64-bit signed absolute time representing 100ns increments.
154  * A positive value represents the absolute time since 1601AD. A
155  * negative value represents a context specific relative time.
156  */
157 typedef struct smb_time2 {
158 	uint32_t low_time;
159 	int32_t high_time;
160 } smb_time2_t;
161 
162 /*
163  * The number of seconds since Jan 1, 1970, 00:00:00.0.
164  */
165 typedef uint32_t smb_utime_t;
166 
167 #define	SMB_LM_NEGOTIATE_WORDCNT		13
168 #define	SMB_NT_NEGOTIATE_WORDCNT		17
169 
170 #define	SMB_NAME83_EXTLEN			3
171 #define	SMB_NAME83_BASELEN			8
172 #define	SMB_NAME83_LEN				12
173 
174 /* Share types */
175 #ifndef _SHARE_TYPES_DEFINED_
176 #define	_SHARE_TYPES_DEFINED_
177 #define	STYPE_DISKTREE			0x00000000
178 #define	STYPE_PRINTQ			0x00000001
179 #define	STYPE_DEVICE			0x00000002
180 #define	STYPE_IPC			0x00000003
181 #define	STYPE_MASK			0x0000000F
182 #define	STYPE_DFS			0x00000064
183 #define	STYPE_HIDDEN			0x80000000
184 #define	STYPE_SPECIAL			0x80000000
185 #endif /* _SHARE_TYPES_DEFINED_ */
186 
187 #define	STYPE_ISDSK(S)	(((S) & STYPE_MASK) == STYPE_DISKTREE)
188 #define	STYPE_ISPRN(S)	(((S) & STYPE_MASK) == STYPE_PRINTQ)
189 #define	STYPE_ISDEV(S)	(((S) & STYPE_MASK) == STYPE_DEVICE)
190 #define	STYPE_ISIPC(S)	(((S) & STYPE_MASK) == STYPE_IPC)
191 
192 /*
193  * NtCreateAndX and NtTransactCreate creation flags: defined in CIFS
194  * section 4.2.2
195  *
196  * Creation Flag Name         Value  Description
197  * ========================== ====== ==================================
198  * NT_CREATE_REQUEST_OPLOCK   0x02   Level I oplock requested
199  * NT_CREATE_REQUEST_OPBATCH  0x04   Batch oplock requested
200  * NT_CREATE_OPEN_TARGET_DIR  0x08   Target for open is a directory
201  */
202 #define	NT_CREATE_FLAG_REQUEST_OPLOCK		0x02
203 #define	NT_CREATE_FLAG_REQUEST_OPBATCH		0x04
204 #define	NT_CREATE_FLAG_OPEN_TARGET_DIR		0x08
205 #define	NT_CREATE_FLAG_EXTENDED_RESPONSE	0x10
206 
207 /*
208  * The option flags valid in the SMB nt_create_andx call are a subset of
209  * those defined in ntifs.h (ditto SMB nt_transact_create)
210  */
211 #define	SMB_NTCREATE_VALID_OPTIONS (FILE_VALID_OPTION_FLAGS & ~( \
212 	FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT |\
213 	FILE_RESERVE_OPFILTER))
214 
215 /*
216  * Define the filter flags for NtNotifyChangeDirectoryFile
217  */
218 #define	FILE_NOTIFY_CHANGE_FILE_NAME	0x00000001
219 #define	FILE_NOTIFY_CHANGE_DIR_NAME	0x00000002
220 #define	FILE_NOTIFY_CHANGE_NAME		0x00000003
221 #define	FILE_NOTIFY_CHANGE_ATTRIBUTES	0x00000004
222 #define	FILE_NOTIFY_CHANGE_SIZE		0x00000008
223 #define	FILE_NOTIFY_CHANGE_LAST_WRITE	0x00000010
224 #define	FILE_NOTIFY_CHANGE_LAST_ACCESS	0x00000020
225 #define	FILE_NOTIFY_CHANGE_CREATION	0x00000040
226 #define	FILE_NOTIFY_CHANGE_EA		0x00000080
227 #define	FILE_NOTIFY_CHANGE_SECURITY	0x00000100
228 #define	FILE_NOTIFY_CHANGE_STREAM_NAME	0x00000200
229 #define	FILE_NOTIFY_CHANGE_STREAM_SIZE	0x00000400
230 #define	FILE_NOTIFY_CHANGE_STREAM_WRITE	0x00000800
231 #define	FILE_NOTIFY_VALID_MASK		0x00000fff
232 
233 
234 /*
235  * Define the file action type codes for NtNotifyChangeDirectoryFile
236  */
237 #define	FILE_ACTION_ADDED		0x00000001
238 #define	FILE_ACTION_REMOVED		0x00000002
239 #define	FILE_ACTION_MODIFIED		0x00000003
240 #define	FILE_ACTION_RENAMED_OLD_NAME	0x00000004
241 #define	FILE_ACTION_RENAMED_NEW_NAME	0x00000005
242 #define	FILE_ACTION_ADDED_STREAM	0x00000006
243 #define	FILE_ACTION_REMOVED_STREAM	0x00000007
244 #define	FILE_ACTION_MODIFIED_STREAM	0x00000008
245 /* See also: FILE_ACTION_SUBDIR_CHANGED etc. */
246 
247 /* Lock type flags */
248 #define	LOCKING_ANDX_NORMAL_LOCK	0x00
249 #define	LOCKING_ANDX_SHARED_LOCK	0x01
250 #define	LOCKING_ANDX_OPLOCK_RELEASE	0x02
251 #define	LOCKING_ANDX_CHANGE_LOCK_TYPE	0x04
252 #define	LOCKING_ANDX_CANCEL_LOCK	0x08
253 #define	LOCKING_ANDX_LARGE_FILES	0x10
254 
255 #define	SMB_COM_CREATE_DIRECTORY	0x00
256 #define	SMB_COM_DELETE_DIRECTORY	0x01
257 #define	SMB_COM_OPEN			0x02
258 #define	SMB_COM_CREATE			0x03
259 #define	SMB_COM_CLOSE			0x04
260 #define	SMB_COM_FLUSH			0x05
261 #define	SMB_COM_DELETE			0x06
262 #define	SMB_COM_RENAME			0x07
263 #define	SMB_COM_QUERY_INFORMATION	0x08
264 #define	SMB_COM_SET_INFORMATION		0x09
265 #define	SMB_COM_READ			0x0A
266 #define	SMB_COM_WRITE			0x0B
267 #define	SMB_COM_LOCK_BYTE_RANGE		0x0C
268 #define	SMB_COM_UNLOCK_BYTE_RANGE	0x0D
269 #define	SMB_COM_CREATE_TEMPORARY	0x0E
270 #define	SMB_COM_CREATE_NEW		0x0F
271 #define	SMB_COM_CHECK_DIRECTORY		0x10
272 #define	SMB_COM_PROCESS_EXIT		0x11
273 #define	SMB_COM_SEEK			0x12
274 #define	SMB_COM_LOCK_AND_READ		0x13
275 #define	SMB_COM_WRITE_AND_UNLOCK	0x14
276 
277 #define	SMB_COM_READ_RAW		0x1A
278 #define	SMB_COM_READ_MPX		0x1B
279 #define	SMB_COM_READ_MPX_SECONDARY	0x1C
280 #define	SMB_COM_WRITE_RAW		0x1D
281 #define	SMB_COM_WRITE_MPX		0x1E
282 #define	SMB_COM_WRITE_MPX_SECONDARY	0x1F
283 #define	SMB_COM_WRITE_COMPLETE		0x20
284 
285 #define	SMB_COM_SET_INFORMATION2	0x22
286 #define	SMB_COM_QUERY_INFORMATION2	0x23
287 #define	SMB_COM_LOCKING_ANDX		0x24
288 #define	SMB_COM_TRANSACTION		0x25
289 #define	SMB_COM_TRANSACTION_SECONDARY	0x26
290 #define	SMB_COM_IOCTL			0x27
291 #define	SMB_COM_IOCTL_SECONDARY		0x28
292 #define	SMB_COM_COPY			0x29
293 #define	SMB_COM_MOVE			0x2A
294 #define	SMB_COM_ECHO			0x2B
295 #define	SMB_COM_WRITE_AND_CLOSE		0x2C
296 #define	SMB_COM_OPEN_ANDX		0x2D
297 #define	SMB_COM_READ_ANDX		0x2E
298 #define	SMB_COM_WRITE_ANDX		0x2F
299 
300 #define	SMB_COM_CLOSE_AND_TREE_DISC	0x31
301 #define	SMB_COM_TRANSACTION2		0x32
302 #define	SMB_COM_TRANSACTION2_SECONDARY	0x33
303 #define	SMB_COM_FIND_CLOSE2		0x34
304 #define	SMB_COM_FIND_NOTIFY_CLOSE	0x35
305 
306 #define	SMB_COM_TREE_CONNECT		0x70
307 #define	SMB_COM_TREE_DISCONNECT		0x71
308 #define	SMB_COM_NEGOTIATE		0x72
309 #define	SMB_COM_SESSION_SETUP_ANDX	0x73
310 #define	SMB_COM_LOGOFF_ANDX		0x74
311 #define	SMB_COM_TREE_CONNECT_ANDX	0x75
312 
313 #define	SMB_COM_QUERY_INFORMATION_DISK	0x80
314 #define	SMB_COM_SEARCH			0x81
315 #define	SMB_COM_FIND			0x82
316 #define	SMB_COM_FIND_UNIQUE		0x83
317 #define	SMB_COM_FIND_CLOSE		0x84
318 
319 #define	SMB_COM_NT_TRANSACT		0xA0
320 #define	SMB_COM_NT_TRANSACT_SECONDARY	0xA1
321 #define	SMB_COM_NT_CREATE_ANDX		0xA2
322 #define	SMB_COM_NT_CANCEL		0xA4
323 
324 #define	SMB_COM_OPEN_PRINT_FILE		0xC0
325 #define	SMB_COM_WRITE_PRINT_FILE	0xC1
326 #define	SMB_COM_CLOSE_PRINT_FILE	0xC2
327 #define	SMB_COM_GET_PRINT_QUEUE		0xC3
328 
329 #define	SMB_COM_NUM			0x100
330 
331 /*
332  * Flags field of the SMB header. The names in parenthesis represent
333  * alternative names for the flags.
334  *
335  * SMB_FLAGS_LOCK_AND_READ_OK     If the server supports LockAndRead and
336  * (SMB_FLAGS_LOCKS_SUBDIALECT)   WriteAndUnlock, it sets this bit in the
337  *                                Negotiate response.
338  *
339  * SMB_FLAGS_SEND_NO_ACK          When on, the client guarantees that there
340  * (SMB_FLAGS_RCV_BUF_POSTED)     is a receive buffer posted such that a
341  *                                "Send-No-Ack" can be used by the server
342  *                                to respond to the client's request.
343  *
344  * SMB_FLAGS_CASE_INSENSITIVE     This is part of the Flags field of every
345  *                                SMB header. If this bit is set, then all
346  *                                pathnames in the SMB should be treated as
347  *                                case-insensitive. Otherwise pathnames are
348  *                                case-sensitive.
349  *
350  * SMB_FLAGS_CANONICALIZED_PATHS  When on in SessionSetupX, this indicates
351  *                                that all paths sent to the server are
352  *                                already in OS/2 canonicalized format.
353  *
354  * OS/2 canonical format means that file/directory names are in upper case,
355  * are valid characters, . and .. have been removed and single backslashes
356  * are used as separators.
357  *
358  * SMB_FLAGS_OPLOCK               When set in an open file request SMBs
359  *                                (Open, Create, OpenX, etc.) this bit
360  *                                indicates a request for an oplock on the
361  *                                file. When set in the response, this bit
362  *                                indicates that the oplock was granted.
363  *
364  * SMB_FLAGS_OPLOCK_NOTIFY_ANY    When on, this bit indicates that the server
365  *                                should notify the client on any request
366  *                                that could cause the file to be changed.
367  *                                If not set, the server only notifies the
368  *                                client on other open requests on the file.
369  *                                This bit is only relevant when
370  *                                SMB_FLAGS_OPLOCK is set.
371  *
372  * SMB_FLAGS_SERVER_TO_REDIR      This bit indicates that the SMB is being
373  * (SMB_FLAGS_REPLY)              sent from server to (client) redirector.
374  */
375 #define	SMB_FLAGS_LOCK_AND_READ_OK	0x01
376 #define	SMB_FLAGS_SEND_NO_ACK		0x02
377 #define	SMB_FLAGS_RESERVED		0x04
378 #define	SMB_FLAGS_CASE_INSENSITIVE	0x08
379 #define	SMB_FLAGS_CANONICALIZED_PATHS	0x10
380 #define	SMB_FLAGS_OPLOCK		0x20
381 #define	SMB_FLAGS_OPLOCK_NOTIFY_ANY	0x40
382 #define	SMB_FLAGS_REPLY			0x80
383 
384 
385 /*
386  * Flags2 field of the SMB header.
387  *
388  * SMB_FLAGS2_READ_IF_EXECUTE is also known as SMB_FLAGS2_PAGING_IO
389  */
390 #define	SMB_FLAGS2_KNOWS_LONG_NAMES		0x0001
391 #define	SMB_FLAGS2_KNOWS_EAS			0x0002
392 #define	SMB_FLAGS2_SMB_SECURITY_SIGNATURE	0x0004
393 #define	SMB_FLAGS2_IS_LONG_NAME			0x0040
394 #define	SMB_FLAGS2_REPARSE_PATH			0x0400
395 #define	SMB_FLAGS2_EXT_SEC			0x0800
396 #define	SMB_FLAGS2_DFS				0x1000
397 #define	SMB_FLAGS2_READ_IF_EXECUTE		0x2000
398 #define	SMB_FLAGS2_NT_STATUS			0x4000
399 #define	SMB_FLAGS2_UNICODE			0x8000
400 
401 #define	DIALECT_UNKNOWN		 0
402 #define	PC_NETWORK_PROGRAM_1_0	 1  /* The original MSNET SMB protocol */
403 #define	PCLAN1_0		 2  /* Some versions of the original MSNET */
404 #define	MICROSOFT_NETWORKS_1_03	 3  /* This is used for the MS-NET 1.03 */
405 #define	MICROSOFT_NETWORKS_3_0	 4  /* This is the  DOS LANMAN 1.0 specific */
406 #define	LANMAN1_0		 5  /* This is the first version of the full */
407 #define	LM1_2X002		 6  /* This is the first version of the full */
408 #define	DOS_LM1_2X002		 7  /* This is the dos equivalent of the */
409 #define	DOS_LANMAN2_1		 8  /* DOS LANMAN2.1 */
410 #define	LANMAN2_1		 9  /* OS/2 LANMAN2.1 */
411 #define	Windows_for_Workgroups_3_1a 10 /* Windows for Workgroups Version 1.0 */
412 #define	NT_LM_0_12		11  /* The SMB protocol designed for NT */
413 #define	DIALECT_SMB2002		12  /* SMB 2.002 (switch to SMB2) */
414 #define	DIALECT_SMB2XXX		13  /* SMB 2.??? (switch to SMB2) */
415 
416 /*
417  * SMB_TREE_CONNECT_ANDX  request flags
418  *
419  * The tree specified by TID in the SMB header
420  * should be disconnected - disconnect errors
421  * should be ignored.
422  */
423 #define	SMB_TCONX_DISCONECT_TID		0x0001
424 /*
425  * Client request for signing key protection.
426  */
427 #define	SMB_TCONX_EXTENDED_SIGNATURES	0x0004
428 /*
429  * Client request for extended information.
430  */
431 #define	SMB_TCONX_EXTENDED_RESPONSE	0x0008
432 
433 /*
434  * SMB_TREE_CONNECT_ANDX OptionalSupport flags
435  *
436  * SMB_SUPPORT_SEARCH_BITS    The server supports SearchAttributes.
437  * SMB_SHARE_IS_IN_DFS        The share is managed by DFS.
438  * SMB_CSC_MASK               Offline-caching mask - see CSC values.
439  * SMB_UNIQUE_FILE_NAME       The server uses long names and does not support
440  *                            short names.  This indicates to clients that
441  *                            they may perform directory name-space caching.
442  * SMB_EXTENDED_SIGNATURES    The server will use signing key protection.
443  *
444  * SMB_CSC_CACHE_MANUAL_REINT Clients are allowed to cache files for offline
445  *                            use as requested by users but automatic
446  *                            file-by-file reintegration is not allowed.
447  * SMB_CSC_CACHE_AUTO_REINT   Clients are allowed to automatically cache
448  *                            files for offline use and file-by-file
449  *                            reintegration is allowed.
450  * SMB_CSC_CACHE_VDO          Clients are allowed to automatically cache files
451  *                            for offline use, file-by-file reintegration is
452  *                            allowed and clients are permitted to work from
453  *                            their local cache even while offline.
454  * SMB_CSC_CACHE_NONE         Client-side caching is disabled for this share.
455  *
456  * SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM
457  *			      The server will filter directory entries based
458  *			      on the access permissions of the client.
459  */
460 #define	SMB_SUPPORT_SEARCH_BITS		0x0001
461 #define	SMB_SHARE_IS_IN_DFS		0x0002
462 #define	SMB_CSC_MASK			0x000C
463 #define	SMB_UNIQUE_FILE_NAME		0x0010
464 #define	SMB_EXTENDED_SIGNATURES		0x0020
465 
466 #define	SMB_CSC_CACHE_MANUAL_REINT	0x0000
467 #define	SMB_CSC_CACHE_AUTO_REINT	0x0004
468 #define	SMB_CSC_CACHE_VDO		0x0008
469 #define	SMB_CSC_CACHE_NONE		0x000C
470 
471 #define	SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM	0x0800
472 #define	SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING		0x0400
473 
474 /*
475  * The subcommand codes, placed in SETUP[0], for named pipe operations are:
476  * SubCommand Code	Value Description
477  * ===================	===== =========================================
478  */
479 
480 #define	CallNamedPipe	0x54	/* open/write/read/close pipe */
481 #define	WaitNamedPipe	0x53	/* wait for pipe to be nonbusy */
482 #define	PeekNmPipe	0x23	/* read but don't remove data */
483 #define	QNmPHandState	0x21	/* query pipe handle modes */
484 #define	SetNmPHandState	0x01	/* set pipe handle modes */
485 #define	QNmPipeInfo	0x22	/* query pipe attributes */
486 #define	TransactNmPipe	0x26	/* write/read operation on pipe */
487 #define	RawReadNmPipe	0x11	/* read pipe in "raw" (non message mode) */
488 #define	RawWriteNmPipe	0x31	/* write pipe "raw" (non message mode) */
489 
490 
491 
492 /*
493  * Setup[0] Transaction2       Value  Description
494  * Subcommand Code
495  * ==========================  =====  =============================
496  */
497 
498 #define	TRANS2_OPEN2		0x00	/* Create file, extended attributes */
499 #define	TRANS2_FIND_FIRST2	0x01	/* Begin search for files */
500 #define	TRANS2_FIND_NEXT2	0x02	/* Resume search for files */
501 #define	TRANS2_QUERY_FS_INFORMATION 0x03 /* Get file system information */
502 #define	TRANS2_SET_FS_INFORMATION	0x04	/* Set file system info. */
503 #define	TRANS2_QUERY_PATH_INFORMATION 0x05 /* Get info, named file or dir */
504 #define	TRANS2_SET_PATH_INFORMATION 0x06 /* Set info, named file or dir */
505 #define	TRANS2_QUERY_FILE_INFORMATION 0x07 /* Get info, handle */
506 #define	TRANS2_SET_FILE_INFORMATION 0x08 /* Set info, handle */
507 #define	TRANS2_FSCTL		0x09	/* Not implemented by NT server */
508 #define	TRANS2_IOCTL2		0x0A	/* Not implemented by NT server */
509 #define	TRANS2_FIND_NOTIFY_FIRST 0x0B	/* Not implemented by NT server */
510 #define	TRANS2_FIND_NOTIFY_NEXT 0x0C	/* Not implemented by NT server */
511 #define	TRANS2_CREATE_DIRECTORY 0x0D	/* Create dir, extended attributes */
512 #define	TRANS2_SESSION_SETUP	0x0E	/* Session setup, extended security */
513 #define	TRANS2_GET_DFS_REFERRAL	0x10	/* Get a Dfs referral */
514 #define	TRANS2_REPORT_DFS_INCONSISTENCY 0x11 /* Report a Dfs inconsistency */
515 
516 /*
517  * Access Mode Encoding (CIFS/1.0 1996 Section 3.8).
518  *
519  * The desired access mode passed in SmbOpen and SmbOpenAndX has the following
520  * mapping:
521  *
522  *    1111 11
523  *    5432 1098 7654 3210
524  *    rWrC rLLL rSSS rAAA
525  *
526  * where:
527  *
528  *    W - Write through mode.  No read ahead or write behind allowed on
529  *        this file or device.  When protocol is returned, data is expected
530  *        to be on the disk or device.
531  *
532  *    S - Sharing mode:
533  *        0 - Compatibility mode (as in core open)
534  *        1 - Deny read/write/execute (exclusive)
535  *        2 - Deny write
536  *        3 - Deny read/execute
537  *        4 - Deny none
538  *
539  *    A - Access mode
540  *        0 - Open for reading
541  *        1 - Open for writing
542  *        2 - Open for reading and writing
543  *        3 - Open for execute
544  *
545  *    rSSSrAAA = 11111111 (hex FF) indicates FCB open (as in core protocol)
546  *
547  *    C - Cache mode
548  *        0 - Normal file
549  *        1 - Do not cache this file
550  *
551  *    L - Locality of reference
552  *        0 - Locality of reference is unknown
553  *        1 - Mainly sequential access
554  *        2 - Mainly random access
555  *        3 - Random access with some locality
556  *        4 to 7 - Currently undefined
557  */
558 
559 
560 #define	SMB_DA_SHARE_MASK		0x70
561 #define	SMB_DA_ACCESS_MASK		0x07
562 #define	SMB_DA_FCB_MASK			(UCHAR)0xFF
563 
564 #define	SMB_DA_ACCESS_READ		0x00
565 #define	SMB_DA_ACCESS_WRITE		0x01
566 #define	SMB_DA_ACCESS_READ_WRITE	0x02
567 #define	SMB_DA_ACCESS_EXECUTE		0x03
568 
569 #define	SMB_DA_SHARE_COMPATIBILITY	0x00
570 #define	SMB_DA_SHARE_EXCLUSIVE		0x10
571 #define	SMB_DA_SHARE_DENY_WRITE		0x20
572 #define	SMB_DA_SHARE_DENY_READ		0x30
573 #define	SMB_DA_SHARE_DENY_NONE		0x40
574 
575 #define	SMB_DA_FCB			(UCHAR)0xFF
576 
577 #define	SMB_CACHE_NORMAL		0x0000
578 #define	SMB_DO_NOT_CACHE		0x1000
579 
580 #define	SMB_LR_UNKNOWN			0x0000
581 #define	SMB_LR_SEQUENTIAL		0x0100
582 #define	SMB_LR_RANDOM			0x0200
583 #define	SMB_LR_RANDOM_WITH_LOCALITY	0x0300
584 #define	SMB_LR_MASK			0x0F00
585 
586 #define	SMB_DA_WRITE_THROUGH		0x4000
587 
588 /*
589  * Macros used for share reservation rule checking
590  */
591 
592 #define	SMB_DENY_READ(share_access) ((share_access & FILE_SHARE_READ) == 0)
593 
594 #define	SMB_DENY_WRITE(share_access) ((share_access & FILE_SHARE_WRITE) == 0)
595 
596 #define	SMB_DENY_DELETE(share_access) ((share_access & FILE_SHARE_DELETE) == 0)
597 
598 #define	SMB_DENY_RW(share_access) \
599 	((share_access & (FILE_SHARE_READ | FILE_SHARE_WRITE)) == 0)
600 
601 #define	SMB_DENY_ALL(share_access) (share_access == 0)
602 
603 #define	SMB_DENY_NONE(share_access) (share_access == FILE_SHARE_ALL)
604 
605 /*
606  * The SMB open function determines what action should be taken depending
607  * on the existence or lack thereof of files used in the operation.  It
608  * has the following mapping:
609  *
610  *    1111 1
611  *    5432 1098 7654 3210
612  *    rrrr rrrr rrrC rrOO
613  *
614  * where:
615  *
616  *    O - Open (action to be taken if the target file exists)
617  *        0 - Fail
618  *        1 - Open or Append file
619  *        2 - Truncate file
620  *
621  *    C - Create (action to be taken if the target file does not exist)
622  *        0 - Fail
623  *        1 - Create file
624  */
625 
626 #define	SMB_OFUN_OPEN_MASK		0x3
627 #define	SMB_OFUN_CREATE_MASK		0x10
628 
629 #define	SMB_OFUN_OPEN_FAIL		0
630 #define	SMB_OFUN_OPEN_APPEND		1
631 #define	SMB_OFUN_OPEN_OPEN		1
632 #define	SMB_OFUN_OPEN_TRUNCATE		2
633 
634 #define	SMB_OFUN_CREATE_FAIL		0x00
635 #define	SMB_OFUN_CREATE_CREATE		0x10
636 
637 /*
638  * The Action field of OpenAndX has the following format:
639  *
640  *    1111 11
641  *    5432 1098 7654 3210
642  *    Lrrr rrrr rrrr rrOO
643  *
644  * where:
645  *
646  *    L - Opportunistic lock.  1 if lock granted, else 0.
647  *
648  *    O - Open action:
649  *        1 - The file existed and was opened
650  *        2 - The file did not exist but was created
651  *        3 - The file existed and was truncated
652  */
653 
654 #define	SMB_OACT_OPENED			0x01
655 #define	SMB_OACT_CREATED		0x02
656 #define	SMB_OACT_TRUNCATED		0x03
657 #define	SMB_OACT_OPLOCK			0x8000
658 
659 #define	SMB_FTYPE_DISK			0
660 #define	SMB_FTYPE_BYTE_PIPE		1
661 #define	SMB_FTYPE_MESG_PIPE		2
662 #define	SMB_FTYPE_PRINTER		3
663 #define	SMB_FTYPE_UNKNOWN		0xFFFF
664 
665 #define	SMB_DEVST_BLOCKING		0x8000
666 #define	SMB_DEVST_ENDPOINT		0x4000
667 #define	SMB_DEVST_TYPE_MASK		0x0C00
668 #define	SMB_DEVST_TYPE_BYTE_PIPE	0x0000
669 #define	SMB_DEVST_TYPE_MESG_PIPE	0x0400
670 #define	SMB_DEVST_RMODE_MASK		0x0300
671 #define	SMB_DEVST_RMODE_BYTES		0x0000
672 #define	SMB_DEVST_RMODE_MESGS		0x0100
673 #define	SMB_DEVST_ICOUNT_MASK		0x00FF		/* not used */
674 
675 #define	SMB_FTYPE_IS_DISK(F)		((F) == SMB_FTYPE_DISK)
676 #define	SMB_FTYPE_IS_PIPE(F) \
677 	(((F) == SMB_FTYPE_BYTE_PIPE) || ((F) == SMB_FTYPE_MESG_PIPE))
678 #define	SMB_FTYPE_IS_PRINTER(F)		((F) == SMB_FTYPE_PRINTER)
679 
680 /*
681  * TRANS2_FIND
682  */
683 #define	SMB_FIND_FILE_DIRECTORY_INFO		0x101
684 #define	SMB_FIND_FILE_FULL_DIRECTORY_INFO	0x102
685 #define	SMB_FIND_FILE_NAMES_INFO		0x103
686 #define	SMB_FIND_FILE_BOTH_DIRECTORY_INFO	0x104
687 #define	SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO	0x105
688 #define	SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO	0x106
689 #define	SMB_MAC_FIND_BOTH_HFS_INFO		MAC_FIND_BOTH_HFS_INFO
690 
691 
692 /*
693  * Flags for TRANS2_FIND_FIRST2 and TRANS2_FIND_NEXT2 (NTDDK).
694  *
695  * If SMB_FIND_RETURN_RESUME_KEYS was set in the request parameters,
696  * each entry is preceded by a four-byte resume key.
697  */
698 #define	SMB_FIND_CLOSE_AFTER_REQUEST	0x01
699 #define	SMB_FIND_CLOSE_AT_EOS		0x02
700 #define	SMB_FIND_RETURN_RESUME_KEYS	0x04
701 #define	SMB_FIND_CONTINUE_FROM_LAST	0x08
702 #define	SMB_FIND_WITH_BACKUP_INTENT	0x10
703 
704 
705 /*
706  * TRANS2_QUERY_FS_INFORMATION
707  *
708  * SMB_QUERY_FS_QUOTA_INFO, SMB_QUERY_FS_CONTROL_INFO are not used in Windows
709  * NT, and are not used in any post NT Windows operating systems. If a server
710  * receives these information levels from a client, it should handle them as
711  * invalid information levels.
712  */
713 #define	SMB_INFO_ALLOCATION		1
714 #define	SMB_INFO_VOLUME			2
715 #define	SMB_QUERY_FS_LABEL_INFO		0x101
716 #define	SMB_QUERY_FS_VOLUME_INFO	0x102
717 #define	SMB_QUERY_FS_SIZE_INFO		0x103
718 #define	SMB_QUERY_FS_DEVICE_INFO	0x104
719 #define	SMB_QUERY_FS_ATTRIBUTE_INFO	0x105
720 #define	SMB_QUERY_FS_QUOTA_INFO		0x106
721 #define	SMB_QUERY_FS_CONTROL_INFO	0x107
722 
723 #define	SMB_MAC_QUERY_FS_INFO		MAC_QUERY_FS_INFO
724 
725 /*
726  * Internal use only.
727  * Define information levels to represent the following requests:
728  *    smb_query_information
729  *    smb_query_information2
730  *    smb_set_information
731  *    smb_set_information2
732  */
733 #define	SMB_QUERY_INFORMATION	0x3001
734 #define	SMB_QUERY_INFORMATION2	0x3002
735 #define	SMB_SET_INFORMATION	0x3001
736 #define	SMB_SET_INFORMATION2	0x3002
737 
738 /* TRANS2_QUERY_{PATH,FILE}_INFORMATION */
739 #define	SMB_INFO_STANDARD		 1	/* query, set */
740 #define	SMB_INFO_QUERY_EA_SIZE		 2	/* query */
741 #define	SMB_INFO_SET_EAS		 2	/* set */
742 #define	SMB_INFO_QUERY_EAS_FROM_LIST	 3	/* query */
743 #define	SMB_INFO_QUERY_ALL_EAS		 4	/* query */
744 #define	SMB_INFO_QUERY_FULL_NAME	 5	/* unused */
745 #define	SMB_INFO_IS_NAME_VALID		 6	/* query */
746 
747 #define	SMB_QUERY_FILE_BASIC_INFO	 0x101
748 #define	SMB_QUERY_FILE_STANDARD_INFO	 0x102
749 #define	SMB_QUERY_FILE_EA_INFO		 0x103
750 #define	SMB_QUERY_FILE_NAME_INFO	 0x104
751 #define	SMB_QUERY_FILE_ALLOCATION_INFO	 0x105	/* unused */
752 #define	SMB_QUERY_FILE_END_OF_FILE_INFO	 0x106	/* unused */
753 #define	SMB_QUERY_FILE_ALL_INFO		 0x107
754 #define	SMB_QUERY_FILE_ALT_NAME_INFO	 0x108
755 #define	SMB_QUERY_FILE_STREAM_INFO	 0x109
756 #define	SMB_QUERY_FILE_COMPRESSION_INFO	 0x10B
757 
758 #define	SMB_MAC_SET_FINDER_INFO		MAC_SET_FINDER_INFO
759 #define	SMB_MAC_DT_ADD_APPL		MAC_DT_ADD_APPL
760 #define	SMB_MAC_DT_REMOVE_APPL		MAC_DT_REMOVE_APPL
761 #define	SMB_MAC_DT_GET_APPL		MAC_DT_GET_APPL
762 #define	SMB_MAC_DT_GET_ICON		MAC_DT_GET_ICON
763 #define	SMB_MAC_DT_GET_ICON_INFO	MAC_DT_GET_ICON_INFO
764 #define	SMB_MAC_DT_ADD_ICON		MAC_DT_ADD_ICON
765 
766 #define	SMB_SET_FILE_BASIC_INFO		0x101
767 #define	SMB_SET_FILE_DISPOSITION_INFO	0x102
768 #define	SMB_SET_FILE_ALLOCATION_INFO	0x103
769 #define	SMB_SET_FILE_END_OF_FILE_INFO	0x104
770 
771 
772 /* NT passthrough levels - see ntifs.h FILE_INFORMATION_CLASS */
773 #define	SMB_FILE_BASIC_INFORMATION		1004
774 #define	SMB_FILE_STANDARD_INFORMATION		1005
775 #define	SMB_FILE_INTERNAL_INFORMATION		1006
776 #define	SMB_FILE_EA_INFORMATION			1007
777 #define	SMB_FILE_ACCESS_INFORMATION		1008
778 #define	SMB_FILE_NAME_INFORMATION		1009
779 #define	SMB_FILE_RENAME_INFORMATION		1010
780 #define	SMB_FILE_LINK_INFORMATION		1011
781 #define	SMB_FILE_DISPOSITION_INFORMATION	1013
782 #define	SMB_FILE_ALL_INFORMATION		1018
783 #define	SMB_FILE_ALLOCATION_INFORMATION		1019
784 #define	SMB_FILE_END_OF_FILE_INFORMATION	1020
785 #define	SMB_FILE_ALT_NAME_INFORMATION		1021
786 #define	SMB_FILE_STREAM_INFORMATION		1022
787 #define	SMB_FILE_COMPRESSION_INFORMATION	1028
788 #define	SMB_FILE_NETWORK_OPEN_INFORMATION	1034
789 #define	SMB_FILE_ATTR_TAG_INFORMATION		1035
790 
791 /* NT passthrough levels - see ntifs.h FILE_FS_INFORMATION_CLASS */
792 #define	SMB_FILE_FS_VOLUME_INFORMATION		1001
793 #define	SMB_FILE_FS_LABEL_INFORMATION		1002
794 #define	SMB_FILE_FS_SIZE_INFORMATION		1003
795 #define	SMB_FILE_FS_DEVICE_INFORMATION		1004
796 #define	SMB_FILE_FS_ATTRIBUTE_INFORMATION	1005
797 #define	SMB_FILE_FS_CONTROL_INFORMATION		1006
798 #define	SMB_FILE_FS_FULLSIZE_INFORMATION	1007
799 #define	SMB_FILE_FS_OBJECTID_INFORMATION	1008
800 #define	SMB_FILE_FS_DRIVERPATH_INFORMATION	1009
801 
802 /*
803  * The following bits may be set in the SecurityMode field of the
804  * SMB_COM_NEGOTIATE response.
805  *
806  * Note: Same as the NTDDK definitions.
807  */
808 #define	NEGOTIATE_USER_SECURITY				0x01
809 #define	NEGOTIATE_ENCRYPT_PASSWORDS			0x02
810 #define	NEGOTIATE_SECURITY_SIGNATURES_ENABLED		0x04
811 #define	NEGOTIATE_SECURITY_SIGNATURES_REQUIRED		0x08
812 
813 
814 /*
815  * Negotiated Capabilities (CIFS/1.0 section 4.1.1)
816  *
817  * Capabilities allow the server to tell the client what it supports.
818  * Undefined bits MUST be set to zero by servers, and MUST be ignored
819  * by clients. The bit definitions are:
820  *
821  * Capability Name	 Encoding   Meaning
822  * ====================	 ========   ==================================
823  * CAP_RAW_MODE		 0x0001	    The server supports SMB_COM_READ_RAW and
824  *				    SMB_COM_WRITE_RAW (obsolescent)
825  * CAP_MPX_MODE		 0x0002	    The server supports SMB_COM_READ_MPX and
826  *				    SMB_COM_WRITE_MPX (obsolescent)
827  * CAP_UNICODE		 0x0004	    The server supports Unicode strings
828  * CAP_LARGE_FILES	 0x0008	    The server supports large files with 64
829  *				    bit offsets
830  * CAP_NT_SMBS		 0x0010	    The server supports the SMBs particular
831  *				    to the NT LM 0.12 dialect.
832  *				    Implies CAP_NT_FIND.
833  * CAP_RPC_REMOTE_APIS	 0x0020	    The server supports remote admin API
834  *				    requests via DCE RPC
835  * CAP_STATUS32		 0x0040	    The server can respond with 32 bit
836  *				    status codes in Status.Status
837  * CAP_LEVEL_II_OPLOCKS	 0x0080	    The server supports level 2 oplocks
838  * CAP_LOCK_AND_READ	 0x0100	    The server supports the
839  *				    SMB_COM_LOCK_AND_READ SMB
840  * CAP_NT_FIND		 0x0200
841  * CAP_BULK_TRANSFER	 0x0400
842  * CAP_COMPRESSED_BULK	 0x0800
843  * CAP_DFS		 0x1000	    The server is DFS aware
844  * CAP_INFOLEVEL_PASSTHRU 0x2000    The server supports passthru information
845  *				    level processing capability.
846  * CAP_LARGE_READX	 0x4000	    The server supports large
847  *				    SMB_COM_READ_ANDX
848  * CAP_LARGE_WRITEX	 0x8000	    The server supports large
849  *				    SMB_COM_WRITE_ANDX
850  * CAP_RESERVED		 0x02000000 Reserved for future use.
851  * CAP_EXTENDED_SECURITY 0x80000000 The server supports extended security
852  *				    exchanges.
853  *
854  * Extended security exchanges provides a means of supporting arbitrary
855  * authentication protocols within CIFS. Security blobs are opaque to the
856  * CIFS protocol; they are messages in some authentication protocol that
857  * has been agreed upon by client and server by some out of band mechanism,
858  * for which CIFS merely functions as a transport. When
859  * CAP_EXTENDED_SECURITY is negotiated, the server includes a first
860  * security blob in its response; subsequent security blobs are exchanged
861  * in SMB_COM_SESSION_SETUP_ANDX requests and responses until the
862  * authentication protocol terminates.
863  */
864 #define	CAP_RAW_MODE			0x0001
865 #define	CAP_MPX_MODE			0x0002
866 #define	CAP_UNICODE			0x0004
867 #define	CAP_LARGE_FILES			0x0008
868 #define	CAP_NT_SMBS			0x0010
869 #define	CAP_RPC_REMOTE_APIS		0x0020
870 #define	CAP_STATUS32			0x0040
871 #define	CAP_LEVEL_II_OPLOCKS		0x0080
872 #define	CAP_LOCK_AND_READ		0x0100
873 #define	CAP_NT_FIND			0x0200
874 #define	CAP_BULK_TRANSFER		0x0400
875 #define	CAP_COMPRESSED_BULK		0x0800
876 #define	CAP_DFS				0x1000
877 #define	CAP_INFOLEVEL_PASSTHRU		0x2000
878 #define	CAP_LARGE_READX			0x4000
879 #define	CAP_LARGE_WRITEX		0x8000
880 #define	CAP_RESERVED			0x02000000
881 #define	CAP_EXTENDED_SECURITY		0x80000000
882 
883 
884 /*
885  * Different device types according to NT
886  */
887 #define	FILE_DEVICE_BEEP		0x00000001
888 #define	FILE_DEVICE_CD_ROM		0x00000002
889 #define	FILE_DEVICE_CD_ROM_FILE_SYSTEM	0x00000003
890 #define	FILE_DEVICE_CONTROLLER		0x00000004
891 #define	FILE_DEVICE_DATALINK		0x00000005
892 #define	FILE_DEVICE_DFS			0x00000006
893 #define	FILE_DEVICE_DISK		0x00000007
894 #define	FILE_DEVICE_DISK_FILE_SYSTEM	0x00000008
895 #define	FILE_DEVICE_FILE_SYSTEM		0x00000009
896 #define	FILE_DEVICE_INPORT_PORT		0x0000000a
897 #define	FILE_DEVICE_KEYBOARD		0x0000000b
898 #define	FILE_DEVICE_MAILSLOT		0x0000000c
899 #define	FILE_DEVICE_MIDI_IN		0x0000000d
900 #define	FILE_DEVICE_MIDI_OUT		0x0000000e
901 #define	FILE_DEVICE_MOUSE		0x0000000f
902 #define	FILE_DEVICE_MULTI_UNC_PROVIDER	0x00000010
903 #define	FILE_DEVICE_NAMED_PIPE		0x00000011
904 #define	FILE_DEVICE_NETWORK		0x00000012
905 #define	FILE_DEVICE_NETWORK_BROWSER	0x00000013
906 #define	FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
907 #define	FILE_DEVICE_NULL		0x00000015
908 #define	FILE_DEVICE_PARALLEL_PORT	0x00000016
909 #define	FILE_DEVICE_PHYSICAL_NETCARD	0x00000017
910 #define	FILE_DEVICE_PRINTER		0x00000018
911 #define	FILE_DEVICE_SCANNER		0x00000019
912 #define	FILE_DEVICE_SERIAL_MOUSE_PORT	0x0000001a
913 #define	FILE_DEVICE_SERIAL_PORT		0x0000001b
914 #define	FILE_DEVICE_SCREEN		0x0000001c
915 #define	FILE_DEVICE_SOUND		0x0000001d
916 #define	FILE_DEVICE_STREAMS		0x0000001e
917 #define	FILE_DEVICE_TAPE		0x0000001f
918 #define	FILE_DEVICE_TAPE_FILE_SYSTEM	0x00000020
919 #define	FILE_DEVICE_TRANSPORT		0x00000021
920 #define	FILE_DEVICE_UNKNOWN		0x00000022
921 #define	FILE_DEVICE_VIDEO		0x00000023
922 #define	FILE_DEVICE_VIRTUAL_DISK	0x00000024
923 #define	FILE_DEVICE_WAVE_IN		0x00000025
924 #define	FILE_DEVICE_WAVE_OUT		0x00000026
925 #define	FILE_DEVICE_8042_PORT		0x00000027
926 #define	FILE_DEVICE_NETWORK_REDIRECTOR	0x00000028
927 #define	FILE_DEVICE_BATTERY		0x00000029
928 #define	FILE_DEVICE_BUS_EXTENDER	0x0000002a
929 #define	FILE_DEVICE_MODEM		0x0000002b
930 #define	FILE_DEVICE_VDM			0x0000002c
931 
932 /*
933  * Some of these device types are not currently accessible over the network
934  * and may never be accessible over the network. Some may change to be
935  *
936  * accessible over the network. The values for device types that may never
937  * be accessible over the network may be redefined to be just reserved at
938  * some date in the future.
939  *
940  * Characteristics is the sum of any of the following:
941  */
942 
943 #define	FILE_REMOVABLE_MEDIA		0x00000001
944 #define	FILE_READ_ONLY_DEVICE		0x00000002
945 #define	FILE_FLOPPY_DISKETTE		0x00000004
946 #define	FILE_WRITE_ONE_MEDIA		0x00000008
947 #define	FILE_REMOTE_DEVICE		0x00000010
948 #define	FILE_DEVICE_IS_MOUNTED		0x00000020
949 #define	FILE_VIRTUAL_VOLUME		0x00000040
950 
951 /*
952  * File System Control Flags for smb_com_trans2_query|set_fs_information
953  * level SMB_FILE_FS_CONTROL_INFORMATION
954  */
955 #define	FILE_VC_QUOTA_TRACK		0x00000001
956 #define	FILE_VC_QUOTA_ENFORCE		0x00000002
957 #define	FILE_VC_CONTENT_INDEX_DISABLED	0x00000008
958 #define	FILE_VC_LOG_QUOTA_THRESHOLD	0x00000010
959 #define	FILE_VC_LOG_QUOTA_LIMIT		0x00000020
960 #define	FILE_VC_LOG_VOLUME_THRESHOLD	0x00000040
961 #define	FILE_VC_LOG_VOLUME_LIMIT	0x00000080
962 #define	FILE_VC_QUOTAS_INCOMPLETE	0x00000100
963 #define	FILE_VC_QUOTAS_REBUILDING	0x00000200
964 
965 /*
966  * CREATE_ANDX ShareAccess Flags
967  */
968 
969 #define	FILE_SHARE_NONE			0x00000000
970 #define	FILE_SHARE_READ			0x00000001
971 #define	FILE_SHARE_WRITE		0x00000002
972 #define	FILE_SHARE_DELETE		0x00000004
973 #define	FILE_SHARE_ALL			0x00000007
974 #define	FILE_SHARE_VALID_FLAGS		0x00000007
975 
976 
977 /*
978  * CREATE_ANDX CreateDisposition flags
979  *
980  * FILE_SUPERSEDE     If the file already exists it should be superseded
981  *		      by the specified file. If the file does not already
982  *		      exist then it should be created.
983  *
984  * FILE_CREATE	      If the file already exists the operation should fail.
985  *		      If the file does not already exist then it should be
986  *		      created. (aka CREATE_NEW)
987  *
988  * FILE_OPEN	      If the file already exists then it should be opened.
989  *		      If the file does not already exist then the operation
990  *		      should fail. (aka OPEN_EXISTING)
991  *
992  * FILE_OPEN_IF	      If the file already exists then it should be opened.
993  *		      If the file does not already exist then it should be
994  *		      created. (aka OPEN_ALWAYS)
995  *
996  * FILE_OVERWRITE     If the file already exists, it should be opened and
997  *		      overwritten. If the file does not already exist then
998  *		      the operation should fail. (aka TRUNCATE_EXISTING)
999  *
1000  * FILE_OVERWRITE_IF  If the file already exists, it should be opened and
1001  *		      overwritten. If the file does not already exist then
1002  *		      it should be created. (aka CREATE_ALWAYS)
1003  */
1004 #define	FILE_SUPERSEDE			0x00000000
1005 #define	FILE_OPEN			0x00000001
1006 #define	FILE_CREATE			0x00000002
1007 #define	FILE_OPEN_IF			0x00000003
1008 #define	FILE_OVERWRITE			0x00000004
1009 #define	FILE_OVERWRITE_IF		0x00000005
1010 #define	FILE_MAXIMUM_DISPOSITION	0x00000005
1011 
1012 /*
1013  * CREATE_ANDX Impersonation levels
1014  */
1015 
1016 #define	SECURITY_ANONYMOUS	0x00000001
1017 #define	SECURITY_IDENTIFICATION	0x00000002
1018 #define	SECURITY_IMPERSONATION	0x00000003
1019 #define	SECURITY_DELEGATION	0x00000004
1020 
1021 /*
1022  * CREATE_ANDX SecurityFlags
1023  */
1024 
1025 #define	SECURITY_CONTEXT_TRACKING	0x00000001
1026 #define	SECURITY_EFFECTIVE_ONLY		0x00000002
1027 
1028 /*
1029  * Server types
1030  */
1031 #define	SV_WORKSTATION		0x00000001	/* All workstations */
1032 #define	SV_SERVER		0x00000002	/* All servers */
1033 #define	SV_SQLSERVER		0x00000004	/* running with SQL server */
1034 #define	SV_DOMAIN_CTRL		0x00000008	/* Primary domain controller */
1035 #define	SV_DOMAIN_BAKCTRL	0x00000010	/* Backup domain controller */
1036 #define	SV_TIME_SOURCE		0x00000020	/* running timesource service */
1037 #define	SV_AFP			0x00000040	/* Apple File Protocol */
1038 #define	SV_NOVELL		0x00000080	/* Novell servers */
1039 #define	SV_DOMAIN_MEMBER	0x00000100	/* Domain Member */
1040 #define	SV_PRINTQ_SERVER	0x00000200	/* Server sharing print queue */
1041 #define	SV_DIALIN_SERVER	0x00000400	/* Server running dialin */
1042 #define	SV_XENIX_SERVER		0x00000800	/* Xenix server */
1043 #define	SV_NT			0x00001000	/* NT server */
1044 #define	SV_WFW			0x00002000	/* Server running Windows for */
1045 #define	SV_SERVER_NT		0x00008000	/* Windows NT non DC server */
1046 #define	SV_POTENTIAL_BROWSER	0x00010000	/* can run browser service */
1047 #define	SV_BACKUP_BROWSER	0x00020000	/* Backup browser server */
1048 #define	SV_MASTER_BROWSER	0x00040000	/* Master browser server */
1049 #define	SV_DOMAIN_MASTER	0x00080000	/* Domain Master Browser */
1050 #define	SV_OSF			0x00100000	/* OSF operating system */
1051 #define	SV_VMS			0x00200000	/* VMS operating system */
1052 #define	SV_WINDOWS_95_PLUS	0x00400000	/* Windows 95 or better */
1053 
1054 #define	SV_LOCAL_LIST_ONLY	0x40000000	/* Enumerate only "local" */
1055 #define	SV_TYPE_DOMAIN_ENUM	0x80000000	/*  Enumerate Domains */
1056 
1057 #define	MY_SERVER_TYPE	(SV_SERVER | SV_NT | SV_SERVER_NT)
1058 
1059 
1060 #define	PRQ_ACTIVE	0	/* Active */
1061 #define	PRQ_PAUSE	1	/* Paused */
1062 #define	PRQ_ERROR	2	/* Error Occurred */
1063 #define	PRQ_PENDING	3	/* Deletion pending */
1064 
1065 #define	PRJ_QS_QUEUED	0	/* Active */
1066 #define	PRJ_QS_PAUSED	1	/* Paused */
1067 #define	PRJ_QS_SPOOLING	2	/* Paused */
1068 #define	PRJ_QS_PRINTING	3	/* Paused */
1069 
1070 
1071 #define	SHARE_ACCESS_READ	0x01	/* read & execute from resource	*/
1072 #define	SHARE_ACCESS_WRITE	0x02	/* write data to resource	*/
1073 #define	SHARE_ACCESS_CREATE	0x04	/* create an instance of	*/
1074 #define	SHARE_ACCESS_EXEC	0x08	/* execute from resource	*/
1075 #define	SHARE_ACCESS_DELETE	0x10	/* Permission to delete the resource */
1076 #define	SHARE_ACCESS_ATTRIB	0x20	/* Permission to modify the resource */
1077 #define	SHARE_ACCESS_PERM	0x40	/* Permission to change permissions */
1078 #define	SHARE_ACCESS_ALL	0x7F	/* All of the above permissions	*/
1079 
1080 
1081 /*
1082  * SMB_COM_NT_TRANSACTION sub-command codes (CIFS/1.0 section 5.3)
1083  *
1084  * SubCommand Code		   Value Description
1085  * =============================== ===== =================================
1086  * NT_TRANSACT_CREATE		   1	 File open/create
1087  * NT_TRANSACT_IOCTL		   2	 Device IOCTL
1088  * NT_TRANSACT_SET_SECURITY_DESC   3	 Set security descriptor
1089  * NT_TRANSACT_NOTIFY_CHANGE	   4	 Start directory watch
1090  * NT_TRANSACT_RENAME		   5	 Reserved (handle-based rename)
1091  * NT_TRANSACT_QUERY_SECURITY_DESC 6	 Retrieve security descriptor
1092  * NT_TRANSACT_QUERY_QUOTA	   7	 Retrieve quota information
1093  * NT_TRANSACT_SET_QUOTA	   8	 Set quota information
1094  */
1095 #define	NT_TRANSACT_MIN_FUNCTION	1
1096 
1097 #define	NT_TRANSACT_CREATE		1
1098 #define	NT_TRANSACT_IOCTL		2
1099 #define	NT_TRANSACT_SET_SECURITY_DESC	3
1100 #define	NT_TRANSACT_NOTIFY_CHANGE	4
1101 #define	NT_TRANSACT_RENAME		5
1102 #define	NT_TRANSACT_QUERY_SECURITY_DESC 6
1103 #define	NT_TRANSACT_QUERY_QUOTA		7
1104 #define	NT_TRANSACT_SET_QUOTA		8
1105 
1106 #define	NT_TRANSACT_MAX_FUNCTION	8
1107 
1108 
1109 /*
1110  * Pipe states
1111  */
1112 #define	SMB_PIPE_READMODE_BYTE		0x0000
1113 #define	SMB_PIPE_READMODE_MESSAGE	0x0100
1114 #define	SMB_PIPE_TYPE_BYTE		0x0000
1115 #define	SMB_PIPE_TYPE_MESSAGE		0x0400
1116 #define	SMB_PIPE_END_CLIENT		0x0000
1117 #define	SMB_PIPE_END_SERVER		0x4000
1118 #define	SMB_PIPE_WAIT			0x0000
1119 #define	SMB_PIPE_NOWAIT			0x8000
1120 #define	SMB_PIPE_UNLIMITED_INSTANCES	0x00FF
1121 
1122 /*
1123  * smb_com_seek request
1124  */
1125 #define	SMB_SEEK_SET	0 /* set file offset to specified offset */
1126 #define	SMB_SEEK_CUR	1 /* set file offset to current plus specified offset */
1127 #define	SMB_SEEK_END	2 /* set file offset to EOF plus specified offset */
1128 
1129 /*
1130  * API Numbers for Transact based RAP (Remote Administration Protocol) calls
1131  */
1132 #define	API_WshareEnum			0
1133 #define	API_WshareGetInfo		1
1134 #define	API_WshareSetInfo		2
1135 #define	API_WshareAdd			3
1136 #define	API_WshareDel			4
1137 #define	API_NetShareCheck		5
1138 #define	API_WsessionEnum		6
1139 #define	API_WsessionGetInfo		7
1140 #define	API_WsessionDel			8
1141 #define	API_WconnectionEnum		9
1142 #define	API_WfileEnum			10
1143 #define	API_WfileGetInfo		11
1144 #define	API_WfileClose			12
1145 #define	API_WserverGetInfo		13
1146 #define	API_WserverSetInfo		14
1147 #define	API_WserverDiskEnum		15
1148 #define	API_WserverAdminCommand		16
1149 #define	API_NetAuditOpen		17
1150 #define	API_WauditClear			18
1151 #define	API_NetErrorLogOpen		19
1152 #define	API_WerrorLogClear		20
1153 #define	API_NetCharDevEnum		21
1154 #define	API_NetCharDevGetInfo		22
1155 #define	API_WCharDevControl		23
1156 #define	API_NetCharDevQEnum		24
1157 #define	API_NetCharDevQGetInfo		25
1158 #define	API_WCharDevQSetInfo		26
1159 #define	API_WCharDevQPurge		27
1160 #define	API_WCharDevQPurgeSelf		28
1161 #define	API_WMessageNameEnum		29
1162 #define	API_WMessageNameGetInfo		30
1163 #define	API_WMessageNameAdd		31
1164 #define	API_WMessageNameDel		32
1165 #define	API_WMessageNameFwd		33
1166 #define	API_WMessageNameUnFwd		34
1167 #define	API_WMessageBufferSend		35
1168 #define	API_WMessageFileSend		36
1169 #define	API_WMessageLogFileSet		37
1170 #define	API_WMessageLogFileGet		38
1171 #define	API_WServiceEnum		39
1172 #define	API_WServiceInstall		40
1173 #define	API_WServiceControl		41
1174 #define	API_WAccessEnum			42
1175 #define	API_WAccessGetInfo		43
1176 #define	API_WAccessSetInfo		44
1177 #define	API_WAccessAdd			45
1178 #define	API_WAccessDel			46
1179 #define	API_WGroupEnum			47
1180 #define	API_WGroupAdd			48
1181 #define	API_WGroupDel			49
1182 #define	API_WGroupAddUser		50
1183 #define	API_WGroupDelUser		51
1184 #define	API_WGroupGetUsers		52
1185 #define	API_WUserEnum			53
1186 #define	API_WUserAdd			54
1187 #define	API_WUserDel			55
1188 #define	API_WUserGetInfo		56
1189 #define	API_WUserSetInfo		57
1190 #define	API_WUserPasswordSet		58
1191 #define	API_WUserGetGroups		59
1192 #define	API_DeadTableEntry		60
1193 #define	API_WWkstaSetUID		62
1194 #define	API_WWkstaGetInfo		63
1195 #define	API_WWkstaSetInfo		64
1196 #define	API_WUseEnum			65
1197 #define	API_WUseAdd			66
1198 #define	API_WUseDel			67
1199 #define	API_WUseGetInfo			68
1200 #define	API_WPrintQEnum			69
1201 #define	API_WPrintQGetInfo		70
1202 #define	API_WPrintQSetInfo		71
1203 #define	API_WPrintQAdd			72
1204 #define	API_WPrintQDel			73
1205 #define	API_WPrintQPause		74
1206 #define	API_WPrintQContinue		75
1207 #define	API_WPrintJobEnum		76
1208 #define	API_WPrintJobGetInfo		77
1209 #define	API_WPrintJobSetInfo_OLD	78
1210 #define	API_WPrintJobDel		81
1211 #define	API_WPrintJobPause		82
1212 #define	API_WPrintJobContinue		83
1213 #define	API_WPrintDestEnum		84
1214 #define	API_WPrintDestGetInfo		85
1215 #define	API_WPrintDestControl		86
1216 #define	API_WProfileSave		87
1217 #define	API_WProfileLoad		88
1218 #define	API_WStatisticsGet		89
1219 #define	API_WStatisticsClear		90
1220 #define	API_NetRemoteTOD		91
1221 #define	API_WNetBiosEnum		92
1222 #define	API_WNetBiosGetInfo		93
1223 #define	API_NetServerEnum		94
1224 #define	API_I_NetServerEnum		95
1225 #define	API_WServiceGetInfo		96
1226 #define	API_WPrintQPurge		103
1227 #define	API_NetServerEnum2		104
1228 #define	API_WAccessGetUserPerms		105
1229 #define	API_WGroupGetInfo		106
1230 #define	API_WGroupSetInfo		107
1231 #define	API_WGroupSetUsers		108
1232 #define	API_WUserSetGroups		109
1233 #define	API_WUserModalsGet		110
1234 #define	API_WUserModalsSet		111
1235 #define	API_WFileEnum2			112
1236 #define	API_WUserAdd2			113
1237 #define	API_WUserSetInfo2		114
1238 #define	API_WUserPasswordSet2		115
1239 #define	API_I_NetServerEnum2		116
1240 #define	API_WConfigGet2			117
1241 #define	API_WConfigGetAll2		118
1242 #define	API_WGetDCName			119
1243 #define	API_NetHandleGetInfo		120
1244 #define	API_NetHandleSetInfo		121
1245 #define	API_WStatisticsGet2		122
1246 #define	API_WBuildGetInfo		123
1247 #define	API_WFileGetInfo2		124
1248 #define	API_WFileClose2			125
1249 #define	API_WNetServerReqChallenge	126
1250 #define	API_WNetServerAuthenticate	127
1251 #define	API_WNetServerPasswordSet	128
1252 #define	API_WNetAccountDeltas		129
1253 #define	API_WNetAccountSync		130
1254 #define	API_WUserEnum2			131
1255 #define	API_WWkstaUserLogon		132
1256 #define	API_WWkstaUserLogoff		133
1257 #define	API_WLogonEnum			134
1258 #define	API_WErrorLogRead		135
1259 #define	API_WI_NetPathType		136
1260 #define	API_WI_NetPathCanonicalize	137
1261 #define	API_WI_NetPathCompare		138
1262 #define	API_WI_NetNameValidate		139
1263 #define	API_WI_NetNameCanonicalize	140
1264 #define	API_WI_NetNameCompare		141
1265 #define	API_WAuditRead			142
1266 #define	API_WPrintDestAdd		143
1267 #define	API_WPrintDestSetInfo		144
1268 #define	API_WPrintDestDel		145
1269 #define	API_WUserValidate2		146
1270 #define	API_WPrintJobSetInfo		147
1271 #define	API_TI_NetServerDiskEnum	148
1272 #define	API_TI_NetServerDiskGetInfo	149
1273 #define	API_TI_FTVerifyMirror		150
1274 #define	API_TI_FTAbortVerify		151
1275 #define	API_TI_FTGetInfo		152
1276 #define	API_TI_FTSetInfo		153
1277 #define	API_TI_FTLockDisk		154
1278 #define	API_TI_FTFixError		155
1279 #define	API_TI_FTAbortFix		156
1280 #define	API_TI_FTDiagnoseError		157
1281 #define	API_TI_FTGetDriveStats		158
1282 #define	API_TI_FTErrorGetInfo		160
1283 #define	API_NetAccessCheck		163
1284 #define	API_NetAlertRaise		164
1285 #define	API_NetAlertStart		165
1286 #define	API_NetAlertStop		166
1287 #define	API_NetAuditWrite		167
1288 #define	API_NetIRemoteAPI		168
1289 #define	API_NetServiceStatus		169
1290 #define	API_I_NetServerRegister		170
1291 #define	API_I_NetServerDeregister	171
1292 #define	API_I_NetSessionEntryMake	172
1293 #define	API_I_NetSessionEntryClear	173
1294 #define	API_I_NetSessionEntryGetInfo	174
1295 #define	API_I_NetSessionEntrySetInfo	175
1296 #define	API_I_NetConnectionEntryMake	176
1297 #define	API_I_NetConnectionEntryClear	177
1298 #define	API_I_NetConnectionEntrySetInfo	178
1299 #define	API_I_NetConnectionEntryGetInfo	179
1300 #define	API_I_NetFileEntryMake		180
1301 #define	API_I_NetFileEntryClear		181
1302 #define	API_I_NetFileEntrySetInfo	182
1303 #define	API_I_NetFileEntryGetInfo	183
1304 #define	API_AltSrvMessageBufferSend	184
1305 #define	API_AltSrvMessageFileSend	185
1306 #define	API_wI_NetRplWkstaEnum		186
1307 #define	API_wI_NetRplWkstaGetInfo	187
1308 #define	API_wI_NetRplWkstaSetInfo	188
1309 #define	API_wI_NetRplWkstaAdd		189
1310 #define	API_wI_NetRplWkstaDel		190
1311 #define	API_wI_NetRplProfileEnum	191
1312 #define	API_wI_NetRplProfileGetInfo	192
1313 #define	API_wI_NetRplProfileSetInfo	193
1314 #define	API_wI_NetRplProfileAdd		194
1315 #define	API_wI_NetRplProfileDel		195
1316 #define	API_wI_NetRplProfileClone	196
1317 #define	API_wI_NetRplBaseProfileEnum	197
1318 #define	API_WIServerSetInfo		201
1319 #define	API_WPrintDriverEnum		205
1320 #define	API_WPrintQProcessorEnum	206
1321 #define	API_WPrintPortEnum		207
1322 #define	API_WNetWriteUpdateLog		208
1323 #define	API_WNetAccountUpdate		209
1324 #define	API_WNetAccountConfirmUpdate	210
1325 #define	API_WConfigSet			211
1326 #define	API_WAccountsReplicate		212
1327 #define	API_SamOEMChgPasswordUser2_P	214
1328 #define	API_NetServerEnum3		215
1329 #define	API_WprintDriverGetInfo		250
1330 #define	API_WprintDriverSetInfo		251
1331 #define	API_WaliasAdd			252
1332 #define	API_WaliasDel			253
1333 #define	API_WaliasGetInfo		254
1334 #define	API_WaliasSetInfo		255
1335 #define	API_WaliasEnum			256
1336 #define	API_WuserGetLogonAsn		257
1337 #define	API_WuserSetLogonAsn		258
1338 #define	API_WuserGetAppSel		259
1339 #define	API_WuserSetAppSel		260
1340 #define	API_WappAdd			261
1341 #define	API_WappDel			262
1342 #define	API_WappGetInfo			263
1343 #define	API_WappSetInfo			264
1344 #define	API_WappEnum			265
1345 #define	API_WUserDCDBInit		266
1346 #define	API_WDASDAdd			267
1347 #define	API_WDASDDel			268
1348 #define	API_WDASDGetInfo		269
1349 #define	API_WDASDSetInfo		270
1350 #define	API_WDASDEnum			271
1351 #define	API_WDASDCheck			272
1352 #define	API_WDASDCtl			273
1353 #define	API_WuserRemoteLogonCheck	274
1354 #define	API_WUserPasswordSet3		275
1355 #define	API_WCreateRIPLMachine		276
1356 #define	API_WDeleteRIPLMachine		277
1357 #define	API_WGetRIPLMachineInfo		278
1358 #define	API_WSetRIPLMachineInfo		279
1359 #define	API_WEnumRIPLMachine		280
1360 #define	API_WI_ShareAdd			281
1361 #define	API_WI_AliasEnum		282
1362 #define	API_WaccessApply		283
1363 #define	API_WPrt16Query			284
1364 #define	API_WPrt16Set			285
1365 #define	API_WUserDel100			286
1366 #define	API_WUserRemoteLogonCheck2	287
1367 #define	API_WRemoteTODSet		294
1368 #define	API_WprintJobMoveAll		295
1369 #define	API_W16AppParmAdd		296
1370 #define	API_W16AppParmDel		297
1371 #define	API_W16AppParmGet		298
1372 #define	API_W16AppParmSet		299
1373 #define	API_W16RIPLMachineCreate	300
1374 #define	API_W16RIPLMachineGetInfo	301
1375 #define	API_W16RIPLMachineSetInfo	302
1376 #define	API_W16RIPLMachineEnum		303
1377 #define	API_W16RIPLMachineListParmEnum	304
1378 #define	API_W16RIPLMachClassGetInfo	305
1379 #define	API_W16RIPLMachClassEnum	306
1380 #define	API_W16RIPLMachClassCreate	307
1381 #define	API_W16RIPLMachClassSetInfo	308
1382 #define	API_W16RIPLMachClassDelete	309
1383 #define	API_W16RIPLMachClassLPEnum	310
1384 #define	API_W16RIPLMachineDelete	311
1385 #define	API_W16WSLevelGetInfo		312
1386 #define	API_WserverNameAdd		313
1387 #define	API_WserverNameDel		314
1388 #define	API_WserverNameEnum		315
1389 #define	API_I_WDASDEnum			316
1390 #define	API_I_WDASDEnumTerminate	317
1391 #define	API_I_WDASDSetInfo2		318
1392 #define	MAX_RAP_API			318
1393 
1394 #ifdef __cplusplus
1395 }
1396 #endif
1397 
1398 #endif /* _SMBSRV_SMB_H */
1399