1 /* SPDX-License-Identifier: LGPL-2.1 */ 2 #ifndef _COMMON_SMB2PDU_H 3 #define _COMMON_SMB2PDU_H 4 5 /* 6 * Note that, due to trying to use names similar to the protocol specifications, 7 * there are many mixed case field names in the structures below. Although 8 * this does not match typical Linux kernel style, it is necessary to be 9 * able to match against the protocol specification. 10 * 11 * SMB2 commands 12 * Some commands have minimal (wct=0,bcc=0), or uninteresting, responses 13 * (ie no useful data other than the SMB error code itself) and are marked such. 14 * Knowing this helps avoid response buffer allocations and copy in some cases. 15 */ 16 17 /* List of commands in host endian */ 18 #define SMB2_NEGOTIATE_HE 0x0000 19 #define SMB2_SESSION_SETUP_HE 0x0001 20 #define SMB2_LOGOFF_HE 0x0002 /* trivial request/resp */ 21 #define SMB2_TREE_CONNECT_HE 0x0003 22 #define SMB2_TREE_DISCONNECT_HE 0x0004 /* trivial req/resp */ 23 #define SMB2_CREATE_HE 0x0005 24 #define SMB2_CLOSE_HE 0x0006 25 #define SMB2_FLUSH_HE 0x0007 /* trivial resp */ 26 #define SMB2_READ_HE 0x0008 27 #define SMB2_WRITE_HE 0x0009 28 #define SMB2_LOCK_HE 0x000A 29 #define SMB2_IOCTL_HE 0x000B 30 #define SMB2_CANCEL_HE 0x000C 31 #define SMB2_ECHO_HE 0x000D 32 #define SMB2_QUERY_DIRECTORY_HE 0x000E 33 #define SMB2_CHANGE_NOTIFY_HE 0x000F 34 #define SMB2_QUERY_INFO_HE 0x0010 35 #define SMB2_SET_INFO_HE 0x0011 36 #define SMB2_OPLOCK_BREAK_HE 0x0012 37 #define SMB2_SERVER_TO_CLIENT_NOTIFICATION 0x0013 38 39 /* The same list in little endian */ 40 #define SMB2_NEGOTIATE cpu_to_le16(SMB2_NEGOTIATE_HE) 41 #define SMB2_SESSION_SETUP cpu_to_le16(SMB2_SESSION_SETUP_HE) 42 #define SMB2_LOGOFF cpu_to_le16(SMB2_LOGOFF_HE) 43 #define SMB2_TREE_CONNECT cpu_to_le16(SMB2_TREE_CONNECT_HE) 44 #define SMB2_TREE_DISCONNECT cpu_to_le16(SMB2_TREE_DISCONNECT_HE) 45 #define SMB2_CREATE cpu_to_le16(SMB2_CREATE_HE) 46 #define SMB2_CLOSE cpu_to_le16(SMB2_CLOSE_HE) 47 #define SMB2_FLUSH cpu_to_le16(SMB2_FLUSH_HE) 48 #define SMB2_READ cpu_to_le16(SMB2_READ_HE) 49 #define SMB2_WRITE cpu_to_le16(SMB2_WRITE_HE) 50 #define SMB2_LOCK cpu_to_le16(SMB2_LOCK_HE) 51 #define SMB2_IOCTL cpu_to_le16(SMB2_IOCTL_HE) 52 #define SMB2_CANCEL cpu_to_le16(SMB2_CANCEL_HE) 53 #define SMB2_ECHO cpu_to_le16(SMB2_ECHO_HE) 54 #define SMB2_QUERY_DIRECTORY cpu_to_le16(SMB2_QUERY_DIRECTORY_HE) 55 #define SMB2_CHANGE_NOTIFY cpu_to_le16(SMB2_CHANGE_NOTIFY_HE) 56 #define SMB2_QUERY_INFO cpu_to_le16(SMB2_QUERY_INFO_HE) 57 #define SMB2_SET_INFO cpu_to_le16(SMB2_SET_INFO_HE) 58 #define SMB2_OPLOCK_BREAK cpu_to_le16(SMB2_OPLOCK_BREAK_HE) 59 60 #define SMB2_INTERNAL_CMD cpu_to_le16(0xFFFF) 61 62 #define NUMBER_OF_SMB2_COMMANDS 0x0013 63 64 /* 65 * Size of the session key (crypto key encrypted with the password 66 */ 67 #define SMB2_NTLMV2_SESSKEY_SIZE 16 68 #define SMB2_SIGNATURE_SIZE 16 69 #define SMB2_HMACSHA256_SIZE 32 70 #define SMB2_CMACAES_SIZE 16 71 #define SMB3_GCM128_CRYPTKEY_SIZE 16 72 #define SMB3_GCM256_CRYPTKEY_SIZE 32 73 74 /* 75 * Size of the smb3 encryption/decryption keys 76 * This size is big enough to store any cipher key types. 77 */ 78 #define SMB3_ENC_DEC_KEY_SIZE 32 79 80 /* 81 * Size of the smb3 signing key 82 */ 83 #define SMB3_SIGN_KEY_SIZE 16 84 85 #define CIFS_CLIENT_CHALLENGE_SIZE 8 86 87 /* Maximum buffer size value we can send with 1 credit */ 88 #define SMB2_MAX_BUFFER_SIZE 65536 89 90 /* 91 * The default wsize is 1M for SMB2 (and for some CIFS cases). 92 * find_get_pages seems to return a maximum of 256 93 * pages in a single call. With PAGE_SIZE == 4k, this means we can 94 * fill a single wsize request with a single call. 95 */ 96 #define SMB3_DEFAULT_IOSIZE (4 * 1024 * 1024) 97 98 /* According to MS-SMB2 specification The minimum recommended value is 65536.*/ 99 #define CIFS_MIN_DEFAULT_IOSIZE (65536) 100 101 /* 102 * SMB2 Header Definition 103 * 104 * "MBZ" : Must be Zero 105 * "BB" : BugBug, Something to check/review/analyze later 106 * "PDU" : "Protocol Data Unit" (ie a network "frame") 107 * 108 */ 109 110 #define __SMB2_HEADER_STRUCTURE_SIZE 64 111 #define SMB2_HEADER_STRUCTURE_SIZE \ 112 cpu_to_le16(__SMB2_HEADER_STRUCTURE_SIZE) 113 114 #define SMB2_PROTO_NUMBER cpu_to_le32(0x424d53fe) 115 #define SMB2_TRANSFORM_PROTO_NUM cpu_to_le32(0x424d53fd) 116 #define SMB2_COMPRESSION_TRANSFORM_ID cpu_to_le32(0x424d53fc) 117 118 /* 119 * SMB2 flag definitions 120 */ 121 #define SMB2_FLAGS_SERVER_TO_REDIR cpu_to_le32(0x00000001) 122 #define SMB2_FLAGS_ASYNC_COMMAND cpu_to_le32(0x00000002) 123 #define SMB2_FLAGS_RELATED_OPERATIONS cpu_to_le32(0x00000004) 124 #define SMB2_FLAGS_SIGNED cpu_to_le32(0x00000008) 125 #define SMB2_FLAGS_PRIORITY_MASK cpu_to_le32(0x00000070) /* SMB3.1.1 */ 126 #define SMB2_FLAGS_DFS_OPERATIONS cpu_to_le32(0x10000000) 127 #define SMB2_FLAGS_REPLAY_OPERATION cpu_to_le32(0x20000000) /* SMB3 & up */ 128 129 /* 130 * Definitions for SMB2 Protocol Data Units (network frames) 131 * 132 * See MS-SMB2.PDF specification for protocol details. 133 * The Naming convention is the lower case version of the SMB2 134 * command code name for the struct. Note that structures must be packed. 135 * 136 */ 137 138 /* See MS-SMB2 section 2.2.1 */ 139 struct smb2_hdr { 140 __le32 ProtocolId; /* 0xFE 'S' 'M' 'B' */ 141 __le16 StructureSize; /* 64 */ 142 __le16 CreditCharge; /* MBZ */ 143 __le32 Status; /* Error from server */ 144 __le16 Command; 145 __le16 CreditRequest; /* CreditResponse */ 146 __le32 Flags; 147 __le32 NextCommand; 148 __le64 MessageId; 149 union { 150 struct { 151 __le32 ProcessId; 152 __le32 TreeId; 153 } __packed SyncId; 154 __le64 AsyncId; 155 } __packed Id; 156 __le64 SessionId; 157 __u8 Signature[16]; 158 } __packed; 159 160 struct smb3_hdr_req { 161 __le32 ProtocolId; /* 0xFE 'S' 'M' 'B' */ 162 __le16 StructureSize; /* 64 */ 163 __le16 CreditCharge; /* MBZ */ 164 __le16 ChannelSequence; /* See MS-SMB2 3.2.4.1 and 3.2.7.1 */ 165 __le16 Reserved; 166 __le16 Command; 167 __le16 CreditRequest; /* CreditResponse */ 168 __le32 Flags; 169 __le32 NextCommand; 170 __le64 MessageId; 171 union { 172 struct { 173 __le32 ProcessId; 174 __le32 TreeId; 175 } __packed SyncId; 176 __le64 AsyncId; 177 } __packed Id; 178 __le64 SessionId; 179 __u8 Signature[16]; 180 } __packed; 181 182 struct smb2_pdu { 183 struct smb2_hdr hdr; 184 __le16 StructureSize2; /* size of wct area (varies, request specific) */ 185 } __packed; 186 187 #define SMB2_ERROR_STRUCTURE_SIZE2 9 188 #define SMB2_ERROR_STRUCTURE_SIZE2_LE cpu_to_le16(SMB2_ERROR_STRUCTURE_SIZE2) 189 190 struct smb2_err_rsp { 191 struct smb2_hdr hdr; 192 __le16 StructureSize; 193 __u8 ErrorContextCount; 194 __u8 Reserved; 195 __le32 ByteCount; /* even if zero, at least one byte follows */ 196 __u8 ErrorData[]; /* variable length */ 197 } __packed; 198 199 #define SMB3_AES_CCM_NONCE 11 200 #define SMB3_AES_GCM_NONCE 12 201 202 /* Transform flags (for 3.0 dialect this flag indicates CCM */ 203 #define TRANSFORM_FLAG_ENCRYPTED 0x0001 204 struct smb2_transform_hdr { 205 __le32 ProtocolId; /* 0xFD 'S' 'M' 'B' */ 206 __u8 Signature[16]; 207 __u8 Nonce[16]; 208 __le32 OriginalMessageSize; 209 __u16 Reserved1; 210 __le16 Flags; /* EncryptionAlgorithm for 3.0, enc enabled for 3.1.1 */ 211 __le64 SessionId; 212 } __packed; 213 214 /* 215 * These are simplified versions from the spec, as we don't need a fully fledged 216 * form of both unchained and chained structs. 217 * 218 * Moreover, even in chained compressed payloads, the initial compression header 219 * has the form of the unchained one -- i.e. it never has the 220 * OriginalPayloadSize field and ::Offset field always represent an offset 221 * (instead of a length, as it is in the chained header). 222 * 223 * See MS-SMB2 2.2.42 for more details. 224 */ 225 #define SMB2_COMPRESSION_FLAG_NONE 0x0000 226 #define SMB2_COMPRESSION_FLAG_CHAINED 0x0001 227 228 struct smb2_compression_hdr { 229 __le32 ProtocolId; /* 0xFC 'S' 'M' 'B' */ 230 __le32 OriginalCompressedSegmentSize; 231 __le16 CompressionAlgorithm; 232 __le16 Flags; 233 __le32 Offset; /* this is the size of the uncompressed SMB2 header below */ 234 /* uncompressed SMB2 header (READ or WRITE) goes here */ 235 /* compressed data goes here */ 236 } __packed; 237 238 /* 239 * ... OTOH, set compression payload header to always have OriginalPayloadSize 240 * as it's easier to pass the struct size minus sizeof(OriginalPayloadSize) 241 * than to juggle around the header/data memory. 242 */ 243 struct smb2_compression_payload_hdr { 244 __le16 CompressionAlgorithm; 245 __le16 Flags; 246 __le32 Length; /* length of compressed playload including field below if present */ 247 __le32 OriginalPayloadSize; /* accounted when LZNT1, LZ77, LZ77+Huffman */ 248 } __packed; 249 250 struct smb2_compression_pattern_v1 { 251 __u8 Pattern; 252 __u8 Reserved1; 253 __le16 Reserved2; 254 __le32 Repetitions; 255 } __packed; 256 257 /* See MS-SMB2 section 2.2.9.2 */ 258 /* Context Types */ 259 #define SMB2_RESERVED_TREE_CONNECT_CONTEXT_ID 0x0000 260 #define SMB2_REMOTED_IDENTITY_TREE_CONNECT_CONTEXT_ID cpu_to_le16(0x0001) 261 262 struct tree_connect_contexts { 263 __le16 ContextType; 264 __le16 DataLength; 265 __le32 Reserved; 266 __u8 Data[]; 267 } __packed; 268 269 /* Remoted identity tree connect context structures - see MS-SMB2 2.2.9.2.1 */ 270 struct smb3_blob_data { 271 __le16 BlobSize; 272 __u8 BlobData[]; 273 } __packed; 274 275 /* Valid values for Attr */ 276 #define SE_GROUP_MANDATORY 0x00000001 277 #define SE_GROUP_ENABLED_BY_DEFAULT 0x00000002 278 #define SE_GROUP_ENABLED 0x00000004 279 #define SE_GROUP_OWNER 0x00000008 280 #define SE_GROUP_USE_FOR_DENY_ONLY 0x00000010 281 #define SE_GROUP_INTEGRITY 0x00000020 282 #define SE_GROUP_INTEGRITY_ENABLED 0x00000040 283 #define SE_GROUP_RESOURCE 0x20000000 284 #define SE_GROUP_LOGON_ID 0xC0000000 285 286 struct sid_array_data { 287 __le16 SidAttrCount; 288 /* SidAttrList - array of sid_attr_data structs */ 289 } __packed; 290 291 /* struct sid_attr_data is SidData array in BlobData format then le32 Attr */ 292 struct sid_attr_data { 293 __le16 BlobSize; 294 __u8 BlobData[]; 295 /* __le32 Attr */ 296 } __packed; 297 298 /* 299 * struct privilege_data is the same as BLOB_DATA - see MS-SMB2 2.2.9.2.1.5 300 * but with size of LUID_ATTR_DATA struct and BlobData set to LUID_ATTR DATA 301 */ 302 303 struct privilege_array_data { 304 __le16 PrivilegeCount; 305 /* array of privilege_data structs */ 306 } __packed; 307 308 struct remoted_identity_tcon_context { 309 __le16 TicketType; /* must be 0x0001 */ 310 __le16 TicketSize; /* total size of this struct */ 311 __le16 User; /* offset to SID_ATTR_DATA struct with user info */ 312 __le16 UserName; /* offset to null terminated Unicode username string */ 313 __le16 Domain; /* offset to null terminated Unicode domain name */ 314 __le16 Groups; /* offset to SID_ARRAY_DATA struct with group info */ 315 __le16 RestrictedGroups; /* similar to above */ 316 __le16 Privileges; /* offset to PRIVILEGE_ARRAY_DATA struct */ 317 __le16 PrimaryGroup; /* offset to SID_ARRAY_DATA struct */ 318 __le16 Owner; /* offset to BLOB_DATA struct */ 319 __le16 DefaultDacl; /* offset to BLOB_DATA struct */ 320 __le16 DeviceGroups; /* offset to SID_ARRAY_DATA struct */ 321 __le16 UserClaims; /* offset to BLOB_DATA struct */ 322 __le16 DeviceClaims; /* offset to BLOB_DATA struct */ 323 __u8 TicketInfo[]; /* variable length buf - remoted identity data */ 324 } __packed; 325 326 struct smb2_tree_connect_req_extension { 327 __le32 TreeConnectContextOffset; 328 __le16 TreeConnectContextCount; 329 __u8 Reserved[10]; 330 __u8 PathName[]; /* variable sized array */ 331 /* followed by array of TreeConnectContexts */ 332 } __packed; 333 334 /* Flags/Reserved for SMB3.1.1 */ 335 #define SMB2_TREE_CONNECT_FLAG_CLUSTER_RECONNECT cpu_to_le16(0x0001) 336 #define SMB2_TREE_CONNECT_FLAG_REDIRECT_TO_OWNER cpu_to_le16(0x0002) 337 #define SMB2_TREE_CONNECT_FLAG_EXTENSION_PRESENT cpu_to_le16(0x0004) 338 339 struct smb2_tree_connect_req { 340 struct smb2_hdr hdr; 341 __le16 StructureSize; /* Must be 9 */ 342 __le16 Flags; /* Flags in SMB3.1.1 */ 343 __le16 PathOffset; 344 __le16 PathLength; 345 __u8 Buffer[]; /* variable length */ 346 } __packed; 347 348 /* Possible ShareType values */ 349 #define SMB2_SHARE_TYPE_DISK 0x01 350 #define SMB2_SHARE_TYPE_PIPE 0x02 351 #define SMB2_SHARE_TYPE_PRINT 0x03 352 353 /* 354 * Possible ShareFlags - exactly one and only one of the first 4 caching flags 355 * must be set (any of the remaining, SHI1005, flags may be set individually 356 * or in combination. 357 */ 358 #define SMB2_SHAREFLAG_MANUAL_CACHING 0x00000000 359 #define SMB2_SHAREFLAG_AUTO_CACHING 0x00000010 360 #define SMB2_SHAREFLAG_VDO_CACHING 0x00000020 361 #define SMB2_SHAREFLAG_NO_CACHING 0x00000030 362 #define SHI1005_FLAGS_DFS 0x00000001 363 #define SHI1005_FLAGS_DFS_ROOT 0x00000002 364 #define SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS 0x00000100 365 #define SMB2_SHAREFLAG_FORCE_SHARED_DELETE 0x00000200 366 #define SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING 0x00000400 367 #define SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM 0x00000800 368 #define SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK 0x00001000 369 #define SMB2_SHAREFLAG_ENABLE_HASH_V1 0x00002000 370 #define SMB2_SHAREFLAG_ENABLE_HASH_V2 0x00004000 371 #define SHI1005_FLAGS_ENCRYPT_DATA 0x00008000 372 #define SMB2_SHAREFLAG_IDENTITY_REMOTING 0x00040000 /* 3.1.1 */ 373 #define SMB2_SHAREFLAG_COMPRESS_DATA 0x00100000 /* 3.1.1 */ 374 #define SMB2_SHAREFLAG_ISOLATED_TRANSPORT 0x00200000 375 #define SHI1005_FLAGS_ALL 0x0034FF33 376 377 /* Possible share capabilities */ 378 #define SMB2_SHARE_CAP_DFS cpu_to_le32(0x00000008) /* all dialects */ 379 #define SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY cpu_to_le32(0x00000010) /* 3.0 */ 380 #define SMB2_SHARE_CAP_SCALEOUT cpu_to_le32(0x00000020) /* 3.0 */ 381 #define SMB2_SHARE_CAP_CLUSTER cpu_to_le32(0x00000040) /* 3.0 */ 382 #define SMB2_SHARE_CAP_ASYMMETRIC cpu_to_le32(0x00000080) /* 3.02 */ 383 #define SMB2_SHARE_CAP_REDIRECT_TO_OWNER cpu_to_le32(0x00000100) /* 3.1.1 */ 384 385 struct smb2_tree_connect_rsp { 386 struct smb2_hdr hdr; 387 __le16 StructureSize; /* Must be 16 */ 388 __u8 ShareType; /* see below */ 389 __u8 Reserved; 390 __le32 ShareFlags; /* see below */ 391 __le32 Capabilities; /* see below */ 392 __le32 MaximalAccess; 393 } __packed; 394 395 struct smb2_tree_disconnect_req { 396 struct smb2_hdr hdr; 397 __le16 StructureSize; /* Must be 4 */ 398 __le16 Reserved; 399 } __packed; 400 401 struct smb2_tree_disconnect_rsp { 402 struct smb2_hdr hdr; 403 __le16 StructureSize; /* Must be 4 */ 404 __le16 Reserved; 405 } __packed; 406 407 408 /* 409 * SMB2_NEGOTIATE_PROTOCOL See MS-SMB2 section 2.2.3 410 */ 411 /* SecurityMode flags */ 412 #define SMB2_NEGOTIATE_SIGNING_ENABLED 0x0001 413 #define SMB2_NEGOTIATE_SIGNING_ENABLED_LE cpu_to_le16(0x0001) 414 #define SMB2_NEGOTIATE_SIGNING_REQUIRED 0x0002 415 #define SMB2_NEGOTIATE_SIGNING_REQUIRED_LE cpu_to_le16(0x0002) 416 #define SMB2_SEC_MODE_FLAGS_ALL 0x0003 417 418 /* Capabilities flags */ 419 #define SMB2_GLOBAL_CAP_DFS 0x00000001 420 #define SMB2_GLOBAL_CAP_LEASING 0x00000002 /* Resp only New to SMB2.1 */ 421 #define SMB2_GLOBAL_CAP_LARGE_MTU 0x00000004 /* Resp only New to SMB2.1 */ 422 #define SMB2_GLOBAL_CAP_MULTI_CHANNEL 0x00000008 /* New to SMB3 */ 423 #define SMB2_GLOBAL_CAP_PERSISTENT_HANDLES 0x00000010 /* New to SMB3 */ 424 #define SMB2_GLOBAL_CAP_DIRECTORY_LEASING 0x00000020 /* New to SMB3 */ 425 #define SMB2_GLOBAL_CAP_ENCRYPTION 0x00000040 /* New to SMB3 */ 426 #define SMB2_GLOBAL_CAP_NOTIFICATIONS 0x00000080 /* New to SMB3.1.1 */ 427 /* Internal types */ 428 #define SMB2_NT_FIND 0x00100000 429 #define SMB2_LARGE_FILES 0x00200000 430 431 #define SMB2_CLIENT_GUID_SIZE 16 432 #define SMB2_CREATE_GUID_SIZE 16 433 434 /* Dialects */ 435 #define SMB10_PROT_ID 0x0000 /* local only, not sent on wire w/CIFS negprot */ 436 #define SMB20_PROT_ID 0x0202 437 #define SMB21_PROT_ID 0x0210 438 #define SMB2X_PROT_ID 0x02FF 439 #define SMB30_PROT_ID 0x0300 440 #define SMB302_PROT_ID 0x0302 441 #define SMB311_PROT_ID 0x0311 442 #define BAD_PROT_ID 0xFFFF 443 444 #define SMB311_SALT_SIZE 32 445 /* Hash Algorithm Types */ 446 #define SMB2_PREAUTH_INTEGRITY_SHA512 cpu_to_le16(0x0001) 447 #define SMB2_PREAUTH_HASH_SIZE 64 448 449 /* Negotiate Contexts - ContextTypes. See MS-SMB2 section 2.2.3.1 for details */ 450 #define SMB2_PREAUTH_INTEGRITY_CAPABILITIES cpu_to_le16(1) 451 #define SMB2_ENCRYPTION_CAPABILITIES cpu_to_le16(2) 452 #define SMB2_COMPRESSION_CAPABILITIES cpu_to_le16(3) 453 #define SMB2_NETNAME_NEGOTIATE_CONTEXT_ID cpu_to_le16(5) 454 #define SMB2_TRANSPORT_CAPABILITIES cpu_to_le16(6) 455 #define SMB2_RDMA_TRANSFORM_CAPABILITIES cpu_to_le16(7) 456 #define SMB2_SIGNING_CAPABILITIES cpu_to_le16(8) 457 #define SMB2_POSIX_EXTENSIONS_AVAILABLE cpu_to_le16(0x100) 458 459 struct smb2_neg_context { 460 __le16 ContextType; 461 __le16 DataLength; 462 __le32 Reserved; 463 /* Followed by array of data. NOTE: some servers require padding to 8 byte boundary */ 464 } __packed; 465 466 /* 467 * SaltLength that the server send can be zero, so the only three required 468 * fields (all __le16) end up six bytes total, so the minimum context data len 469 * in the response is six bytes which accounts for 470 * 471 * HashAlgorithmCount, SaltLength, and 1 HashAlgorithm. 472 */ 473 #define MIN_PREAUTH_CTXT_DATA_LEN 6 474 475 struct smb2_preauth_neg_context { 476 __le16 ContextType; /* 1 */ 477 __le16 DataLength; 478 __le32 Reserved; 479 __le16 HashAlgorithmCount; /* 1 */ 480 __le16 SaltLength; 481 __le16 HashAlgorithms; /* HashAlgorithms[0] since only one defined */ 482 __u8 Salt[SMB311_SALT_SIZE]; 483 } __packed; 484 485 /* Encryption Algorithms Ciphers */ 486 #define SMB2_ENCRYPTION_AES128_CCM cpu_to_le16(0x0001) 487 #define SMB2_ENCRYPTION_AES128_GCM cpu_to_le16(0x0002) 488 #define SMB2_ENCRYPTION_AES256_CCM cpu_to_le16(0x0003) 489 #define SMB2_ENCRYPTION_AES256_GCM cpu_to_le16(0x0004) 490 491 /* Min encrypt context data is one cipher so 2 bytes + 2 byte count field */ 492 #define MIN_ENCRYPT_CTXT_DATA_LEN 4 493 struct smb2_encryption_neg_context { 494 __le16 ContextType; /* 2 */ 495 __le16 DataLength; 496 __le32 Reserved; 497 /* CipherCount usually 2, but can be 3 when AES256-GCM enabled */ 498 __le16 CipherCount; /* AES128-GCM and AES128-CCM by default */ 499 __le16 Ciphers[]; 500 } __packed; 501 502 /* See MS-SMB2 2.2.3.1.3 */ 503 #define SMB3_COMPRESS_NONE cpu_to_le16(0x0000) 504 #define SMB3_COMPRESS_LZNT1 cpu_to_le16(0x0001) 505 #define SMB3_COMPRESS_LZ77 cpu_to_le16(0x0002) 506 #define SMB3_COMPRESS_LZ77_HUFF cpu_to_le16(0x0003) 507 /* Pattern scanning algorithm See MS-SMB2 3.1.4.4.1 */ 508 #define SMB3_COMPRESS_PATTERN cpu_to_le16(0x0004) /* Pattern_V1 */ 509 #define SMB3_COMPRESS_LZ4 cpu_to_le16(0x0005) 510 511 /* Compression Flags */ 512 #define SMB2_COMPRESSION_CAPABILITIES_FLAG_NONE cpu_to_le32(0x00000000) 513 #define SMB2_COMPRESSION_CAPABILITIES_FLAG_CHAINED cpu_to_le32(0x00000001) 514 515 struct smb2_compression_capabilities_context { 516 __le16 ContextType; /* 3 */ 517 __le16 DataLength; 518 __le32 Reserved; 519 __le16 CompressionAlgorithmCount; 520 __le16 Padding; 521 __le32 Flags; 522 __le16 CompressionAlgorithms[3]; 523 __u16 Pad; /* Some servers require pad to DataLen multiple of 8 */ 524 /* Check if pad needed */ 525 } __packed; 526 527 /* 528 * For smb2_netname_negotiate_context_id See MS-SMB2 2.2.3.1.4. 529 * Its struct simply contains NetName, an array of Unicode characters 530 */ 531 struct smb2_netname_neg_context { 532 __le16 ContextType; /* 5 */ 533 __le16 DataLength; 534 __le32 Reserved; 535 __le16 NetName[]; /* hostname of target converted to UCS-2 */ 536 } __packed; 537 538 /* 539 * For smb2_transport_capabilities context see MS-SMB2 2.2.3.1.5 540 * and 2.2.4.1.5 541 */ 542 543 /* Flags */ 544 #define SMB2_ACCEPT_TRANSPORT_LEVEL_SECURITY 0x00000001 545 546 struct smb2_transport_capabilities_context { 547 __le16 ContextType; /* 6 */ 548 __le16 DataLength; 549 __u32 Reserved; 550 __le32 Flags; 551 __u32 Pad; 552 } __packed; 553 554 /* 555 * For rdma transform capabilities context see MS-SMB2 2.2.3.1.6 556 * and 2.2.4.1.6 557 */ 558 559 /* RDMA Transform IDs */ 560 #define SMB2_RDMA_TRANSFORM_NONE 0x0000 561 #define SMB2_RDMA_TRANSFORM_ENCRYPTION 0x0001 562 #define SMB2_RDMA_TRANSFORM_SIGNING 0x0002 563 564 struct smb2_rdma_transform_capabilities_context { 565 __le16 ContextType; /* 7 */ 566 __le16 DataLength; 567 __u32 Reserved; 568 __le16 TransformCount; 569 __u16 Reserved1; 570 __u32 Reserved2; 571 __le16 RDMATransformIds[]; 572 } __packed; 573 574 /* 575 * For signing capabilities context see MS-SMB2 2.2.3.1.7 576 * and 2.2.4.1.7 577 */ 578 579 /* Signing algorithms */ 580 #define SIGNING_ALG_HMAC_SHA256 0 581 #define SIGNING_ALG_HMAC_SHA256_LE cpu_to_le16(0) 582 #define SIGNING_ALG_AES_CMAC 1 583 #define SIGNING_ALG_AES_CMAC_LE cpu_to_le16(1) 584 #define SIGNING_ALG_AES_GMAC 2 585 #define SIGNING_ALG_AES_GMAC_LE cpu_to_le16(2) 586 587 struct smb2_signing_capabilities { 588 __le16 ContextType; /* 8 */ 589 __le16 DataLength; 590 __le32 Reserved; 591 __le16 SigningAlgorithmCount; 592 __le16 SigningAlgorithms[]; 593 /* Followed by padding to 8 byte boundary (required by some servers) */ 594 } __packed; 595 596 #define POSIX_CTXT_DATA_LEN 16 597 struct smb2_posix_neg_context { 598 __le16 ContextType; /* 0x100 */ 599 __le16 DataLength; 600 __le32 Reserved; 601 __u8 Name[16]; /* POSIX ctxt GUID 93AD25509CB411E7B42383DE968BCD7C */ 602 } __packed; 603 604 struct smb2_negotiate_req { 605 struct smb2_hdr hdr; 606 __le16 StructureSize; /* Must be 36 */ 607 __le16 DialectCount; 608 __le16 SecurityMode; 609 __le16 Reserved; /* MBZ */ 610 __le32 Capabilities; 611 __u8 ClientGUID[SMB2_CLIENT_GUID_SIZE]; 612 /* In SMB3.02 and earlier next three were MBZ le64 ClientStartTime */ 613 __le32 NegotiateContextOffset; /* SMB3.1.1 only. MBZ earlier */ 614 __le16 NegotiateContextCount; /* SMB3.1.1 only. MBZ earlier */ 615 __le16 Reserved2; 616 __le16 Dialects[]; 617 } __packed; 618 619 struct smb2_negotiate_rsp { 620 struct smb2_hdr hdr; 621 __le16 StructureSize; /* Must be 65 */ 622 __le16 SecurityMode; 623 __le16 DialectRevision; 624 __le16 NegotiateContextCount; /* Prior to SMB3.1.1 was Reserved & MBZ */ 625 __u8 ServerGUID[16]; 626 __le32 Capabilities; 627 __le32 MaxTransactSize; 628 __le32 MaxReadSize; 629 __le32 MaxWriteSize; 630 __le64 SystemTime; /* MBZ */ 631 __le64 ServerStartTime; 632 __le16 SecurityBufferOffset; 633 __le16 SecurityBufferLength; 634 __le32 NegotiateContextOffset; /* Pre:SMB3.1.1 was reserved/ignored */ 635 __u8 Buffer[]; /* variable length GSS security buffer */ 636 } __packed; 637 638 639 /* 640 * SMB2_SESSION_SETUP See MS-SMB2 section 2.2.5 641 */ 642 /* Flags */ 643 #define SMB2_SESSION_REQ_FLAG_BINDING 0x01 644 #define SMB2_SESSION_REQ_FLAG_ENCRYPT_DATA 0x04 645 646 struct smb2_sess_setup_req { 647 struct smb2_hdr hdr; 648 __le16 StructureSize; /* Must be 25 */ 649 __u8 Flags; 650 __u8 SecurityMode; 651 __le32 Capabilities; 652 __le32 Channel; 653 __le16 SecurityBufferOffset; 654 __le16 SecurityBufferLength; 655 __le64 PreviousSessionId; 656 __u8 Buffer[]; /* variable length GSS security buffer */ 657 } __packed; 658 659 /* Currently defined SessionFlags */ 660 #define SMB2_SESSION_FLAG_IS_GUEST 0x0001 661 #define SMB2_SESSION_FLAG_IS_GUEST_LE cpu_to_le16(0x0001) 662 #define SMB2_SESSION_FLAG_IS_NULL 0x0002 663 #define SMB2_SESSION_FLAG_IS_NULL_LE cpu_to_le16(0x0002) 664 #define SMB2_SESSION_FLAG_ENCRYPT_DATA 0x0004 665 #define SMB2_SESSION_FLAG_ENCRYPT_DATA_LE cpu_to_le16(0x0004) 666 667 struct smb2_sess_setup_rsp { 668 struct smb2_hdr hdr; 669 __le16 StructureSize; /* Must be 9 */ 670 __le16 SessionFlags; 671 __le16 SecurityBufferOffset; 672 __le16 SecurityBufferLength; 673 __u8 Buffer[]; /* variable length GSS security buffer */ 674 } __packed; 675 676 677 /* 678 * SMB2_LOGOFF See MS-SMB2 section 2.2.7 679 */ 680 struct smb2_logoff_req { 681 struct smb2_hdr hdr; 682 __le16 StructureSize; /* Must be 4 */ 683 __le16 Reserved; 684 } __packed; 685 686 struct smb2_logoff_rsp { 687 struct smb2_hdr hdr; 688 __le16 StructureSize; /* Must be 4 */ 689 __le16 Reserved; 690 } __packed; 691 692 693 /* 694 * SMB2_CLOSE See MS-SMB2 section 2.2.15 695 */ 696 /* Currently defined values for close flags */ 697 #define SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB cpu_to_le16(0x0001) 698 struct smb2_close_req { 699 struct smb2_hdr hdr; 700 __le16 StructureSize; /* Must be 24 */ 701 __le16 Flags; 702 __le32 Reserved; 703 __u64 PersistentFileId; /* opaque endianness */ 704 __u64 VolatileFileId; /* opaque endianness */ 705 } __packed; 706 707 /* 708 * Maximum size of a SMB2_CLOSE response is 64 (smb2 header) + 60 (data) 709 */ 710 #define MAX_SMB2_CLOSE_RESPONSE_SIZE 124 711 712 struct smb2_close_rsp { 713 struct smb2_hdr hdr; 714 __le16 StructureSize; /* 60 */ 715 __le16 Flags; 716 __le32 Reserved; 717 struct_group_attr(network_open_info, __packed, 718 __le64 CreationTime; 719 __le64 LastAccessTime; 720 __le64 LastWriteTime; 721 __le64 ChangeTime; 722 /* Beginning of FILE_STANDARD_INFO equivalent */ 723 __le64 AllocationSize; 724 __le64 EndOfFile; 725 __le32 Attributes; 726 ); 727 } __packed; 728 729 730 /* 731 * SMB2_READ See MS-SMB2 section 2.2.19 732 */ 733 /* For read request Flags field below, following flag is defined for SMB3.02 */ 734 #define SMB2_READFLAG_READ_UNBUFFERED 0x01 735 #define SMB2_READFLAG_REQUEST_COMPRESSED 0x02 /* See MS-SMB2 2.2.19 */ 736 737 /* Channel field for read and write: exactly one of following flags can be set*/ 738 #define SMB2_CHANNEL_NONE cpu_to_le32(0x00000000) 739 #define SMB2_CHANNEL_RDMA_V1 cpu_to_le32(0x00000001) 740 #define SMB2_CHANNEL_RDMA_V1_INVALIDATE cpu_to_le32(0x00000002) 741 #define SMB2_CHANNEL_RDMA_TRANSFORM cpu_to_le32(0x00000003) 742 743 /* SMB2 read request without RFC1001 length at the beginning */ 744 struct smb2_read_req { 745 struct smb2_hdr hdr; 746 __le16 StructureSize; /* Must be 49 */ 747 __u8 Padding; /* offset from start of SMB2 header to place read */ 748 __u8 Flags; /* MBZ unless SMB3.02 or later */ 749 __le32 Length; 750 __le64 Offset; 751 __u64 PersistentFileId; 752 __u64 VolatileFileId; 753 __le32 MinimumCount; 754 __le32 Channel; /* MBZ except for SMB3 or later */ 755 __le32 RemainingBytes; 756 __le16 ReadChannelInfoOffset; 757 __le16 ReadChannelInfoLength; 758 __u8 Buffer[]; 759 } __packed; 760 761 /* Read flags */ 762 #define SMB2_READFLAG_RESPONSE_NONE cpu_to_le32(0x00000000) 763 #define SMB2_READFLAG_RESPONSE_RDMA_TRANSFORM cpu_to_le32(0x00000001) 764 765 struct smb2_read_rsp { 766 struct smb2_hdr hdr; 767 __le16 StructureSize; /* Must be 17 */ 768 __u8 DataOffset; 769 __u8 Reserved; 770 __le32 DataLength; 771 __le32 DataRemaining; 772 __le32 Flags; 773 __u8 Buffer[]; 774 } __packed; 775 776 777 /* 778 * SMB2_WRITE See MS-SMB2 section 2.2.21 779 */ 780 /* For write request Flags field below the following flags are defined: */ 781 #define SMB2_WRITEFLAG_WRITE_THROUGH 0x00000001 /* SMB2.1 or later */ 782 #define SMB2_WRITEFLAG_WRITE_UNBUFFERED 0x00000002 /* SMB3.02 or later */ 783 784 struct smb2_write_req { 785 struct smb2_hdr hdr; 786 __le16 StructureSize; /* Must be 49 */ 787 __le16 DataOffset; /* offset from start of SMB2 header to write data */ 788 __le32 Length; 789 __le64 Offset; 790 __u64 PersistentFileId; /* opaque endianness */ 791 __u64 VolatileFileId; /* opaque endianness */ 792 __le32 Channel; /* MBZ unless SMB3.02 or later */ 793 __le32 RemainingBytes; 794 __le16 WriteChannelInfoOffset; 795 __le16 WriteChannelInfoLength; 796 __le32 Flags; 797 __u8 Buffer[]; 798 } __packed; 799 800 struct smb2_write_rsp { 801 struct smb2_hdr hdr; 802 __le16 StructureSize; /* Must be 17 */ 803 __u8 DataOffset; 804 __u8 Reserved; 805 __le32 DataLength; 806 __le32 DataRemaining; 807 __u32 Reserved2; 808 __u8 Buffer[]; 809 } __packed; 810 811 812 /* 813 * SMB2_FLUSH See MS-SMB2 section 2.2.17 814 */ 815 struct smb2_flush_req { 816 struct smb2_hdr hdr; 817 __le16 StructureSize; /* Must be 24 */ 818 __le16 Reserved1; 819 __le32 Reserved2; 820 __u64 PersistentFileId; 821 __u64 VolatileFileId; 822 } __packed; 823 824 struct smb2_flush_rsp { 825 struct smb2_hdr hdr; 826 __le16 StructureSize; 827 __le16 Reserved; 828 } __packed; 829 830 #define SMB2_LOCKFLAG_SHARED 0x0001 831 #define SMB2_LOCKFLAG_EXCLUSIVE 0x0002 832 #define SMB2_LOCKFLAG_UNLOCK 0x0004 833 #define SMB2_LOCKFLAG_FAIL_IMMEDIATELY 0x0010 834 #define SMB2_LOCKFLAG_MASK 0x0007 835 836 struct smb2_lock_element { 837 __le64 Offset; 838 __le64 Length; 839 __le32 Flags; 840 __le32 Reserved; 841 } __packed; 842 843 struct smb2_lock_req { 844 struct smb2_hdr hdr; 845 __le16 StructureSize; /* Must be 48 */ 846 __le16 LockCount; 847 /* 848 * The least significant four bits are the index, the other 28 bits are 849 * the lock sequence number (0 to 64). See MS-SMB2 2.2.26 850 */ 851 __le32 LockSequenceNumber; 852 __u64 PersistentFileId; 853 __u64 VolatileFileId; 854 /* Followed by at least one */ 855 union { 856 struct smb2_lock_element lock; 857 DECLARE_FLEX_ARRAY(struct smb2_lock_element, locks); 858 }; 859 } __packed; 860 861 struct smb2_lock_rsp { 862 struct smb2_hdr hdr; 863 __le16 StructureSize; /* Must be 4 */ 864 __le16 Reserved; 865 } __packed; 866 867 struct smb2_echo_req { 868 struct smb2_hdr hdr; 869 __le16 StructureSize; /* Must be 4 */ 870 __u16 Reserved; 871 } __packed; 872 873 struct smb2_echo_rsp { 874 struct smb2_hdr hdr; 875 __le16 StructureSize; /* Must be 4 */ 876 __u16 Reserved; 877 } __packed; 878 879 /* 880 * Valid FileInformation classes for query directory 881 * 882 * Note that these are a subset of the (file) QUERY_INFO levels defined 883 * later in this file (but since QUERY_DIRECTORY uses equivalent numbers 884 * we do not redefine them here) 885 * 886 * FileDirectoryInfomation 0x01 887 * FileFullDirectoryInformation 0x02 888 * FileIdFullDirectoryInformation 0x26 889 * FileBothDirectoryInformation 0x03 890 * FileIdBothDirectoryInformation 0x25 891 * FileNamesInformation 0x0C 892 * FileIdExtdDirectoryInformation 0x3C 893 */ 894 895 /* search (query_directory) Flags field */ 896 #define SMB2_RESTART_SCANS 0x01 897 #define SMB2_RETURN_SINGLE_ENTRY 0x02 898 #define SMB2_INDEX_SPECIFIED 0x04 899 #define SMB2_REOPEN 0x10 900 901 struct smb2_query_directory_req { 902 struct smb2_hdr hdr; 903 __le16 StructureSize; /* Must be 33 */ 904 __u8 FileInformationClass; 905 __u8 Flags; 906 __le32 FileIndex; 907 __u64 PersistentFileId; 908 __u64 VolatileFileId; 909 __le16 FileNameOffset; 910 __le16 FileNameLength; 911 __le32 OutputBufferLength; 912 __u8 Buffer[]; 913 } __packed; 914 915 struct smb2_query_directory_rsp { 916 struct smb2_hdr hdr; 917 __le16 StructureSize; /* Must be 9 */ 918 __le16 OutputBufferOffset; 919 __le32 OutputBufferLength; 920 __u8 Buffer[]; 921 } __packed; 922 923 /* DeviceType Flags */ 924 #define FILE_DEVICE_CD_ROM 0x00000002 925 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 926 #define FILE_DEVICE_DFS 0x00000006 927 #define FILE_DEVICE_DISK 0x00000007 928 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 929 #define FILE_DEVICE_FILE_SYSTEM 0x00000009 930 #define FILE_DEVICE_NAMED_PIPE 0x00000011 931 #define FILE_DEVICE_NETWORK 0x00000012 932 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 933 #define FILE_DEVICE_NULL 0x00000015 934 #define FILE_DEVICE_PARALLEL_PORT 0x00000016 935 #define FILE_DEVICE_PRINTER 0x00000018 936 #define FILE_DEVICE_SERIAL_PORT 0x0000001b 937 #define FILE_DEVICE_STREAMS 0x0000001e 938 #define FILE_DEVICE_TAPE 0x0000001f 939 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 940 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024 941 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 942 943 /* Device Characteristics */ 944 #define FILE_REMOVABLE_MEDIA 0x00000001 945 #define FILE_READ_ONLY_DEVICE 0x00000002 946 #define FILE_FLOPPY_DISKETTE 0x00000004 947 #define FILE_WRITE_ONCE_MEDIA 0x00000008 948 #define FILE_REMOTE_DEVICE 0x00000010 949 #define FILE_DEVICE_IS_MOUNTED 0x00000020 950 #define FILE_VIRTUAL_VOLUME 0x00000040 951 #define FILE_DEVICE_SECURE_OPEN 0x00000100 952 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 953 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 954 #define FILE_PORTABLE_DEVICE 0x00004000 955 #define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000 956 957 /* 958 * Maximum number of iovs we need for a set-info request. 959 * The largest one is rename/hardlink 960 * [0] : struct smb2_set_info_req + smb2_file_[rename|link]_info 961 * [1] : path 962 * [2] : compound padding 963 */ 964 #define SMB2_SET_INFO_IOV_SIZE 3 965 966 struct smb2_set_info_req { 967 struct smb2_hdr hdr; 968 __le16 StructureSize; /* Must be 33 */ 969 __u8 InfoType; 970 __u8 FileInfoClass; 971 __le32 BufferLength; 972 __le16 BufferOffset; 973 __u16 Reserved; 974 __le32 AdditionalInformation; 975 __u64 PersistentFileId; 976 __u64 VolatileFileId; 977 __u8 Buffer[]; 978 } __packed; 979 980 struct smb2_set_info_rsp { 981 struct smb2_hdr hdr; 982 __le16 StructureSize; /* Must be 2 */ 983 } __packed; 984 985 /* 986 * SMB2_NOTIFY See MS-SMB2 section 2.2.35 987 */ 988 /* notify flags */ 989 #define SMB2_WATCH_TREE 0x0001 990 991 /* notify completion filter flags. See MS-FSCC 2.6 and MS-SMB2 2.2.35 */ 992 #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 993 #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002 994 #define FILE_NOTIFY_CHANGE_NAME 0x00000003 995 #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004 996 #define FILE_NOTIFY_CHANGE_SIZE 0x00000008 997 #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010 998 #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020 999 #define FILE_NOTIFY_CHANGE_CREATION 0x00000040 1000 #define FILE_NOTIFY_CHANGE_EA 0x00000080 1001 #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100 1002 #define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200 1003 #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400 1004 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800 1005 1006 /* 1007 * SMB2 Notify Action Flags 1008 * See MS-FSCC 2.7.1 1009 */ 1010 #define FILE_ACTION_ADDED 0x00000001 1011 #define FILE_ACTION_REMOVED 0x00000002 1012 #define FILE_ACTION_MODIFIED 0x00000003 1013 #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 1014 #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 1015 #define FILE_ACTION_ADDED_STREAM 0x00000006 1016 #define FILE_ACTION_REMOVED_STREAM 0x00000007 1017 #define FILE_ACTION_MODIFIED_STREAM 0x00000008 1018 #define FILE_ACTION_REMOVED_BY_DELETE 0x00000009 1019 #define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A 1020 #define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B 1021 1022 /* See MS-SMB2 2.2.35 */ 1023 struct smb2_change_notify_req { 1024 struct smb2_hdr hdr; 1025 __le16 StructureSize; 1026 __le16 Flags; 1027 __le32 OutputBufferLength; 1028 __u64 PersistentFileId; /* opaque endianness */ 1029 __u64 VolatileFileId; /* opaque endianness */ 1030 __le32 CompletionFilter; 1031 __u32 Reserved; 1032 } __packed; 1033 1034 /* See MS-SMB2 2.2.36 */ 1035 struct smb2_change_notify_rsp { 1036 struct smb2_hdr hdr; 1037 __le16 StructureSize; /* Must be 9 */ 1038 __le16 OutputBufferOffset; 1039 __le32 OutputBufferLength; 1040 __u8 Buffer[]; /* array of file notify structs */ 1041 } __packed; 1042 1043 /* 1044 * SMB2_SERVER_TO_CLIENT_NOTIFICATION: See MS-SMB2 section 2.2.44 1045 */ 1046 1047 #define SMB2_NOTIFY_SESSION_CLOSED 0x0000 1048 1049 struct smb2_server_client_notification { 1050 struct smb2_hdr hdr; 1051 __le16 StructureSize; 1052 __u16 Reserved; /* MBZ */ 1053 __le32 NotificationType; 1054 __u8 NotificationBuffer[4]; /* MBZ */ 1055 } __packed; 1056 1057 /* 1058 * SMB2_CREATE See MS-SMB2 section 2.2.13 1059 */ 1060 /* Oplock levels */ 1061 #define SMB2_OPLOCK_LEVEL_NONE 0x00 1062 #define SMB2_OPLOCK_LEVEL_II 0x01 1063 #define SMB2_OPLOCK_LEVEL_EXCLUSIVE 0x08 1064 #define SMB2_OPLOCK_LEVEL_BATCH 0x09 1065 #define SMB2_OPLOCK_LEVEL_LEASE 0xFF 1066 /* Non-spec internal type */ 1067 #define SMB2_OPLOCK_LEVEL_NOCHANGE 0x99 1068 1069 /* Impersonation Levels. See MS-WPO section 9.7 and MSDN-IMPERS */ 1070 #define IL_ANONYMOUS cpu_to_le32(0x00000000) 1071 #define IL_IDENTIFICATION cpu_to_le32(0x00000001) 1072 #define IL_IMPERSONATION cpu_to_le32(0x00000002) 1073 #define IL_DELEGATE cpu_to_le32(0x00000003) 1074 1075 /* Desired Access Flags */ 1076 #define FILE_READ_DATA_LE cpu_to_le32(0x00000001) 1077 #define FILE_LIST_DIRECTORY_LE cpu_to_le32(0x00000001) 1078 #define FILE_WRITE_DATA_LE cpu_to_le32(0x00000002) 1079 #define FILE_APPEND_DATA_LE cpu_to_le32(0x00000004) 1080 #define FILE_ADD_SUBDIRECTORY_LE cpu_to_le32(0x00000004) 1081 #define FILE_READ_EA_LE cpu_to_le32(0x00000008) 1082 #define FILE_WRITE_EA_LE cpu_to_le32(0x00000010) 1083 #define FILE_EXECUTE_LE cpu_to_le32(0x00000020) 1084 #define FILE_DELETE_CHILD_LE cpu_to_le32(0x00000040) 1085 #define FILE_READ_ATTRIBUTES_LE cpu_to_le32(0x00000080) 1086 #define FILE_WRITE_ATTRIBUTES_LE cpu_to_le32(0x00000100) 1087 #define FILE_DELETE_LE cpu_to_le32(0x00010000) 1088 #define FILE_READ_CONTROL_LE cpu_to_le32(0x00020000) 1089 #define FILE_WRITE_DAC_LE cpu_to_le32(0x00040000) 1090 #define FILE_WRITE_OWNER_LE cpu_to_le32(0x00080000) 1091 #define FILE_SYNCHRONIZE_LE cpu_to_le32(0x00100000) 1092 #define FILE_ACCESS_SYSTEM_SECURITY_LE cpu_to_le32(0x01000000) 1093 #define FILE_MAXIMAL_ACCESS_LE cpu_to_le32(0x02000000) 1094 #define FILE_GENERIC_ALL_LE cpu_to_le32(0x10000000) 1095 #define FILE_GENERIC_EXECUTE_LE cpu_to_le32(0x20000000) 1096 #define FILE_GENERIC_WRITE_LE cpu_to_le32(0x40000000) 1097 #define FILE_GENERIC_READ_LE cpu_to_le32(0x80000000) 1098 #define DESIRED_ACCESS_MASK cpu_to_le32(0xF21F01FF) 1099 1100 1101 #define FILE_READ_DESIRED_ACCESS_LE (FILE_READ_DATA_LE | \ 1102 FILE_READ_EA_LE | \ 1103 FILE_GENERIC_READ_LE) 1104 #define FILE_WRITE_DESIRE_ACCESS_LE (FILE_WRITE_DATA_LE | \ 1105 FILE_APPEND_DATA_LE | \ 1106 FILE_WRITE_EA_LE | \ 1107 FILE_WRITE_ATTRIBUTES_LE | \ 1108 FILE_GENERIC_WRITE_LE) 1109 1110 /* ShareAccess Flags */ 1111 #define FILE_SHARE_READ_LE cpu_to_le32(0x00000001) 1112 #define FILE_SHARE_WRITE_LE cpu_to_le32(0x00000002) 1113 #define FILE_SHARE_DELETE_LE cpu_to_le32(0x00000004) 1114 #define FILE_SHARE_ALL_LE cpu_to_le32(0x00000007) 1115 1116 /* CreateDisposition Flags */ 1117 #define FILE_SUPERSEDE_LE cpu_to_le32(0x00000000) 1118 #define FILE_OPEN_LE cpu_to_le32(0x00000001) 1119 #define FILE_CREATE_LE cpu_to_le32(0x00000002) 1120 #define FILE_OPEN_IF_LE cpu_to_le32(0x00000003) 1121 #define FILE_OVERWRITE_LE cpu_to_le32(0x00000004) 1122 #define FILE_OVERWRITE_IF_LE cpu_to_le32(0x00000005) 1123 #define FILE_CREATE_MASK_LE cpu_to_le32(0x00000007) 1124 1125 /* CreateOptions Flags */ 1126 #define FILE_DIRECTORY_FILE_LE cpu_to_le32(0x00000001) 1127 /* same as #define CREATE_NOT_FILE_LE cpu_to_le32(0x00000001) */ 1128 #define FILE_WRITE_THROUGH_LE cpu_to_le32(0x00000002) 1129 #define FILE_SEQUENTIAL_ONLY_LE cpu_to_le32(0x00000004) 1130 #define FILE_NO_INTERMEDIATE_BUFFERING_LE cpu_to_le32(0x00000008) 1131 /* FILE_SYNCHRONOUS_IO_ALERT_LE cpu_to_le32(0x00000010) should be zero, ignored */ 1132 /* FILE_SYNCHRONOUS_IO_NONALERT cpu_to_le32(0x00000020) should be zero, ignored */ 1133 #define FILE_NON_DIRECTORY_FILE_LE cpu_to_le32(0x00000040) 1134 #define FILE_COMPLETE_IF_OPLOCKED_LE cpu_to_le32(0x00000100) 1135 #define FILE_NO_EA_KNOWLEDGE_LE cpu_to_le32(0x00000200) 1136 /* FILE_OPEN_REMOTE_INSTANCE cpu_to_le32(0x00000400) should be zero, ignored */ 1137 #define FILE_RANDOM_ACCESS_LE cpu_to_le32(0x00000800) 1138 #define FILE_DELETE_ON_CLOSE_LE cpu_to_le32(0x00001000) /* MBZ */ 1139 #define FILE_OPEN_BY_FILE_ID_LE cpu_to_le32(0x00002000) 1140 #define FILE_OPEN_FOR_BACKUP_INTENT_LE cpu_to_le32(0x00004000) 1141 #define FILE_NO_COMPRESSION_LE cpu_to_le32(0x00008000) 1142 /* FILE_OPEN_REQUIRING_OPLOCK cpu_to_le32(0x00010000) should be zero, ignored */ 1143 /* FILE_DISALLOW_EXCLUSIVE cpu_to_le32(0x00020000) should be zero, ignored */ 1144 /* FILE_RESERVE_OPFILTER cpu_to_le32(0x00100000) MBZ */ 1145 #define FILE_OPEN_REPARSE_POINT_LE cpu_to_le32(0x00200000) 1146 #define FILE_OPEN_NO_RECALL_LE cpu_to_le32(0x00400000) 1147 /* #define FILE_OPEN_FOR_FREE_SPACE_QUERY cpu_to_le32(0x00800000) should be zero, ignored */ 1148 #define CREATE_OPTIONS_MASK_LE cpu_to_le32(0x00FFFFFF) 1149 1150 #define FILE_READ_RIGHTS_LE (FILE_READ_DATA_LE | FILE_READ_EA_LE \ 1151 | FILE_READ_ATTRIBUTES_LE) 1152 #define FILE_WRITE_RIGHTS_LE (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE \ 1153 | FILE_WRITE_EA_LE | FILE_WRITE_ATTRIBUTES_LE) 1154 #define FILE_EXEC_RIGHTS_LE (FILE_EXECUTE_LE) 1155 1156 /* Create Context Values */ 1157 #define SMB2_CREATE_EA_BUFFER "ExtA" /* extended attributes */ 1158 #define SMB2_CREATE_SD_BUFFER "SecD" /* security descriptor */ 1159 #define SMB2_CREATE_DURABLE_HANDLE_REQUEST "DHnQ" 1160 #define SMB2_CREATE_DURABLE_HANDLE_RECONNECT "DHnC" 1161 #define SMB2_CREATE_ALLOCATION_SIZE "AlSi" 1162 #define SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST "MxAc" 1163 #define SMB2_CREATE_TIMEWARP_REQUEST "TWrp" 1164 #define SMB2_CREATE_QUERY_ON_DISK_ID "QFid" 1165 #define SMB2_CREATE_REQUEST_LEASE "RqLs" 1166 #define SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 "DH2Q" 1167 #define SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 "DH2C" 1168 #define SMB2_CREATE_TAG_POSIX "\x93\xAD\x25\x50\x9C\xB4\x11\xE7\xB4\x23\x83\xDE\x96\x8B\xCD\x7C" 1169 #define SMB2_CREATE_APP_INSTANCE_ID "\x45\xBC\xA6\x6A\xEF\xA7\xF7\x4A\x90\x08\xFA\x46\x2E\x14\x4D\x74" 1170 #define SMB2_CREATE_APP_INSTANCE_VERSION "\xB9\x82\xD0\xB7\x3B\x56\x07\x4F\xA0\x7B\x52\x4A\x81\x16\xA0\x10" 1171 #define SVHDX_OPEN_DEVICE_CONTEXT "\x9C\xCB\xCF\x9E\x04\xC1\xE6\x43\x98\x0E\x15\x8D\xA1\xF6\xEC\x83" 1172 #define SMB2_CREATE_TAG_AAPL "AAPL" 1173 1174 /* Flag (SMB3 open response) values */ 1175 #define SMB2_CREATE_FLAG_REPARSEPOINT 0x01 1176 1177 struct create_context { 1178 /* New members must be added within the struct_group() macro below. */ 1179 __struct_group(create_context_hdr, hdr, __packed, 1180 __le32 Next; 1181 __le16 NameOffset; 1182 __le16 NameLength; 1183 __le16 Reserved; 1184 __le16 DataOffset; 1185 __le32 DataLength; 1186 ); 1187 __u8 Buffer[]; 1188 } __packed; 1189 static_assert(offsetof(struct create_context, Buffer) == sizeof(struct create_context_hdr), 1190 "struct member likely outside of __struct_group()"); 1191 1192 struct smb2_create_req { 1193 struct smb2_hdr hdr; 1194 __le16 StructureSize; /* Must be 57 */ 1195 __u8 SecurityFlags; 1196 __u8 RequestedOplockLevel; 1197 __le32 ImpersonationLevel; 1198 __le64 SmbCreateFlags; 1199 __le64 Reserved; 1200 __le32 DesiredAccess; 1201 __le32 FileAttributes; 1202 __le32 ShareAccess; 1203 __le32 CreateDisposition; 1204 __le32 CreateOptions; 1205 __le16 NameOffset; 1206 __le16 NameLength; 1207 __le32 CreateContextsOffset; 1208 __le32 CreateContextsLength; 1209 __u8 Buffer[]; 1210 } __packed; 1211 1212 struct smb2_create_rsp { 1213 struct smb2_hdr hdr; 1214 __le16 StructureSize; /* Must be 89 */ 1215 __u8 OplockLevel; 1216 __u8 Flags; /* 0x01 if reparse point */ 1217 __le32 CreateAction; 1218 __le64 CreationTime; 1219 __le64 LastAccessTime; 1220 __le64 LastWriteTime; 1221 __le64 ChangeTime; 1222 __le64 AllocationSize; 1223 __le64 EndofFile; 1224 __le32 FileAttributes; 1225 __le32 Reserved2; 1226 __u64 PersistentFileId; 1227 __u64 VolatileFileId; 1228 __le32 CreateContextsOffset; 1229 __le32 CreateContextsLength; 1230 __u8 Buffer[]; 1231 } __packed; 1232 1233 struct create_posix { 1234 struct create_context_hdr ccontext; 1235 __u8 Name[16]; 1236 __le32 Mode; 1237 __u32 Reserved; 1238 } __packed; 1239 1240 /* See MS-SMB2 2.2.13.2.3 and MS-SMB2 2.2.13.2.4 */ 1241 typedef struct { 1242 struct create_context_hdr ccontext; 1243 __u8 Name[8]; 1244 union { 1245 __u8 Reserved[16]; 1246 struct { 1247 __u64 PersistentFileId; 1248 __u64 VolatileFileId; 1249 } Fid; 1250 } Data; 1251 } __packed create_durable_req_t, create_durable_reconn_t; 1252 1253 /* See MS-SMB2 2.2.13.2.5 */ 1254 struct create_mxac_req { 1255 struct create_context_hdr ccontext; 1256 __u8 Name[8]; 1257 __le64 Timestamp; 1258 } __packed; 1259 1260 /* 1261 * Flags 1262 * See MS-SMB2 2.2.13.2.11 1263 * MS-SMB2 2.2.13.2.12 1264 * MS-SMB2 2.2.14.2.12 1265 */ 1266 #define SMB2_DHANDLE_FLAG_PERSISTENT 0x00000002 1267 1268 /* See MS-SMB2 2.2.13.2.11 */ 1269 struct durable_context_v2_req { 1270 __le32 Timeout; 1271 __le32 Flags; /* see SMB2_DHANDLE_FLAG_PERSISTENT */ 1272 __u64 Reserved; 1273 __u8 CreateGuid[16]; 1274 } __packed; 1275 1276 struct create_durable_req_v2 { 1277 struct create_context_hdr ccontext; 1278 __u8 Name[8]; 1279 struct durable_context_v2_req dcontext; 1280 } __packed; 1281 1282 /* See MS-SMB2 2.2.13.2.12 */ 1283 struct durable_reconnect_context_v2 { 1284 struct { 1285 __u64 PersistentFileId; 1286 __u64 VolatileFileId; 1287 } Fid; 1288 __u8 CreateGuid[16]; 1289 __le32 Flags; /* see SMB2_DHANDLE_FLAG_PERSISTENT */ 1290 } __packed; 1291 1292 struct create_durable_handle_reconnect_v2 { 1293 struct create_context_hdr ccontext; 1294 __u8 Name[8]; 1295 struct durable_reconnect_context_v2 dcontext; 1296 } __packed; 1297 1298 /* See MS-SMB2 2.2.14.2.12 */ 1299 struct durable_context_v2_rsp { 1300 __le32 Timeout; 1301 __le32 Flags; /* see SMB2_DHANDLE_FLAG_PERSISTENT */ 1302 } __packed; 1303 1304 struct create_durable_rsp_v2 { 1305 struct create_context_hdr ccontext; 1306 __u8 Name[8]; 1307 struct durable_context_v2_rsp dcontext; 1308 } __packed; 1309 1310 /* See MS-SMB2 2.2.14.2.5 */ 1311 struct create_mxac_rsp { 1312 struct create_context_hdr ccontext; 1313 __u8 Name[8]; 1314 __le32 QueryStatus; 1315 __le32 MaximalAccess; 1316 } __packed; 1317 1318 #define SMB2_LEASE_NONE_LE cpu_to_le32(0x00) 1319 #define SMB2_LEASE_READ_CACHING_LE cpu_to_le32(0x01) 1320 #define SMB2_LEASE_HANDLE_CACHING_LE cpu_to_le32(0x02) 1321 #define SMB2_LEASE_WRITE_CACHING_LE cpu_to_le32(0x04) 1322 1323 #define SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE cpu_to_le32(0x02) 1324 #define SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE cpu_to_le32(0x04) 1325 1326 #define SMB2_LEASE_KEY_SIZE 16 1327 1328 /* See MS-SMB2 2.2.13.2.8 */ 1329 struct lease_context { 1330 __u8 LeaseKey[SMB2_LEASE_KEY_SIZE]; 1331 __le32 LeaseState; 1332 __le32 LeaseFlags; 1333 __le64 LeaseDuration; 1334 } __packed; 1335 1336 /* See MS-SMB2 2.2.13.2.10 */ 1337 struct lease_context_v2 { 1338 __u8 LeaseKey[SMB2_LEASE_KEY_SIZE]; 1339 __le32 LeaseState; 1340 __le32 LeaseFlags; 1341 __le64 LeaseDuration; 1342 __u8 ParentLeaseKey[SMB2_LEASE_KEY_SIZE]; 1343 __le16 Epoch; 1344 __le16 Reserved; 1345 } __packed; 1346 1347 struct create_lease { 1348 struct create_context_hdr ccontext; 1349 __u8 Name[8]; 1350 struct lease_context lcontext; 1351 } __packed; 1352 1353 struct create_lease_v2 { 1354 struct create_context_hdr ccontext; 1355 __u8 Name[8]; 1356 struct lease_context_v2 lcontext; 1357 __u8 Pad[4]; 1358 } __packed; 1359 1360 /* See MS-SMB2 2.2.14.2.9 */ 1361 struct create_disk_id_rsp { 1362 struct create_context_hdr ccontext; 1363 __u8 Name[8]; 1364 __le64 DiskFileId; 1365 __le64 VolumeId; 1366 __u8 Reserved[16]; 1367 } __packed; 1368 1369 /* See MS-SMB2 2.2.13.2.13 */ 1370 struct create_app_inst_id { 1371 struct create_context_hdr ccontext; 1372 __u8 Name[16]; 1373 __le32 StructureSize; /* Must be 20 */ 1374 __u16 Reserved; 1375 __u8 AppInstanceId[16]; 1376 } __packed; 1377 1378 /* See MS-SMB2 2.2.13.2.15 */ 1379 struct create_app_inst_id_vers { 1380 struct create_context_hdr ccontext; 1381 __u8 Name[16]; 1382 __le32 StructureSize; /* Must be 24 */ 1383 __u16 Reserved; 1384 __u32 Padding; 1385 __le64 AppInstanceVersionHigh; 1386 __le64 AppInstanceVersionLow; 1387 } __packed; 1388 1389 /* See MS-SMB2 2.2.31 and 2.2.32 */ 1390 struct smb2_ioctl_req { 1391 struct smb2_hdr hdr; 1392 __le16 StructureSize; /* Must be 57 */ 1393 __le16 Reserved; /* offset from start of SMB2 header to write data */ 1394 __le32 CtlCode; 1395 __u64 PersistentFileId; 1396 __u64 VolatileFileId; 1397 __le32 InputOffset; /* Reserved MBZ */ 1398 __le32 InputCount; 1399 __le32 MaxInputResponse; 1400 __le32 OutputOffset; 1401 __le32 OutputCount; 1402 __le32 MaxOutputResponse; 1403 __le32 Flags; 1404 __le32 Reserved2; 1405 __u8 Buffer[]; 1406 } __packed; 1407 1408 /* See MS-SMB2 2.2.31.1.1 */ 1409 struct srv_copychunk { 1410 __le64 SourceOffset; 1411 __le64 TargetOffset; 1412 __le32 Length; 1413 __le32 Reserved; 1414 } __packed; 1415 1416 #define COPY_CHUNK_RES_KEY_SIZE 24 1417 1418 /* See MS-SMB2 2.2.31.1 */ 1419 /* this goes in the ioctl buffer when doing a copychunk request */ 1420 struct copychunk_ioctl_req { 1421 union { 1422 char SourceKey[COPY_CHUNK_RES_KEY_SIZE]; 1423 __le64 SourceKeyU64[3]; 1424 }; 1425 __le32 ChunkCount; 1426 __le32 Reserved; 1427 struct srv_copychunk Chunks[] __counted_by_le(ChunkCount); 1428 } __packed; 1429 1430 /* See MS-SMB2 2.2.32.1 */ 1431 struct copychunk_ioctl_rsp { 1432 __le32 ChunksWritten; 1433 __le32 ChunkBytesWritten; 1434 __le32 TotalBytesWritten; 1435 } __packed; 1436 1437 /* See MS-SMB2 2.2.32.3 */ 1438 struct resume_key_ioctl_rsp { 1439 union { 1440 char ResumeKey[COPY_CHUNK_RES_KEY_SIZE]; 1441 __u64 ResumeKeyU64[3]; 1442 }; 1443 __le32 ContextLength; /* MBZ */ 1444 char Context[]; /* ignored, Windows sets to 4 bytes of zero */ 1445 } __packed; 1446 1447 struct smb2_ioctl_rsp { 1448 struct smb2_hdr hdr; 1449 __le16 StructureSize; /* Must be 49 */ 1450 __le16 Reserved; 1451 __le32 CtlCode; 1452 __u64 PersistentFileId; 1453 __u64 VolatileFileId; 1454 __le32 InputOffset; /* Reserved MBZ */ 1455 __le32 InputCount; 1456 __le32 OutputOffset; 1457 __le32 OutputCount; 1458 __le32 Flags; 1459 __le32 Reserved2; 1460 __u8 Buffer[]; 1461 } __packed; 1462 1463 /* See MS-SMB2 2.2.32.5.1.1 */ 1464 struct smb_sockaddr_in { 1465 __be16 Port; 1466 __be32 IPv4Address; 1467 __u8 Reserved[8]; 1468 } __packed; 1469 1470 /* See MS-SMB2 2.2.32.5.1.2 */ 1471 struct smb_sockaddr_in6 { 1472 __be16 Port; 1473 __be32 FlowInfo; 1474 __u8 IPv6Address[16]; 1475 __be32 ScopeId; 1476 } __packed; 1477 1478 /* See MS-SMB2 2.2.32.5 and MS-SMB2 2.2.32.5.1 */ 1479 #define RSS_CAPABLE cpu_to_le32(0x00000001) 1480 #define RDMA_CAPABLE cpu_to_le32(0x00000002) 1481 #define INTERNETWORK cpu_to_le16(0x0002) 1482 #define INTERNETWORKV6 cpu_to_le16(0x0017) 1483 struct network_interface_info_ioctl_rsp { 1484 __le32 Next; /* next interface. zero if this is last one */ 1485 __le32 IfIndex; 1486 __le32 Capability; /* RSS or RDMA Capable */ 1487 __le32 Reserved; 1488 __le64 LinkSpeed; 1489 union { 1490 char SockAddr_Storage[128]; 1491 struct { 1492 __le16 Family; 1493 __u8 Buffer[126]; 1494 }; 1495 }; 1496 } __packed; 1497 1498 /* this goes in the ioctl buffer when doing FSCTL_SET_ZERO_DATA */ 1499 struct file_zero_data_information { 1500 __le64 FileOffset; 1501 __le64 BeyondFinalZero; 1502 } __packed; 1503 1504 /* See MS-FSCC 2.3.7 */ 1505 struct duplicate_extents_to_file { 1506 __u64 PersistentFileHandle; /* source file handle, opaque endianness */ 1507 __u64 VolatileFileHandle; 1508 __le64 SourceFileOffset; 1509 __le64 TargetFileOffset; 1510 __le64 ByteCount; /* Bytes to be copied */ 1511 } __packed; 1512 1513 /* See MS-FSCC 2.3.9 */ 1514 #define DUPLICATE_EXTENTS_DATA_EX_SOURCE_ATOMIC 0x00000001 1515 struct duplicate_extents_to_file_ex { 1516 __le64 StructureSize; /* MUST be set to 0x30 */ 1517 __u64 PersistentFileHandle; /* source file handle, opaque endianness */ 1518 __u64 VolatileFileHandle; 1519 __le64 SourceFileOffset; 1520 __le64 TargetFileOffset; 1521 __le64 ByteCount; /* Bytes to be copied */ 1522 __le32 Flags; 1523 __le32 Reserved; 1524 } __packed; 1525 1526 1527 /* See MS-FSCC 2.3.20 */ 1528 struct fsctl_get_integrity_information_rsp { 1529 __le16 ChecksumAlgorithm; 1530 __le16 Reserved; 1531 __le32 Flags; 1532 __le32 ChecksumChunkSizeInBytes; 1533 __le32 ClusterSizeInBytes; 1534 } __packed; 1535 1536 /* See MS-FSCC 2.3.55 */ 1537 struct fsctl_query_file_regions_req { 1538 __le64 FileOffset; 1539 __le64 Length; 1540 __le32 DesiredUsage; 1541 __le32 Reserved; 1542 } __packed; 1543 1544 /* DesiredUsage flags see MS-FSCC 2.3.56.1 */ 1545 #define FILE_USAGE_INVALID_RANGE 0x00000000 1546 #define FILE_USAGE_VALID_CACHED_DATA 0x00000001 1547 #define FILE_USAGE_NONCACHED_DATA 0x00000002 1548 1549 struct file_region_info { 1550 __le64 FileOffset; 1551 __le64 Length; 1552 __le32 DesiredUsage; 1553 __le32 Reserved; 1554 } __packed; 1555 1556 /* See MS-FSCC 2.3.56 */ 1557 struct fsctl_query_file_region_rsp { 1558 __le32 Flags; 1559 __le32 TotalRegionEntryCount; 1560 __le32 RegionEntryCount; 1561 __u32 Reserved; 1562 struct file_region_info Regions[]; 1563 } __packed; 1564 1565 /* See MS-FSCC 2.3.58 */ 1566 struct fsctl_query_on_disk_vol_info_rsp { 1567 __le64 DirectoryCount; 1568 __le64 FileCount; 1569 __le16 FsFormatMajVersion; 1570 __le16 FsFormatMinVersion; 1571 __u8 FsFormatName[24]; 1572 __le64 FormatTime; 1573 __le64 LastUpdateTime; 1574 __u8 CopyrightInfo[68]; 1575 __u8 AbstractInfo[68]; 1576 __u8 FormatImplInfo[68]; 1577 __u8 LastModifyImplInfo[68]; 1578 } __packed; 1579 1580 /* See MS-FSCC 2.3.73 */ 1581 struct fsctl_set_integrity_information_req { 1582 __le16 ChecksumAlgorithm; 1583 __le16 Reserved; 1584 __le32 Flags; 1585 } __packed; 1586 1587 /* See MS-FSCC 2.3.75 */ 1588 struct fsctl_set_integrity_info_ex_req { 1589 __u8 EnableIntegrity; 1590 __u8 KeepState; 1591 __u16 Reserved; 1592 __le32 Flags; 1593 __u8 Version; 1594 __u8 Reserved2[7]; 1595 } __packed; 1596 1597 /* Integrity ChecksumAlgorithm choices for above */ 1598 #define CHECKSUM_TYPE_NONE 0x0000 1599 #define CHECKSUM_TYPE_CRC64 0x0002 1600 #define CHECKSUM_TYPE_UNCHANGED 0xFFFF /* set only */ 1601 1602 /* Integrity flags for above */ 1603 #define FSCTL_INTEGRITY_FLAG_CHECKSUM_ENFORCEMENT_OFF 0x00000001 1604 1605 /* Reparse structures - see MS-FSCC 2.1.2 */ 1606 1607 /* struct fsctl_reparse_info_req is empty, only response structs (see below) */ 1608 struct reparse_data_buffer { 1609 __le32 ReparseTag; 1610 __le16 ReparseDataLength; 1611 __u16 Reserved; 1612 __u8 DataBuffer[]; /* Variable Length */ 1613 } __packed; 1614 1615 struct reparse_guid_data_buffer { 1616 __le32 ReparseTag; 1617 __le16 ReparseDataLength; 1618 __u16 Reserved; 1619 __u8 ReparseGuid[16]; 1620 __u8 DataBuffer[]; /* Variable Length */ 1621 } __packed; 1622 1623 struct reparse_mount_point_data_buffer { 1624 __le32 ReparseTag; 1625 __le16 ReparseDataLength; 1626 __u16 Reserved; 1627 __le16 SubstituteNameOffset; 1628 __le16 SubstituteNameLength; 1629 __le16 PrintNameOffset; 1630 __le16 PrintNameLength; 1631 __u8 PathBuffer[]; /* Variable Length */ 1632 } __packed; 1633 1634 #define SYMLINK_FLAG_RELATIVE 0x00000001 1635 1636 struct reparse_symlink_data_buffer { 1637 __le32 ReparseTag; 1638 __le16 ReparseDataLength; 1639 __u16 Reserved; 1640 __le16 SubstituteNameOffset; 1641 __le16 SubstituteNameLength; 1642 __le16 PrintNameOffset; 1643 __le16 PrintNameLength; 1644 __le32 Flags; 1645 __u8 PathBuffer[]; /* Variable Length */ 1646 } __packed; 1647 1648 /* For IO_REPARSE_TAG_NFS - see MS-FSCC 2.1.2.6 */ 1649 #define NFS_SPECFILE_LNK 0x00000000014B4E4C 1650 #define NFS_SPECFILE_CHR 0x0000000000524843 1651 #define NFS_SPECFILE_BLK 0x00000000004B4C42 1652 #define NFS_SPECFILE_FIFO 0x000000004F464946 1653 #define NFS_SPECFILE_SOCK 0x000000004B434F53 1654 struct reparse_nfs_data_buffer { 1655 __le32 ReparseTag; 1656 __le16 ReparseDataLength; 1657 __u16 Reserved; 1658 __le64 InodeType; /* NFS_SPECFILE_* */ 1659 __u8 DataBuffer[]; 1660 } __packed; 1661 1662 /* For IO_REPARSE_TAG_LX_SYMLINK - see MS-FSCC 2.1.2.7 */ 1663 struct reparse_wsl_symlink_data_buffer { 1664 __le32 ReparseTag; 1665 __le16 ReparseDataLength; 1666 __u16 Reserved; 1667 __le32 Version; /* Always 2 */ 1668 __u8 Target[]; /* Variable Length UTF-8 string without nul-term */ 1669 } __packed; 1670 1671 struct validate_negotiate_info_req { 1672 __le32 Capabilities; 1673 __u8 Guid[SMB2_CLIENT_GUID_SIZE]; 1674 __le16 SecurityMode; 1675 __le16 DialectCount; 1676 __le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */ 1677 } __packed; 1678 1679 struct validate_negotiate_info_rsp { 1680 __le32 Capabilities; 1681 __u8 Guid[SMB2_CLIENT_GUID_SIZE]; 1682 __le16 SecurityMode; 1683 __le16 Dialect; /* Dialect in use for the connection */ 1684 } __packed; 1685 1686 1687 /* Possible InfoType values */ 1688 #define SMB2_O_INFO_FILE 0x01 1689 #define SMB2_O_INFO_FILESYSTEM 0x02 1690 #define SMB2_O_INFO_SECURITY 0x03 1691 #define SMB2_O_INFO_QUOTA 0x04 1692 1693 /* SMB2 Query Info see MS-SMB2 (2.2.37) or MS-DTYP */ 1694 1695 /* List of QUERY INFO levels (those also valid for QUERY_DIR are noted below */ 1696 #define FILE_DIRECTORY_INFORMATION 1 /* also for QUERY_DIR */ 1697 #define FILE_FULL_DIRECTORY_INFORMATION 2 /* also for QUERY_DIR */ 1698 #define FILE_BOTH_DIRECTORY_INFORMATION 3 /* also for QUERY_DIR */ 1699 #define FILE_BASIC_INFORMATION 4 1700 #define FILE_STANDARD_INFORMATION 5 1701 #define FILE_INTERNAL_INFORMATION 6 1702 #define FILE_EA_INFORMATION 7 1703 #define FILE_ACCESS_INFORMATION 8 1704 #define FILE_NAME_INFORMATION 9 1705 #define FILE_RENAME_INFORMATION 10 1706 #define FILE_LINK_INFORMATION 11 1707 #define FILE_NAMES_INFORMATION 12 /* also for QUERY_DIR */ 1708 #define FILE_DISPOSITION_INFORMATION 13 1709 #define FILE_POSITION_INFORMATION 14 1710 #define FILE_FULL_EA_INFORMATION 15 1711 #define FILE_MODE_INFORMATION 16 1712 #define FILE_ALIGNMENT_INFORMATION 17 1713 #define FILE_ALL_INFORMATION 18 1714 #define FILE_ALLOCATION_INFORMATION 19 1715 #define FILE_END_OF_FILE_INFORMATION 20 1716 #define FILE_ALTERNATE_NAME_INFORMATION 21 1717 #define FILE_STREAM_INFORMATION 22 1718 #define FILE_PIPE_INFORMATION 23 1719 #define FILE_PIPE_LOCAL_INFORMATION 24 1720 #define FILE_PIPE_REMOTE_INFORMATION 25 1721 #define FILE_MAILSLOT_QUERY_INFORMATION 26 1722 #define FILE_MAILSLOT_SET_INFORMATION 27 1723 #define FILE_COMPRESSION_INFORMATION 28 1724 #define FILE_OBJECT_ID_INFORMATION 29 1725 /* Number 30 not defined in documents */ 1726 #define FILE_MOVE_CLUSTER_INFORMATION 31 1727 #define FILE_QUOTA_INFORMATION 32 1728 #define FILE_REPARSE_POINT_INFORMATION 33 1729 #define FILE_NETWORK_OPEN_INFORMATION 34 1730 #define FILE_ATTRIBUTE_TAG_INFORMATION 35 1731 #define FILE_TRACKING_INFORMATION 36 1732 #define FILEID_BOTH_DIRECTORY_INFORMATION 37 /* also for QUERY_DIR */ 1733 #define FILEID_FULL_DIRECTORY_INFORMATION 38 /* also for QUERY_DIR */ 1734 #define FILE_VALID_DATA_LENGTH_INFORMATION 39 1735 #define FILE_SHORT_NAME_INFORMATION 40 1736 #define FILE_SFIO_RESERVE_INFORMATION 44 1737 #define FILE_SFIO_VOLUME_INFORMATION 45 1738 #define FILE_HARD_LINK_INFORMATION 46 1739 #define FILE_NORMALIZED_NAME_INFORMATION 48 1740 #define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50 1741 #define FILE_STANDARD_LINK_INFORMATION 54 1742 #define FILE_ID_INFORMATION 59 1743 #define FILE_ID_EXTD_DIRECTORY_INFORMATION 60 /* also for QUERY_DIR */ 1744 /* Used for Query Info and Find File POSIX Info for SMB3.1.1 and SMB1 */ 1745 #define SMB_FIND_FILE_POSIX_INFO 0x064 1746 1747 /* Security info type additionalinfo flags. */ 1748 #define OWNER_SECINFO 0x00000001 1749 #define GROUP_SECINFO 0x00000002 1750 #define DACL_SECINFO 0x00000004 1751 #define SACL_SECINFO 0x00000008 1752 #define LABEL_SECINFO 0x00000010 1753 #define ATTRIBUTE_SECINFO 0x00000020 1754 #define SCOPE_SECINFO 0x00000040 1755 #define BACKUP_SECINFO 0x00010000 1756 #define UNPROTECTED_SACL_SECINFO 0x10000000 1757 #define UNPROTECTED_DACL_SECINFO 0x20000000 1758 #define PROTECTED_SACL_SECINFO 0x40000000 1759 #define PROTECTED_DACL_SECINFO 0x80000000 1760 1761 /* Flags used for FileFullEAinfo */ 1762 #define SL_RESTART_SCAN 0x00000001 1763 #define SL_RETURN_SINGLE_ENTRY 0x00000002 1764 #define SL_INDEX_SPECIFIED 0x00000004 1765 1766 struct smb2_query_info_req { 1767 struct smb2_hdr hdr; 1768 __le16 StructureSize; /* Must be 41 */ 1769 __u8 InfoType; 1770 __u8 FileInfoClass; 1771 __le32 OutputBufferLength; 1772 __le16 InputBufferOffset; 1773 __u16 Reserved; 1774 __le32 InputBufferLength; 1775 __le32 AdditionalInformation; 1776 __le32 Flags; 1777 __u64 PersistentFileId; 1778 __u64 VolatileFileId; 1779 __u8 Buffer[]; 1780 } __packed; 1781 1782 struct smb2_query_info_rsp { 1783 struct smb2_hdr hdr; 1784 __le16 StructureSize; /* Must be 9 */ 1785 __le16 OutputBufferOffset; 1786 __le32 OutputBufferLength; 1787 __u8 Buffer[]; 1788 } __packed; 1789 1790 /* 1791 * PDU query infolevel structure definitions 1792 */ 1793 1794 /* See MS-FSCC 2.3.52 */ 1795 struct file_allocated_range_buffer { 1796 __le64 file_offset; 1797 __le64 length; 1798 } __packed; 1799 1800 struct smb2_file_internal_info { 1801 __le64 IndexNumber; 1802 } __packed; /* level 6 Query */ 1803 1804 struct smb2_file_rename_info { /* encoding of request for level 10 */ 1805 /* New members MUST be added within the struct_group() macro below. */ 1806 __struct_group(smb2_file_rename_info_hdr, __hdr, __packed, 1807 __u8 ReplaceIfExists; /* 1 = replace existing target with new */ 1808 /* 0 = fail if target already exists */ 1809 __u8 Reserved[7]; 1810 __u64 RootDirectory; /* MBZ for network operations (why says spec?) */ 1811 __le32 FileNameLength; 1812 ); 1813 char FileName[]; /* New name to be assigned */ 1814 /* padding - overall struct size must be >= 24 so filename + pad >= 6 */ 1815 } __packed; /* level 10 Set */ 1816 static_assert(offsetof(struct smb2_file_rename_info, FileName) == sizeof(struct smb2_file_rename_info_hdr), 1817 "struct member likely outside of __struct_group()"); 1818 1819 struct smb2_file_link_info { /* encoding of request for level 11 */ 1820 /* New members MUST be added within the struct_group() macro below. */ 1821 __struct_group(smb2_file_link_info_hdr, __hdr, __packed, 1822 __u8 ReplaceIfExists; /* 1 = replace existing link with new */ 1823 /* 0 = fail if link already exists */ 1824 __u8 Reserved[7]; 1825 __u64 RootDirectory; /* MBZ for network operations (why says spec?) */ 1826 __le32 FileNameLength; 1827 ); 1828 char FileName[]; /* Name to be assigned to new link */ 1829 } __packed; /* level 11 Set */ 1830 static_assert(offsetof(struct smb2_file_link_info, FileName) == sizeof(struct smb2_file_link_info_hdr), 1831 "struct member likely outside of __struct_group()"); 1832 1833 /* 1834 * This level 18, although with struct with same name is different from cifs 1835 * level 0x107. Level 0x107 has an extra u64 between AccessFlags and 1836 * CurrentByteOffset. 1837 */ 1838 struct smb2_file_all_info { /* data block encoding of response to level 18 */ 1839 __le64 CreationTime; /* Beginning of FILE_BASIC_INFO equivalent */ 1840 __le64 LastAccessTime; 1841 __le64 LastWriteTime; 1842 __le64 ChangeTime; 1843 __le32 Attributes; 1844 __u32 Pad1; /* End of FILE_BASIC_INFO_INFO equivalent */ 1845 __le64 AllocationSize; /* Beginning of FILE_STANDARD_INFO equivalent */ 1846 __le64 EndOfFile; /* size ie offset to first free byte in file */ 1847 __le32 NumberOfLinks; /* hard links */ 1848 __u8 DeletePending; 1849 __u8 Directory; 1850 __u16 Pad2; /* End of FILE_STANDARD_INFO equivalent */ 1851 __le64 IndexNumber; 1852 __le32 EASize; 1853 __le32 AccessFlags; 1854 __le64 CurrentByteOffset; 1855 __le32 Mode; 1856 __le32 AlignmentRequirement; 1857 __le32 FileNameLength; 1858 union { 1859 char __pad; /* Legacy structure padding */ 1860 DECLARE_FLEX_ARRAY(char, FileName); 1861 }; 1862 } __packed; /* level 18 Query */ 1863 1864 struct smb2_file_eof_info { /* encoding of request for level 10 */ 1865 __le64 EndOfFile; /* new end of file value */ 1866 } __packed; /* level 20 Set */ 1867 1868 /* Level 100 query info */ 1869 struct smb311_posix_qinfo { 1870 __le64 CreationTime; 1871 __le64 LastAccessTime; 1872 __le64 LastWriteTime; 1873 __le64 ChangeTime; 1874 __le64 EndOfFile; 1875 __le64 AllocationSize; 1876 __le32 DosAttributes; 1877 __le64 Inode; 1878 __le32 DeviceId; 1879 __le32 Zero; 1880 /* beginning of POSIX Create Context Response */ 1881 __le32 HardLinks; 1882 __le32 ReparseTag; 1883 __le32 Mode; 1884 u8 Sids[]; 1885 /* 1886 * var sized owner SID 1887 * var sized group SID 1888 * le32 filenamelength 1889 * u8 filename[] 1890 */ 1891 } __packed; 1892 1893 /* File System Information Classes */ 1894 #define FS_VOLUME_INFORMATION 1 /* Query */ 1895 #define FS_LABEL_INFORMATION 2 /* Set */ 1896 #define FS_SIZE_INFORMATION 3 /* Query */ 1897 #define FS_DEVICE_INFORMATION 4 /* Query */ 1898 #define FS_ATTRIBUTE_INFORMATION 5 /* Query */ 1899 #define FS_CONTROL_INFORMATION 6 /* Query, Set */ 1900 #define FS_FULL_SIZE_INFORMATION 7 /* Query */ 1901 #define FS_OBJECT_ID_INFORMATION 8 /* Query, Set */ 1902 #define FS_DRIVER_PATH_INFORMATION 9 /* Query */ 1903 #define FS_SECTOR_SIZE_INFORMATION 11 /* SMB3 or later. Query */ 1904 #define FS_POSIX_INFORMATION 100 /* SMB3.1.1 POSIX. Query */ 1905 1906 struct smb2_fs_full_size_info { 1907 __le64 TotalAllocationUnits; 1908 __le64 CallerAvailableAllocationUnits; 1909 __le64 ActualAvailableAllocationUnits; 1910 __le32 SectorsPerAllocationUnit; 1911 __le32 BytesPerSector; 1912 } __packed; 1913 1914 #define SSINFO_FLAGS_ALIGNED_DEVICE 0x00000001 1915 #define SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE 0x00000002 1916 #define SSINFO_FLAGS_NO_SEEK_PENALTY 0x00000004 1917 #define SSINFO_FLAGS_TRIM_ENABLED 0x00000008 1918 1919 /* sector size info struct */ 1920 struct smb3_fs_ss_info { 1921 __le32 LogicalBytesPerSector; 1922 __le32 PhysicalBytesPerSectorForAtomicity; 1923 __le32 PhysicalBytesPerSectorForPerf; 1924 __le32 FSEffPhysicalBytesPerSectorForAtomicity; 1925 __le32 Flags; 1926 __le32 ByteOffsetForSectorAlignment; 1927 __le32 ByteOffsetForPartitionAlignment; 1928 } __packed; 1929 1930 /* File System Control Information */ 1931 struct smb2_fs_control_info { 1932 __le64 FreeSpaceStartFiltering; 1933 __le64 FreeSpaceThreshold; 1934 __le64 FreeSpaceStopFiltering; 1935 __le64 DefaultQuotaThreshold; 1936 __le64 DefaultQuotaLimit; 1937 __le32 FileSystemControlFlags; 1938 __le32 Padding; 1939 } __packed; 1940 1941 /* volume info struct - see MS-FSCC 2.5.9 */ 1942 #define MAX_VOL_LABEL_LEN 32 1943 struct smb3_fs_vol_info { 1944 __le64 VolumeCreationTime; 1945 __u32 VolumeSerialNumber; 1946 __le32 VolumeLabelLength; /* includes trailing null */ 1947 __u8 SupportsObjects; /* True if eg like NTFS, supports objects */ 1948 __u8 Reserved; 1949 __u8 VolumeLabel[]; /* variable len */ 1950 } __packed; 1951 1952 /* See MS-SMB2 2.2.23 through 2.2.25 */ 1953 struct smb2_oplock_break { 1954 struct smb2_hdr hdr; 1955 __le16 StructureSize; /* Must be 24 */ 1956 __u8 OplockLevel; 1957 __u8 Reserved; 1958 __le32 Reserved2; 1959 __u64 PersistentFid; 1960 __u64 VolatileFid; 1961 } __packed; 1962 1963 #define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01) 1964 1965 struct smb2_lease_break { 1966 struct smb2_hdr hdr; 1967 __le16 StructureSize; /* Must be 44 */ 1968 __le16 Epoch; 1969 __le32 Flags; 1970 __u8 LeaseKey[16]; 1971 __le32 CurrentLeaseState; 1972 __le32 NewLeaseState; 1973 __le32 BreakReason; 1974 __le32 AccessMaskHint; 1975 __le32 ShareMaskHint; 1976 } __packed; 1977 1978 struct smb2_lease_ack { 1979 struct smb2_hdr hdr; 1980 __le16 StructureSize; /* Must be 36 */ 1981 __le16 Reserved; 1982 __le32 Flags; 1983 __u8 LeaseKey[16]; 1984 __le32 LeaseState; 1985 __le64 LeaseDuration; 1986 } __packed; 1987 1988 /* 1989 * See MS-CIFS 2.2.3.1 1990 * MS-SMB 2.2.3.1 1991 */ 1992 struct smb_hdr { 1993 __u8 Protocol[4]; 1994 __u8 Command; 1995 union { 1996 struct { 1997 __u8 ErrorClass; 1998 __u8 Reserved; 1999 __le16 Error; 2000 } __packed DosError; 2001 __le32 CifsError; 2002 } __packed Status; 2003 __u8 Flags; 2004 __le16 Flags2; /* note: le */ 2005 __le16 PidHigh; 2006 union { 2007 struct { 2008 __le32 SequenceNumber; /* le */ 2009 __u32 Reserved; /* zero */ 2010 } __packed Sequence; 2011 __u8 SecuritySignature[8]; /* le */ 2012 } __packed Signature; 2013 __u8 pad[2]; 2014 __u16 Tid; 2015 __le16 Pid; 2016 __u16 Uid; 2017 __le16 Mid; 2018 __u8 WordCount; 2019 } __packed; 2020 2021 #define OP_BREAK_STRUCT_SIZE_20 24 2022 #define OP_BREAK_STRUCT_SIZE_21 36 2023 2024 /* 2025 * See MS-SMB2 2.2.13.1.1 2026 * MS-SMB 2.2.1.4.1 2027 * These are the file access permission bits defined in CIFS for the 2028 * NTCreateAndX as well as the level 0x107 2029 * TRANS2_QUERY_PATH_INFORMATION API. The level 0x107, SMB_QUERY_FILE_ALL_INFO 2030 * responds with the AccessFlags. 2031 * The AccessFlags specifies the access permissions a caller has to the 2032 * file and can have any suitable combination of the following values: 2033 */ 2034 #define FILE_READ_DATA 0x00000001 /* Data can be read from the file */ 2035 /* or directory child entries can */ 2036 /* be listed together with the */ 2037 /* associated child attributes */ 2038 /* (so the FILE_READ_ATTRIBUTES on */ 2039 /* the child entry is not needed) */ 2040 #define FILE_WRITE_DATA 0x00000002 /* Data can be written to the file */ 2041 /* or new file can be created in */ 2042 /* the directory */ 2043 #define FILE_APPEND_DATA 0x00000004 /* Data can be appended to the file */ 2044 /* (for non-local files over SMB it */ 2045 /* is same as FILE_WRITE_DATA) */ 2046 /* or new subdirectory can be */ 2047 /* created in the directory */ 2048 #define FILE_READ_EA 0x00000008 /* Extended attributes associated */ 2049 /* with the file can be read */ 2050 #define FILE_WRITE_EA 0x00000010 /* Extended attributes associated */ 2051 /* with the file can be written */ 2052 #define FILE_EXECUTE 0x00000020 /*Data can be read into memory from */ 2053 /* the file using system paging I/O */ 2054 /* for executing the file / script */ 2055 /* or right to traverse directory */ 2056 /* (but by default all users have */ 2057 /* directory bypass traverse */ 2058 /* privilege and do not need this */ 2059 /* permission on directories at all)*/ 2060 #define FILE_DELETE_CHILD 0x00000040 /* Child entry can be deleted from */ 2061 /* the directory (so the DELETE on */ 2062 /* the child entry is not needed) */ 2063 #define FILE_READ_ATTRIBUTES 0x00000080 /* Attributes associated with the */ 2064 /* file or directory can be read */ 2065 #define FILE_WRITE_ATTRIBUTES 0x00000100 /* Attributes associated with the */ 2066 /* file or directory can be written */ 2067 #define DELETE 0x00010000 /* The file or dir can be deleted */ 2068 #define READ_CONTROL 0x00020000 /* The discretionary access control */ 2069 /* list and ownership associated */ 2070 /* with the file or dir can be read */ 2071 #define WRITE_DAC 0x00040000 /* The discretionary access control */ 2072 /* list associated with the file or */ 2073 /* directory can be written */ 2074 #define WRITE_OWNER 0x00080000 /* Ownership information associated */ 2075 /* with the file/dir can be written */ 2076 #define SYNCHRONIZE 0x00100000 /* The file handle can waited on to */ 2077 /* synchronize with the completion */ 2078 /* of an input/output request */ 2079 #define SYSTEM_SECURITY 0x01000000 /* The system access control list */ 2080 /* associated with the file or */ 2081 /* directory can be read or written */ 2082 /* (cannot be in DACL, can in SACL) */ 2083 #define MAXIMUM_ALLOWED 0x02000000 /* Maximal subset of GENERIC_ALL */ 2084 /* permissions which can be granted */ 2085 /* (cannot be in DACL nor SACL) */ 2086 #define GENERIC_ALL 0x10000000 /* Same as: GENERIC_EXECUTE | */ 2087 /* GENERIC_WRITE | */ 2088 /* GENERIC_READ | */ 2089 /* FILE_DELETE_CHILD | */ 2090 /* DELETE | */ 2091 /* WRITE_DAC | */ 2092 /* WRITE_OWNER */ 2093 /* So GENERIC_ALL contains all bits */ 2094 /* mentioned above except these two */ 2095 /* SYSTEM_SECURITY MAXIMUM_ALLOWED */ 2096 #define GENERIC_EXECUTE 0x20000000 /* Same as: FILE_EXECUTE | */ 2097 /* FILE_READ_ATTRIBUTES | */ 2098 /* READ_CONTROL | */ 2099 /* SYNCHRONIZE */ 2100 #define GENERIC_WRITE 0x40000000 /* Same as: FILE_WRITE_DATA | */ 2101 /* FILE_APPEND_DATA | */ 2102 /* FILE_WRITE_EA | */ 2103 /* FILE_WRITE_ATTRIBUTES | */ 2104 /* READ_CONTROL | */ 2105 /* SYNCHRONIZE */ 2106 #define GENERIC_READ 0x80000000 /* Same as: FILE_READ_DATA | */ 2107 /* FILE_READ_EA | */ 2108 /* FILE_READ_ATTRIBUTES | */ 2109 /* READ_CONTROL | */ 2110 /* SYNCHRONIZE */ 2111 2112 /* Combinations of file access permission bits */ 2113 #define FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES) 2114 #define FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \ 2115 | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES) 2116 #define FILE_EXEC_RIGHTS (FILE_EXECUTE) 2117 #define SET_FILE_EXEC_RIGHTS (FILE_READ_EA | FILE_WRITE_EA | FILE_EXECUTE \ 2118 | FILE_READ_ATTRIBUTES \ 2119 | FILE_WRITE_ATTRIBUTES \ 2120 | DELETE | READ_CONTROL | WRITE_DAC \ 2121 | WRITE_OWNER | SYNCHRONIZE) 2122 #define SET_MINIMUM_RIGHTS (FILE_READ_EA | FILE_READ_ATTRIBUTES \ 2123 | READ_CONTROL | SYNCHRONIZE) 2124 2125 /* See MS-CIFS 2.2.4.52.1 */ 2126 typedef struct smb_negotiate_req { 2127 struct smb_hdr hdr; /* wct = 0 */ 2128 __le16 ByteCount; 2129 unsigned char DialectsArray[]; 2130 } __packed SMB_NEGOTIATE_REQ; 2131 2132 #endif /* _COMMON_SMB2PDU_H */ 2133