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 */ 466