1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
14 */
15
16 #ifndef _NETSMB_SMB2_H
17 #define _NETSMB_SMB2_H
18
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22
23 #define SMB2_PROTOCOL_ID { 0xFE, 'S', 'M', 'B' }
24 #define SMB2_HDR_SIZE 64
25 #define SMB2_HDRLEN SMB2_HDR_SIZE
26
27 /*
28 * SMB2 header command codes.
29 * These are uint16_t on the wire.
30 */
31 typedef enum {
32 SMB2_NEGOTIATE = 0,
33 SMB2_SESSION_SETUP,
34 SMB2_LOGOFF,
35 SMB2_TREE_CONNECT,
36 SMB2_TREE_DISCONNECT,
37 SMB2_CREATE,
38 SMB2_CLOSE,
39 SMB2_FLUSH,
40 SMB2_READ,
41 SMB2_WRITE,
42 SMB2_LOCK,
43 SMB2_IOCTL,
44 SMB2_CANCEL,
45 SMB2_ECHO,
46 SMB2_QUERY_DIRECTORY,
47 SMB2_CHANGE_NOTIFY,
48 SMB2_QUERY_INFO,
49 SMB2_SET_INFO,
50 SMB2_OPLOCK_BREAK,
51 /*
52 * The above (oplock break) is the last real SMB2 op-code.
53 * We use one more slot to represent invalid commands, and
54 * the final enum value is used for array sizes. Keep last!
55 */
56 SMB2_INVALID_CMD,
57 SMB2__NCMDS
58 } SMB2_cmd_code;
59
60 /*
61 * SMB2 header flags.
62 */
63
64 /*
65 * SERVER_TO_REDIR
66 * When set, indicates the message is a response rather than
67 * a request. This MUST be set on responses sent from the
68 * server to the client, and MUST NOT be set on requests
69 * sent from the client to the server.
70 */
71 #define SMB2_FLAGS_SERVER_TO_REDIR 0x00000001
72
73 /*
74 * ASYNC_COMMAND
75 * When set, indicates that this is an ASYNC SMB2 header.
76 * Always set for headers of the form described in this
77 * section.
78 */
79 #define SMB2_FLAGS_ASYNC_COMMAND 0x00000002
80
81 /*
82 * RELATED_OPERATIONS
83 * When set in an SMB2 request, indicates that this request
84 * is a related operation in a compounded request chain.
85 * [MS-SMB2 sec. 3.2.4.1.4]
86 *
87 * When set in an SMB2 compound response, indicates that
88 * the request corresponding to this response was part of a
89 * related operation in a compounded request chain.
90 * [MS-SMB2 sec. 3.3.5.2.7.2]
91 */
92 #define SMB2_FLAGS_RELATED_OPERATIONS 0x00000004
93
94 /*
95 * SIGNED
96 * When set, indicates that this packet has been signed.
97 * [MS-SMB2 3.1.5.1]
98 */
99 #define SMB2_FLAGS_SIGNED 0x00000008
100
101 /*
102 * [MS-SMB2] 3.2.5.3.1 The SessionKey MUST be set to the
103 * first 16 bytes of the cryptographic key from GSSAPI.
104 * (Padded with zeros if the GSSAPI key is shorter.)
105 */
106 #define SMB2_SESSION_KEY_LEN 16
107
108 /*
109 * DFS_OPERATIONS
110 * When set, indicates that this command is a Distributed
111 * File System (DFS) operation. [MS-SMB2 3.3.5.9]
112 */
113 #define SMB2_FLAGS_DFS_OPERATIONS 0x10000000
114
115 /*
116 * REPLAY_OPERATION
117 * This flag is only valid for the SMB 3.0 dialect. When set,
118 * it indicates that this command is a replay operation.
119 * The client MUST ignore this bit on receipt.
120 */
121 #define SMB2_FLAGS_REPLAY_OPERATION 0x20000000
122
123 /*
124 * SMB2 Netgotiate [MS-SMB2 2.2.3]
125 */
126
127 #define SMB2_NEGOTIATE_SIGNING_ENABLED 0x01
128 #define SMB2_NEGOTIATE_SIGNING_REQUIRED 0x02
129
130 #define SMB2_CAP_DFS 0x00000001
131
132 /* Added with SMB2.1 */
133 #define SMB2_CAP_DFS 0x00000001
134 #define SMB2_CAP_LEASING 0x00000002
135 /*
136 * LARGE_MTU:
137 * When set, indicates that the client supports multi-credit operations.
138 */
139 #define SMB2_CAP_LARGE_MTU 0x00000004
140
141 /* Added with SMB3.0 */
142 #define SMB2_CAP_MULTI_CHANNEL 0x00000008
143 #define SMB2_CAP_PERSISTENT_HANDLES 0x00000010
144 #define SMB2_CAP_DIRECTORY_LEASING 0x00000020
145 #define SMB2_CAP_ENCRYPTION 0x00000040
146
147 /* SMB2 session flags */
148 #define SMB2_SESSION_FLAG_IS_GUEST 0x0001
149 #define SMB2_SESSION_FLAG_IS_NULL 0x0002
150 #define SMB2_SESSION_FLAG_ENCRYPT_DATA 0x0004
151
152 /*
153 * SMB2 Tree connect, disconnect
154 */
155
156 /* SMB2 sharetype flags */
157 #define SMB2_SHARE_TYPE_DISK 0x1
158 #define SMB2_SHARE_TYPE_PIPE 0x2
159 #define SMB2_SHARE_TYPE_PRINT 0x3
160
161 /* SMB2 share flags */
162 #define SMB2_SHAREFLAG_MANUAL_CACHING 0x00000000
163 #define SMB2_SHAREFLAG_AUTO_CACHING 0x00000010
164 #define SMB2_SHAREFLAG_VDO_CACHING 0x00000020
165 #define SMB2_SHAREFLAG_NO_CACHING 0x00000030
166 #define SMB2_SHAREFLAG_DFS 0x00000001
167 #define SMB2_SHAREFLAG_DFS_ROOT 0x00000002
168 #define SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS 0x00000100
169 #define SMB2_SHAREFLAG_FORCE_SHARED_DELETE 0x00000200
170 #define SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING 0x00000400
171 #define SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM 0x00000800
172 #define SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK 0x00001000
173 /* SMB 3.0 */
174 #define SMB2_SHAREFLAG_ENABLE_HASH_V1 0x00002000
175 #define SMB2_SHAREFLAG_ENABLE_HASH_V2 0x00004000
176 #define SMB2_SHAREFLAG_ENCRYPT_DATA 0x00008000
177
178 /* SMB2 share capabilities */
179 #define SMB2_SHARE_CAP_DFS 0x00000008
180 /* SMB 3.0 */
181 #define SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY 0x00000010
182 #define SMB2_SHARE_CAP_SCALEOUT 0x00000020
183 #define SMB2_SHARE_CAP_CLUSTER 0x00000040
184
185 /*
186 * SMB2 Create (open)
187 */
188
189 /* SMB2 requested oplock levels */
190 #define SMB2_OPLOCK_LEVEL_NONE 0x00
191 #define SMB2_OPLOCK_LEVEL_II 0x01
192 #define SMB2_OPLOCK_LEVEL_EXCLUSIVE 0x08
193 #define SMB2_OPLOCK_LEVEL_BATCH 0x09
194 #define SMB2_OPLOCK_LEVEL_LEASE 0xFF
195
196 /* SMB2 impersonation levels */
197 #define SMB2_IMPERSONATION_ANONYMOUS 0x00
198 #define SMB2_IMPERSONATION_IDENTIFICATION 0x01
199 #define SMB2_IMPERSONATION_IMPERSONATION 0x02
200 #define SMB2_IMPERSONATION_DELEGATE 0x03
201
202 /*
203 * Note: ShareAccess, CreateDispositon, CreateOptions,
204 * all use the same definitions as SMB1 (from MS-FSA).
205 * Ditto FileAccess flags (as with ACLs)
206 */
207
208 /* SMB2 Create Context tags */
209
210 #define SMB2_CREATE_EA_BUFFER 0x45787441 /* ("ExtA") */
211 /*
212 * The data contains the extended attributes
213 * that MUST be stored on the created file.
214 * This value MUST NOT be set for named
215 * pipes and print files.
216 */
217
218 #define SMB2_CREATE_SD_BUFFER 0x53656344 /* ("SecD") */
219 /*
220 * The data contains a security descriptor that
221 * MUST be stored on the created file.
222 * This value MUST NOT be set for named
223 * pipes and print files.
224 */
225
226 #define SMB2_CREATE_DURABLE_HANDLE_REQUEST 0x44486e51 /* ("DHnQ") */
227 /* The client is requesting the open to be durable */
228
229 #define SMB2_CREATE_DURABLE_HANDLE_RECONNECT 0x44486e43 /* ("DHnC") */
230 /*
231 * The client is requesting to reconnect to a
232 * durable open after being disconnected
233 */
234
235 #define SMB2_CREATE_ALLOCATION_SIZE 0x416c5369 /* ("AISi") */
236 /*
237 * The data contains the required allocation
238 * size of the newly created file.
239 */
240
241 #define SMB2_CREATE_QUERY_MAXIMAL_ACCESS 0x4d784163 /* ("MxAc") */
242 /*
243 * The client is requesting that the server
244 * return maximal access information.
245 */
246
247 #define SMB2_CREATE_TIMEWARP_TOKEN 0x54577270 /* ("TWrp") */
248 /*
249 * The client is requesting that the server
250 * open an earlier version of the file identified
251 * by the provided time stamp.
252 */
253
254 #define SMB2_CREATE_QUERY_ON_DISK_ID 0x51466964 /* ("QFid") */
255 /*
256 * The client is requesting that the server return a 32-byte
257 * opaque BLOB that uniquely identifies the file being opened
258 * on disk. No data is passed to the server by the client.
259 */
260
261 #define SMB2_CREATE_REQUEST_LEASE 0x52714c73 /* ("RqLs") */
262 /*
263 * The client is requesting that the server return a lease.
264 * This value is only supported for the SMB 2.1 and 3.0 dialects.
265 */
266
267 /* SMB2 create request lease */
268 #define SMB2_LEASE_NONE 0x00
269 #define SMB2_LEASE_READ_CACHING 0x01
270 #define SMB2_LEASE_HANDLE_CACHING 0x02
271 #define SMB2_LEASE_WRITE_CACHING 0x04
272
273 /* SMB2 lease break notification flags */
274 #define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED 0x01
275
276 /*
277 * SMB2 Close
278 */
279 #define SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB 0x0001
280
281 /*
282 * SMB2 Write
283 */
284 #define SMB2_WRITEFLAG_WRITE_THROUGH 0x00000001
285
286 /*
287 * SMB2 Lock Request
288 */
289
290 /* SMB2 lock flags */
291
292 /*
293 * SMB2_LOCKFLAG_SHARED_LOCK
294 * The range MUST be locked shared, allowing other opens
295 * to read from or take a shared lock on the range. All opens
296 * MUST NOT be allowed to write within the range. Other
297 * locks can be requested and taken on this range.
298 */
299 #define SMB2_LOCKFLAG_SHARED_LOCK 0x00000001
300
301 /*
302 * SMB2_LOCKFLAG_EXCLUSIVE_LOCK
303 * The range MUST be locked exclusive, not allowing other
304 * opens to read, write, or lock within the range.
305 */
306 #define SMB2_LOCKFLAG_EXCLUSIVE_LOCK 0x00000002
307
308 /*
309 * SMB2_LOCKFLAG_UNLOCK
310 * The range MUST be unlocked from a previous lock taken
311 * on this range. The unlock range MUST be identical to the
312 * lock range. Sub-ranges cannot be unlocked.
313 */
314 #define SMB2_LOCKFLAG_UNLOCK 0x00000004
315
316 /*
317 * SMB2_LOCKFLAG_FAIL_IMMEDIATELY
318 * The lock operation MUST fail immediately if it conflicts
319 * with an existing lock, instead of waiting for the range to
320 * become available. This can be OR'ed with either of
321 * shared_lock, exclusive_lock (nothing else).
322 */
323 #define SMB2_LOCKFLAG_FAIL_IMMEDIATELY 0x00000010
324
325 /*
326 * SMB2 Ioctl Request
327 */
328 #define SMB2_IOCTL_IS_FSCTL 0x00000001
329
330
331 /*
332 * SMB2 Query Directory
333 */
334
335 /*
336 * SMB2 query directory info levels
337 * Same as SMB1 (see ntifs.h)
338 */
339
340 /*
341 * SMB2 Query Directory Flags
342 * (our own names for these - spec. used poor names)
343 */
344 #define SMB2_QDIR_FLAG_RESTART 0x01 /* SMB2_RESTART_SCANS */
345 #define SMB2_QDIR_FLAG_SINGLE 0x02 /* SMB2_RETURN_SINGLE_ENTRY */
346 #define SMB2_QDIR_FLAG_INDEX 0x04 /* SMB2_INDEX_SPECIFIED */
347 #define SMB2_QDIR_FLAG_REOPEN 0x10 /* SMB2_REOPEN */
348
349 /*
350 * SMB2 Query Info Request
351 */
352
353 /* info type */
354 #define SMB2_0_INFO_FILE 0x01
355 /* The file information is requested. */
356 #define SMB2_0_INFO_FILESYSTEM 0x02
357 /* The underlying object store information is requested. */
358 #define SMB2_0_INFO_SECURITY 0x03
359 /* The security information is requested. */
360 #define SMB2_0_INFO_QUOTA 0x04
361 /* The underlying object store quota information is requested. */
362
363 /*
364 * MS-FSCC 2.5 FileSystem Information Classes.
365 * Also see MSDN for ZwQueryVolumeInformationFile.
366 */
367 typedef enum _FS_INFORMATION_CLASS
368 {
369 FileFsVolumeInformation = 1, /* Query */
370 FileFsLabelInformation = 2, /* Set */
371 FileFsSizeInformation = 3, /* Query */
372 FileFsDeviceInformation = 4, /* Query */
373 FileFsAttributeInformation = 5, /* Query */
374 FileFsControlInformation = 6, /* Query, Set */
375 FileFsFullSizeInformation = 7, /* Query */
376 FileFsObjectIdInformation = 8, /* Query, Set */
377 FileFsDriverPathInformation = 9 /* Query */
378 } FS_INFORMATION_CLASS;
379
380 /*
381 * MS-FSCC 2.4 File Information Classes
382 */
383 typedef enum _FILE_INFORMATION_CLASS
384 {
385 FileDirectoryInformation = 1,
386 FileFullDirectoryInformation = 2,
387 FileBothDirectoryInformation = 3,
388 FileBasicInformation = 4,
389 FileStandardInformation = 5,
390 FileInternalInformation = 6,
391 FileEaInformation = 7,
392 FileAccessInformation = 8,
393 FileNameInformation = 9,
394 FileRenameInformation = 10,
395 FileLinkInformation = 11,
396 FileNamesInformation = 12,
397 FileDispositionInformation = 13,
398 FilePositionInformation = 14,
399 FileFullEaInformation = 15,
400 FileModeInformation = 16,
401 FileAlignmentInformation = 17,
402 FileAllInformation = 18,
403 FileAllocationInformation = 19,
404 FileEndOfFileInformation = 20,
405 FileAlternateNameInformation = 21,
406 FileStreamInformation = 22,
407 FilePipeInformation = 23,
408 FilePipeLocalInformation = 24,
409 FilePipeRemoteInformation = 25,
410 FileMailslotQueryInformation = 26,
411 FileMailslotSetInformation = 27,
412 FileCompressionInformation = 28,
413 FileObjectIdInformation = 29,
414 FileMoveClusterInformation = 31,
415 FileQuotaInformation = 32,
416 FileReparsePointInformation = 33,
417 FileNetworkOpenInformation = 34,
418 FileAttributeTagInformation = 35,
419 FileTrackingInformation = 36,
420 FileIdBothDirectoryInformation = 37,
421 FileIdFullDirectoryInformation = 38,
422 FileValidDataLengthInformation = 39,
423 FileShortNameInformation = 40,
424 FileSfioReserveInformation = 44,
425 FileSfioVolumeInformation = 45,
426 FileHardLinkInformation = 46,
427 FileNormalizedNameInformation = 48,
428 FileIdGlobalTxDirectoryInformation = 50,
429 FileStandardLinkInformation = 54
430 } FILE_INFORMATION_CLASS;
431
432 /*
433 * SMB2 Change Nofity Request
434 */
435 #define SMB2_WATCH_TREE 0x00000001
436
437 /*
438 * After here, added stuff from darwin
439 */
440 #define SMB2_TID_UNKNOWN 0
441 #define SMB2_FID_UNUSED 0xffffffffffffffff
442
443 /* smb2_durable_handle flags */
444 typedef enum _SMB2_DURABLE_HANDLE_FLAGS
445 {
446 SMB2_DURABLE_HANDLE_REQUEST = 0x0001,
447 SMB2_DURABLE_HANDLE_RECONNECT = 0x0002,
448 SMB2_DURABLE_HANDLE_GRANTED = 0x0004,
449 SMB2_LEASE_GRANTED = 0x0008
450 } _SMB2_DURABLE_HANDLE_FLAGS;
451
452 struct smb2_durable_handle {
453 uint64_t fid; /* SMBFID to reconnect in durable handle reconnect */
454 uint64_t flags;
455 uint64_t lease_key_hi; /* atomic increment number */
456 uint64_t lease_key_low; /* node hash value */
457 uint32_t lease_state;
458 uint32_t pad;
459 };
460
461 #ifdef __cplusplus
462 }
463 #endif
464
465 #endif /* _NETSMB_SMB2_H */