FILE
smb2pdu.h
File preview with syntax highlighting.
linux-6.19.14/fs/smb/common/smb2pdu.h
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 */ 139struct 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 160struct 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 182struct 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 190struct 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 204struct 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 228struct 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 */ 243struct 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 250struct 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 262struct 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 */ 270struct 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 286struct 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 */ 292struct 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 303struct privilege_array_data { 304 __le16 PrivilegeCount; 305 /* array of privilege_data structs */ 306} __packed; 307 308struct 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 326struct 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 339struct 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 385struct 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 395struct smb2_tree_disconnect_req { 396 struct smb2_hdr hdr; 397 __le16 StructureSize; /* Must be 4 */ 398 __le16 Reserved; 399} __packed; 400 401struct 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 459struct 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 475struct 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 493struct 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 515struct 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 */ 531struct 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 546struct 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 564struct 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 587struct 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 597struct 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 604struct 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 619struct 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 646struct 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 667struct 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 */ 680struct smb2_logoff_req { 681 struct smb2_hdr hdr; 682 __le16 StructureSize; /* Must be 4 */ 683 __le16 Reserved; 684} __packed; 685 686struct 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) 698struct 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 712struct 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 */ 744struct 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 765struct 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 784struct 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 800struct 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 */ 815struct 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 824struct 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 836struct smb2_lock_element { 837 __le64 Offset; 838 __le64 Length; 839 __le32 Flags; 840 __le32 Reserved; 841} __packed; 842 843struct 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 861struct smb2_lock_rsp { 862 struct smb2_hdr hdr; 863 __le16 StructureSize; /* Must be 4 */ 864 __le16 Reserved; 865} __packed; 866 867struct smb2_echo_req { 868 struct smb2_hdr hdr; 869 __le16 StructureSize; /* Must be 4 */ 870 __u16 Reserved; 871} __packed; 872 873struct 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 901struct 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 915struct 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 966struct 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 980struct 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 */ 1023struct 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 */ 1035struct 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 1049struct 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 1177struct 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; 1189static_assert(offsetof(struct create_context, Buffer) == sizeof(struct create_context_hdr), 1190 "struct member likely outside of __struct_group()"); 1191 1192struct 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 1212struct 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 1233struct 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 */ 1241typedef 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 */ 1254struct 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 */ 1269struct 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 1276struct 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 */ 1283struct 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 1292struct create_durable_handle_reconnect_v2 { 1293 struct create_context_hdr ccontext; 1294 __u8 Name[8]; 1295 struct durable_reconnect_context_v2 dcontext; 1296 __u8 Pad[4]; 1297} __packed; 1298 1299/* See MS-SMB2 2.2.14.2.12 */ 1300struct durable_context_v2_rsp { 1301 __le32 Timeout; 1302 __le32 Flags; /* see SMB2_DHANDLE_FLAG_PERSISTENT */ 1303} __packed; 1304 1305struct create_durable_rsp_v2 { 1306 struct create_context_hdr ccontext; 1307 __u8 Name[8]; 1308 struct durable_context_v2_rsp dcontext; 1309} __packed; 1310 1311/* See MS-SMB2 2.2.14.2.5 */ 1312struct create_mxac_rsp { 1313 struct create_context_hdr ccontext; 1314 __u8 Name[8]; 1315 __le32 QueryStatus; 1316 __le32 MaximalAccess; 1317} __packed; 1318 1319#define SMB2_LEASE_NONE_LE cpu_to_le32(0x00) 1320#define SMB2_LEASE_READ_CACHING_LE cpu_to_le32(0x01) 1321#define SMB2_LEASE_HANDLE_CACHING_LE cpu_to_le32(0x02) 1322#define SMB2_LEASE_WRITE_CACHING_LE cpu_to_le32(0x04) 1323 1324#define SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE cpu_to_le32(0x02) 1325#define SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE cpu_to_le32(0x04) 1326 1327#define SMB2_LEASE_KEY_SIZE 16 1328 1329/* See MS-SMB2 2.2.13.2.8 */ 1330struct lease_context { 1331 __u8 LeaseKey[SMB2_LEASE_KEY_SIZE]; 1332 __le32 LeaseState; 1333 __le32 LeaseFlags; 1334 __le64 LeaseDuration; 1335} __packed; 1336 1337/* See MS-SMB2 2.2.13.2.10 */ 1338struct lease_context_v2 { 1339 __u8 LeaseKey[SMB2_LEASE_KEY_SIZE]; 1340 __le32 LeaseState; 1341 __le32 LeaseFlags; 1342 __le64 LeaseDuration; 1343 __u8 ParentLeaseKey[SMB2_LEASE_KEY_SIZE]; 1344 __le16 Epoch; 1345 __le16 Reserved; 1346} __packed; 1347 1348struct create_lease { 1349 struct create_context_hdr ccontext; 1350 __u8 Name[8]; 1351 struct lease_context lcontext; 1352} __packed; 1353 1354struct create_lease_v2 { 1355 struct create_context_hdr ccontext; 1356 __u8 Name[8]; 1357 struct lease_context_v2 lcontext; 1358 __u8 Pad[4]; 1359} __packed; 1360 1361/* See MS-SMB2 2.2.14.2.9 */ 1362struct create_disk_id_rsp { 1363 struct create_context_hdr ccontext; 1364 __u8 Name[8]; 1365 __le64 DiskFileId; 1366 __le64 VolumeId; 1367 __u8 Reserved[16]; 1368} __packed; 1369 1370/* See MS-SMB2 2.2.13.2.13 */ 1371struct create_app_inst_id { 1372 struct create_context_hdr ccontext; 1373 __u8 Name[16]; 1374 __le32 StructureSize; /* Must be 20 */ 1375 __u16 Reserved; 1376 __u8 AppInstanceId[16]; 1377} __packed; 1378 1379/* See MS-SMB2 2.2.13.2.15 */ 1380struct create_app_inst_id_vers { 1381 struct create_context_hdr ccontext; 1382 __u8 Name[16]; 1383 __le32 StructureSize; /* Must be 24 */ 1384 __u16 Reserved; 1385 __u32 Padding; 1386 __le64 AppInstanceVersionHigh; 1387 __le64 AppInstanceVersionLow; 1388} __packed; 1389 1390/* See MS-SMB2 2.2.31 and 2.2.32 */ 1391struct smb2_ioctl_req { 1392 struct smb2_hdr hdr; 1393 __le16 StructureSize; /* Must be 57 */ 1394 __le16 Reserved; /* offset from start of SMB2 header to write data */ 1395 __le32 CtlCode; 1396 __u64 PersistentFileId; 1397 __u64 VolatileFileId; 1398 __le32 InputOffset; /* Reserved MBZ */ 1399 __le32 InputCount; 1400 __le32 MaxInputResponse; 1401 __le32 OutputOffset; 1402 __le32 OutputCount; 1403 __le32 MaxOutputResponse; 1404 __le32 Flags; 1405 __le32 Reserved2; 1406 __u8 Buffer[]; 1407} __packed; 1408 1409/* See MS-SMB2 2.2.31.1.1 */ 1410struct srv_copychunk { 1411 __le64 SourceOffset; 1412 __le64 TargetOffset; 1413 __le32 Length; 1414 __le32 Reserved; 1415} __packed; 1416 1417#define COPY_CHUNK_RES_KEY_SIZE 24 1418 1419/* See MS-SMB2 2.2.31.1 */ 1420/* this goes in the ioctl buffer when doing a copychunk request */ 1421struct copychunk_ioctl_req { 1422 union { 1423 char SourceKey[COPY_CHUNK_RES_KEY_SIZE]; 1424 __le64 SourceKeyU64[3]; 1425 }; 1426 __le32 ChunkCount; 1427 __le32 Reserved; 1428 struct srv_copychunk Chunks[] __counted_by_le(ChunkCount); 1429} __packed; 1430 1431/* See MS-SMB2 2.2.32.1 */ 1432struct copychunk_ioctl_rsp { 1433 __le32 ChunksWritten; 1434 __le32 ChunkBytesWritten; 1435 __le32 TotalBytesWritten; 1436} __packed; 1437 1438/* See MS-SMB2 2.2.32.3 */ 1439struct resume_key_ioctl_rsp { 1440 union { 1441 char ResumeKey[COPY_CHUNK_RES_KEY_SIZE]; 1442 __u64 ResumeKeyU64[3]; 1443 }; 1444 __le32 ContextLength; /* MBZ */ 1445 char Context[]; /* ignored, Windows sets to 4 bytes of zero */ 1446} __packed; 1447 1448struct smb2_ioctl_rsp { 1449 struct smb2_hdr hdr; 1450 __le16 StructureSize; /* Must be 49 */ 1451 __le16 Reserved; 1452 __le32 CtlCode; 1453 __u64 PersistentFileId; 1454 __u64 VolatileFileId; 1455 __le32 InputOffset; /* Reserved MBZ */ 1456 __le32 InputCount; 1457 __le32 OutputOffset; 1458 __le32 OutputCount; 1459 __le32 Flags; 1460 __le32 Reserved2; 1461 __u8 Buffer[]; 1462} __packed; 1463 1464/* See MS-SMB2 2.2.32.5.1.1 */ 1465struct smb_sockaddr_in { 1466 __be16 Port; 1467 __be32 IPv4Address; 1468 __u8 Reserved[8]; 1469} __packed; 1470 1471/* See MS-SMB2 2.2.32.5.1.2 */ 1472struct smb_sockaddr_in6 { 1473 __be16 Port; 1474 __be32 FlowInfo; 1475 __u8 IPv6Address[16]; 1476 __be32 ScopeId; 1477} __packed; 1478 1479/* See MS-SMB2 2.2.32.5 and MS-SMB2 2.2.32.5.1 */ 1480#define RSS_CAPABLE cpu_to_le32(0x00000001) 1481#define RDMA_CAPABLE cpu_to_le32(0x00000002) 1482#define INTERNETWORK cpu_to_le16(0x0002) 1483#define INTERNETWORKV6 cpu_to_le16(0x0017) 1484struct network_interface_info_ioctl_rsp { 1485 __le32 Next; /* next interface. zero if this is last one */ 1486 __le32 IfIndex; 1487 __le32 Capability; /* RSS or RDMA Capable */ 1488 __le32 Reserved; 1489 __le64 LinkSpeed; 1490 union { 1491 char SockAddr_Storage[128]; 1492 struct { 1493 __le16 Family; 1494 __u8 Buffer[126]; 1495 }; 1496 }; 1497} __packed; 1498 1499/* this goes in the ioctl buffer when doing FSCTL_SET_ZERO_DATA */ 1500struct file_zero_data_information { 1501 __le64 FileOffset; 1502 __le64 BeyondFinalZero; 1503} __packed; 1504 1505/* See MS-FSCC 2.3.7 */ 1506struct duplicate_extents_to_file { 1507 __u64 PersistentFileHandle; /* source file handle, opaque endianness */ 1508 __u64 VolatileFileHandle; 1509 __le64 SourceFileOffset; 1510 __le64 TargetFileOffset; 1511 __le64 ByteCount; /* Bytes to be copied */ 1512} __packed; 1513 1514/* See MS-FSCC 2.3.9 */ 1515#define DUPLICATE_EXTENTS_DATA_EX_SOURCE_ATOMIC 0x00000001 1516struct duplicate_extents_to_file_ex { 1517 __le64 StructureSize; /* MUST be set to 0x30 */ 1518 __u64 PersistentFileHandle; /* source file handle, opaque endianness */ 1519 __u64 VolatileFileHandle; 1520 __le64 SourceFileOffset; 1521 __le64 TargetFileOffset; 1522 __le64 ByteCount; /* Bytes to be copied */ 1523 __le32 Flags; 1524 __le32 Reserved; 1525} __packed; 1526 1527 1528/* See MS-FSCC 2.3.20 */ 1529struct fsctl_get_integrity_information_rsp { 1530 __le16 ChecksumAlgorithm; 1531 __le16 Reserved; 1532 __le32 Flags; 1533 __le32 ChecksumChunkSizeInBytes; 1534 __le32 ClusterSizeInBytes; 1535} __packed; 1536 1537/* See MS-FSCC 2.3.55 */ 1538struct fsctl_query_file_regions_req { 1539 __le64 FileOffset; 1540 __le64 Length; 1541 __le32 DesiredUsage; 1542 __le32 Reserved; 1543} __packed; 1544 1545/* DesiredUsage flags see MS-FSCC 2.3.56.1 */ 1546#define FILE_USAGE_INVALID_RANGE 0x00000000 1547#define FILE_USAGE_VALID_CACHED_DATA 0x00000001 1548#define FILE_USAGE_NONCACHED_DATA 0x00000002 1549 1550struct file_region_info { 1551 __le64 FileOffset; 1552 __le64 Length; 1553 __le32 DesiredUsage; 1554 __le32 Reserved; 1555} __packed; 1556 1557/* See MS-FSCC 2.3.56 */ 1558struct fsctl_query_file_region_rsp { 1559 __le32 Flags; 1560 __le32 TotalRegionEntryCount; 1561 __le32 RegionEntryCount; 1562 __u32 Reserved; 1563 struct file_region_info Regions[]; 1564} __packed; 1565 1566/* See MS-FSCC 2.3.58 */ 1567struct fsctl_query_on_disk_vol_info_rsp { 1568 __le64 DirectoryCount; 1569 __le64 FileCount; 1570 __le16 FsFormatMajVersion; 1571 __le16 FsFormatMinVersion; 1572 __u8 FsFormatName[24]; 1573 __le64 FormatTime; 1574 __le64 LastUpdateTime; 1575 __u8 CopyrightInfo[68]; 1576 __u8 AbstractInfo[68]; 1577 __u8 FormatImplInfo[68]; 1578 __u8 LastModifyImplInfo[68]; 1579} __packed; 1580 1581/* See MS-FSCC 2.3.73 */ 1582struct fsctl_set_integrity_information_req { 1583 __le16 ChecksumAlgorithm; 1584 __le16 Reserved; 1585 __le32 Flags; 1586} __packed; 1587 1588/* See MS-FSCC 2.3.75 */ 1589struct fsctl_set_integrity_info_ex_req { 1590 __u8 EnableIntegrity; 1591 __u8 KeepState; 1592 __u16 Reserved; 1593 __le32 Flags; 1594 __u8 Version; 1595 __u8 Reserved2[7]; 1596} __packed; 1597 1598/* Integrity ChecksumAlgorithm choices for above */ 1599#define CHECKSUM_TYPE_NONE 0x0000 1600#define CHECKSUM_TYPE_CRC64 0x0002 1601#define CHECKSUM_TYPE_UNCHANGED 0xFFFF /* set only */ 1602 1603/* Integrity flags for above */ 1604#define FSCTL_INTEGRITY_FLAG_CHECKSUM_ENFORCEMENT_OFF 0x00000001 1605 1606/* Reparse structures - see MS-FSCC 2.1.2 */ 1607 1608/* struct fsctl_reparse_info_req is empty, only response structs (see below) */ 1609struct reparse_data_buffer { 1610 __le32 ReparseTag; 1611 __le16 ReparseDataLength; 1612 __u16 Reserved; 1613 __u8 DataBuffer[]; /* Variable Length */ 1614} __packed; 1615 1616struct reparse_guid_data_buffer { 1617 __le32 ReparseTag; 1618 __le16 ReparseDataLength; 1619 __u16 Reserved; 1620 __u8 ReparseGuid[16]; 1621 __u8 DataBuffer[]; /* Variable Length */ 1622} __packed; 1623 1624struct reparse_mount_point_data_buffer { 1625 __le32 ReparseTag; 1626 __le16 ReparseDataLength; 1627 __u16 Reserved; 1628 __le16 SubstituteNameOffset; 1629 __le16 SubstituteNameLength; 1630 __le16 PrintNameOffset; 1631 __le16 PrintNameLength; 1632 __u8 PathBuffer[]; /* Variable Length */ 1633} __packed; 1634 1635#define SYMLINK_FLAG_RELATIVE 0x00000001 1636 1637struct reparse_symlink_data_buffer { 1638 __le32 ReparseTag; 1639 __le16 ReparseDataLength; 1640 __u16 Reserved; 1641 __le16 SubstituteNameOffset; 1642 __le16 SubstituteNameLength; 1643 __le16 PrintNameOffset; 1644 __le16 PrintNameLength; 1645 __le32 Flags; 1646 __u8 PathBuffer[]; /* Variable Length */ 1647} __packed; 1648 1649/* For IO_REPARSE_TAG_NFS - see MS-FSCC 2.1.2.6 */ 1650#define NFS_SPECFILE_LNK 0x00000000014B4E4C 1651#define NFS_SPECFILE_CHR 0x0000000000524843 1652#define NFS_SPECFILE_BLK 0x00000000004B4C42 1653#define NFS_SPECFILE_FIFO 0x000000004F464946 1654#define NFS_SPECFILE_SOCK 0x000000004B434F53 1655struct reparse_nfs_data_buffer { 1656 __le32 ReparseTag; 1657 __le16 ReparseDataLength; 1658 __u16 Reserved; 1659 __le64 InodeType; /* NFS_SPECFILE_* */ 1660 __u8 DataBuffer[]; 1661} __packed; 1662 1663/* For IO_REPARSE_TAG_LX_SYMLINK - see MS-FSCC 2.1.2.7 */ 1664struct reparse_wsl_symlink_data_buffer { 1665 __le32 ReparseTag; 1666 __le16 ReparseDataLength; 1667 __u16 Reserved; 1668 __le32 Version; /* Always 2 */ 1669 __u8 Target[]; /* Variable Length UTF-8 string without nul-term */ 1670} __packed; 1671 1672struct validate_negotiate_info_req { 1673 __le32 Capabilities; 1674 __u8 Guid[SMB2_CLIENT_GUID_SIZE]; 1675 __le16 SecurityMode; 1676 __le16 DialectCount; 1677 __le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */ 1678} __packed; 1679 1680struct validate_negotiate_info_rsp { 1681 __le32 Capabilities; 1682 __u8 Guid[SMB2_CLIENT_GUID_SIZE]; 1683 __le16 SecurityMode; 1684 __le16 Dialect; /* Dialect in use for the connection */ 1685} __packed; 1686 1687 1688/* Possible InfoType values */ 1689#define SMB2_O_INFO_FILE 0x01 1690#define SMB2_O_INFO_FILESYSTEM 0x02 1691#define SMB2_O_INFO_SECURITY 0x03 1692#define SMB2_O_INFO_QUOTA 0x04 1693 1694/* SMB2 Query Info see MS-SMB2 (2.2.37) or MS-DTYP */ 1695 1696/* List of QUERY INFO levels (those also valid for QUERY_DIR are noted below */ 1697#define FILE_DIRECTORY_INFORMATION 1 /* also for QUERY_DIR */ 1698#define FILE_FULL_DIRECTORY_INFORMATION 2 /* also for QUERY_DIR */ 1699#define FILE_BOTH_DIRECTORY_INFORMATION 3 /* also for QUERY_DIR */ 1700#define FILE_BASIC_INFORMATION 4 1701#define FILE_STANDARD_INFORMATION 5 1702#define FILE_INTERNAL_INFORMATION 6 1703#define FILE_EA_INFORMATION 7 1704#define FILE_ACCESS_INFORMATION 8 1705#define FILE_NAME_INFORMATION 9 1706#define FILE_RENAME_INFORMATION 10 1707#define FILE_LINK_INFORMATION 11 1708#define FILE_NAMES_INFORMATION 12 /* also for QUERY_DIR */ 1709#define FILE_DISPOSITION_INFORMATION 13 1710#define FILE_POSITION_INFORMATION 14 1711#define FILE_FULL_EA_INFORMATION 15 1712#define FILE_MODE_INFORMATION 16 1713#define FILE_ALIGNMENT_INFORMATION 17 1714#define FILE_ALL_INFORMATION 18 1715#define FILE_ALLOCATION_INFORMATION 19 1716#define FILE_END_OF_FILE_INFORMATION 20 1717#define FILE_ALTERNATE_NAME_INFORMATION 21 1718#define FILE_STREAM_INFORMATION 22 1719#define FILE_PIPE_INFORMATION 23 1720#define FILE_PIPE_LOCAL_INFORMATION 24 1721#define FILE_PIPE_REMOTE_INFORMATION 25 1722#define FILE_MAILSLOT_QUERY_INFORMATION 26 1723#define FILE_MAILSLOT_SET_INFORMATION 27 1724#define FILE_COMPRESSION_INFORMATION 28 1725#define FILE_OBJECT_ID_INFORMATION 29 1726/* Number 30 not defined in documents */ 1727#define FILE_MOVE_CLUSTER_INFORMATION 31 1728#define FILE_QUOTA_INFORMATION 32 1729#define FILE_REPARSE_POINT_INFORMATION 33 1730#define FILE_NETWORK_OPEN_INFORMATION 34 1731#define FILE_ATTRIBUTE_TAG_INFORMATION 35 1732#define FILE_TRACKING_INFORMATION 36 1733#define FILEID_BOTH_DIRECTORY_INFORMATION 37 /* also for QUERY_DIR */ 1734#define FILEID_FULL_DIRECTORY_INFORMATION 38 /* also for QUERY_DIR */ 1735#define FILE_VALID_DATA_LENGTH_INFORMATION 39 1736#define FILE_SHORT_NAME_INFORMATION 40 1737#define FILE_SFIO_RESERVE_INFORMATION 44 1738#define FILE_SFIO_VOLUME_INFORMATION 45 1739#define FILE_HARD_LINK_INFORMATION 46 1740#define FILE_NORMALIZED_NAME_INFORMATION 48 1741#define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50 1742#define FILE_STANDARD_LINK_INFORMATION 54 1743#define FILE_ID_INFORMATION 59 1744#define FILE_ID_EXTD_DIRECTORY_INFORMATION 60 /* also for QUERY_DIR */ 1745/* Used for Query Info and Find File POSIX Info for SMB3.1.1 and SMB1 */ 1746#define SMB_FIND_FILE_POSIX_INFO 0x064 1747 1748/* Security info type additionalinfo flags. */ 1749#define OWNER_SECINFO 0x00000001 1750#define GROUP_SECINFO 0x00000002 1751#define DACL_SECINFO 0x00000004 1752#define SACL_SECINFO 0x00000008 1753#define LABEL_SECINFO 0x00000010 1754#define ATTRIBUTE_SECINFO 0x00000020 1755#define SCOPE_SECINFO 0x00000040 1756#define BACKUP_SECINFO 0x00010000 1757#define UNPROTECTED_SACL_SECINFO 0x10000000 1758#define UNPROTECTED_DACL_SECINFO 0x20000000 1759#define PROTECTED_SACL_SECINFO 0x40000000 1760#define PROTECTED_DACL_SECINFO 0x80000000 1761 1762/* Flags used for FileFullEAinfo */ 1763#define SL_RESTART_SCAN 0x00000001 1764#define SL_RETURN_SINGLE_ENTRY 0x00000002 1765#define SL_INDEX_SPECIFIED 0x00000004 1766 1767struct smb2_query_info_req { 1768 struct smb2_hdr hdr; 1769 __le16 StructureSize; /* Must be 41 */ 1770 __u8 InfoType; 1771 __u8 FileInfoClass; 1772 __le32 OutputBufferLength; 1773 __le16 InputBufferOffset; 1774 __u16 Reserved; 1775 __le32 InputBufferLength; 1776 __le32 AdditionalInformation; 1777 __le32 Flags; 1778 __u64 PersistentFileId; 1779 __u64 VolatileFileId; 1780 __u8 Buffer[]; 1781} __packed; 1782 1783struct smb2_query_info_rsp { 1784 struct smb2_hdr hdr; 1785 __le16 StructureSize; /* Must be 9 */ 1786 __le16 OutputBufferOffset; 1787 __le32 OutputBufferLength; 1788 __u8 Buffer[]; 1789} __packed; 1790 1791/* 1792 * PDU query infolevel structure definitions 1793 */ 1794 1795/* See MS-FSCC 2.3.52 */ 1796struct file_allocated_range_buffer { 1797 __le64 file_offset; 1798 __le64 length; 1799} __packed; 1800 1801struct smb2_file_internal_info { 1802 __le64 IndexNumber; 1803} __packed; /* level 6 Query */ 1804 1805struct smb2_file_rename_info { /* encoding of request for level 10 */ 1806 /* New members MUST be added within the struct_group() macro below. */ 1807 __struct_group(smb2_file_rename_info_hdr, __hdr, __packed, 1808 __u8 ReplaceIfExists; /* 1 = replace existing target with new */ 1809 /* 0 = fail if target already exists */ 1810 __u8 Reserved[7]; 1811 __u64 RootDirectory; /* MBZ for network operations (why says spec?) */ 1812 __le32 FileNameLength; 1813 ); 1814 char FileName[]; /* New name to be assigned */ 1815 /* padding - overall struct size must be >= 24 so filename + pad >= 6 */ 1816} __packed; /* level 10 Set */ 1817static_assert(offsetof(struct smb2_file_rename_info, FileName) == sizeof(struct smb2_file_rename_info_hdr), 1818 "struct member likely outside of __struct_group()"); 1819 1820struct smb2_file_link_info { /* encoding of request for level 11 */ 1821 /* New members MUST be added within the struct_group() macro below. */ 1822 __struct_group(smb2_file_link_info_hdr, __hdr, __packed, 1823 __u8 ReplaceIfExists; /* 1 = replace existing link with new */ 1824 /* 0 = fail if link already exists */ 1825 __u8 Reserved[7]; 1826 __u64 RootDirectory; /* MBZ for network operations (why says spec?) */ 1827 __le32 FileNameLength; 1828 ); 1829 char FileName[]; /* Name to be assigned to new link */ 1830} __packed; /* level 11 Set */ 1831static_assert(offsetof(struct smb2_file_link_info, FileName) == sizeof(struct smb2_file_link_info_hdr), 1832 "struct member likely outside of __struct_group()"); 1833 1834/* 1835 * This level 18, although with struct with same name is different from cifs 1836 * level 0x107. Level 0x107 has an extra u64 between AccessFlags and 1837 * CurrentByteOffset. 1838 */ 1839struct smb2_file_all_info { /* data block encoding of response to level 18 */ 1840 __le64 CreationTime; /* Beginning of FILE_BASIC_INFO equivalent */ 1841 __le64 LastAccessTime; 1842 __le64 LastWriteTime; 1843 __le64 ChangeTime; 1844 __le32 Attributes; 1845 __u32 Pad1; /* End of FILE_BASIC_INFO_INFO equivalent */ 1846 __le64 AllocationSize; /* Beginning of FILE_STANDARD_INFO equivalent */ 1847 __le64 EndOfFile; /* size ie offset to first free byte in file */ 1848 __le32 NumberOfLinks; /* hard links */ 1849 __u8 DeletePending; 1850 __u8 Directory; 1851 __u16 Pad2; /* End of FILE_STANDARD_INFO equivalent */ 1852 __le64 IndexNumber; 1853 __le32 EASize; 1854 __le32 AccessFlags; 1855 __le64 CurrentByteOffset; 1856 __le32 Mode; 1857 __le32 AlignmentRequirement; 1858 __le32 FileNameLength; 1859 union { 1860 char __pad; /* Legacy structure padding */ 1861 DECLARE_FLEX_ARRAY(char, FileName); 1862 }; 1863} __packed; /* level 18 Query */ 1864 1865struct smb2_file_eof_info { /* encoding of request for level 10 */ 1866 __le64 EndOfFile; /* new end of file value */ 1867} __packed; /* level 20 Set */ 1868 1869/* Level 100 query info */ 1870struct smb311_posix_qinfo { 1871 __le64 CreationTime; 1872 __le64 LastAccessTime; 1873 __le64 LastWriteTime; 1874 __le64 ChangeTime; 1875 __le64 EndOfFile; 1876 __le64 AllocationSize; 1877 __le32 DosAttributes; 1878 __le64 Inode; 1879 __le32 DeviceId; 1880 __le32 Zero; 1881 /* beginning of POSIX Create Context Response */ 1882 __le32 HardLinks; 1883 __le32 ReparseTag; 1884 __le32 Mode; 1885 u8 Sids[]; 1886 /* 1887 * var sized owner SID 1888 * var sized group SID 1889 * le32 filenamelength 1890 * u8 filename[] 1891 */ 1892} __packed; 1893 1894/* File System Information Classes */ 1895#define FS_VOLUME_INFORMATION 1 /* Query */ 1896#define FS_LABEL_INFORMATION 2 /* Set */ 1897#define FS_SIZE_INFORMATION 3 /* Query */ 1898#define FS_DEVICE_INFORMATION 4 /* Query */ 1899#define FS_ATTRIBUTE_INFORMATION 5 /* Query */ 1900#define FS_CONTROL_INFORMATION 6 /* Query, Set */ 1901#define FS_FULL_SIZE_INFORMATION 7 /* Query */ 1902#define FS_OBJECT_ID_INFORMATION 8 /* Query, Set */ 1903#define FS_DRIVER_PATH_INFORMATION 9 /* Query */ 1904#define FS_SECTOR_SIZE_INFORMATION 11 /* SMB3 or later. Query */ 1905#define FS_POSIX_INFORMATION 100 /* SMB3.1.1 POSIX. Query */ 1906 1907struct smb2_fs_full_size_info { 1908 __le64 TotalAllocationUnits; 1909 __le64 CallerAvailableAllocationUnits; 1910 __le64 ActualAvailableAllocationUnits; 1911 __le32 SectorsPerAllocationUnit; 1912 __le32 BytesPerSector; 1913} __packed; 1914 1915#define SSINFO_FLAGS_ALIGNED_DEVICE 0x00000001 1916#define SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE 0x00000002 1917#define SSINFO_FLAGS_NO_SEEK_PENALTY 0x00000004 1918#define SSINFO_FLAGS_TRIM_ENABLED 0x00000008 1919 1920/* sector size info struct */ 1921struct smb3_fs_ss_info { 1922 __le32 LogicalBytesPerSector; 1923 __le32 PhysicalBytesPerSectorForAtomicity; 1924 __le32 PhysicalBytesPerSectorForPerf; 1925 __le32 FSEffPhysicalBytesPerSectorForAtomicity; 1926 __le32 Flags; 1927 __le32 ByteOffsetForSectorAlignment; 1928 __le32 ByteOffsetForPartitionAlignment; 1929} __packed; 1930 1931/* File System Control Information */ 1932struct smb2_fs_control_info { 1933 __le64 FreeSpaceStartFiltering; 1934 __le64 FreeSpaceThreshold; 1935 __le64 FreeSpaceStopFiltering; 1936 __le64 DefaultQuotaThreshold; 1937 __le64 DefaultQuotaLimit; 1938 __le32 FileSystemControlFlags; 1939 __le32 Padding; 1940} __packed; 1941 1942/* volume info struct - see MS-FSCC 2.5.9 */ 1943#define MAX_VOL_LABEL_LEN 32 1944struct smb3_fs_vol_info { 1945 __le64 VolumeCreationTime; 1946 __u32 VolumeSerialNumber; 1947 __le32 VolumeLabelLength; /* includes trailing null */ 1948 __u8 SupportsObjects; /* True if eg like NTFS, supports objects */ 1949 __u8 Reserved; 1950 __u8 VolumeLabel[]; /* variable len */ 1951} __packed; 1952 1953/* See MS-SMB2 2.2.23 through 2.2.25 */ 1954struct smb2_oplock_break { 1955 struct smb2_hdr hdr; 1956 __le16 StructureSize; /* Must be 24 */ 1957 __u8 OplockLevel; 1958 __u8 Reserved; 1959 __le32 Reserved2; 1960 __u64 PersistentFid; 1961 __u64 VolatileFid; 1962} __packed; 1963 1964#define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01) 1965 1966struct smb2_lease_break { 1967 struct smb2_hdr hdr; 1968 __le16 StructureSize; /* Must be 44 */ 1969 __le16 Epoch; 1970 __le32 Flags; 1971 __u8 LeaseKey[16]; 1972 __le32 CurrentLeaseState; 1973 __le32 NewLeaseState; 1974 __le32 BreakReason; 1975 __le32 AccessMaskHint; 1976 __le32 ShareMaskHint; 1977} __packed; 1978 1979struct smb2_lease_ack { 1980 struct smb2_hdr hdr; 1981 __le16 StructureSize; /* Must be 36 */ 1982 __le16 Reserved; 1983 __le32 Flags; 1984 __u8 LeaseKey[16]; 1985 __le32 LeaseState; 1986 __le64 LeaseDuration; 1987} __packed; 1988 1989#define OP_BREAK_STRUCT_SIZE_20 24 1990#define OP_BREAK_STRUCT_SIZE_21 36 1991 1992/* 1993 * See MS-SMB2 2.2.13.1.1 1994 * MS-SMB 2.2.1.4.1 1995 * These are the file access permission bits defined in CIFS for the 1996 * NTCreateAndX as well as the level 0x107 1997 * TRANS2_QUERY_PATH_INFORMATION API. The level 0x107, SMB_QUERY_FILE_ALL_INFO 1998 * responds with the AccessFlags. 1999 * The AccessFlags specifies the access permissions a caller has to the 2000 * file and can have any suitable combination of the following values: 2001 */ 2002#define FILE_READ_DATA 0x00000001 /* Data can be read from the file */ 2003 /* or directory child entries can */ 2004 /* be listed together with the */ 2005 /* associated child attributes */ 2006 /* (so the FILE_READ_ATTRIBUTES on */ 2007 /* the child entry is not needed) */ 2008#define FILE_WRITE_DATA 0x00000002 /* Data can be written to the file */ 2009 /* or new file can be created in */ 2010 /* the directory */ 2011#define FILE_APPEND_DATA 0x00000004 /* Data can be appended to the file */ 2012 /* (for non-local files over SMB it */ 2013 /* is same as FILE_WRITE_DATA) */ 2014 /* or new subdirectory can be */ 2015 /* created in the directory */ 2016#define FILE_READ_EA 0x00000008 /* Extended attributes associated */ 2017 /* with the file can be read */ 2018#define FILE_WRITE_EA 0x00000010 /* Extended attributes associated */ 2019 /* with the file can be written */ 2020#define FILE_EXECUTE 0x00000020 /*Data can be read into memory from */ 2021 /* the file using system paging I/O */ 2022 /* for executing the file / script */ 2023 /* or right to traverse directory */ 2024 /* (but by default all users have */ 2025 /* directory bypass traverse */ 2026 /* privilege and do not need this */ 2027 /* permission on directories at all)*/ 2028#define FILE_DELETE_CHILD 0x00000040 /* Child entry can be deleted from */ 2029 /* the directory (so the DELETE on */ 2030 /* the child entry is not needed) */ 2031#define FILE_READ_ATTRIBUTES 0x00000080 /* Attributes associated with the */ 2032 /* file or directory can be read */ 2033#define FILE_WRITE_ATTRIBUTES 0x00000100 /* Attributes associated with the */ 2034 /* file or directory can be written */ 2035#define DELETE 0x00010000 /* The file or dir can be deleted */ 2036#define READ_CONTROL 0x00020000 /* The discretionary access control */ 2037 /* list and ownership associated */ 2038 /* with the file or dir can be read */ 2039#define WRITE_DAC 0x00040000 /* The discretionary access control */ 2040 /* list associated with the file or */ 2041 /* directory can be written */ 2042#define WRITE_OWNER 0x00080000 /* Ownership information associated */ 2043 /* with the file/dir can be written */ 2044#define SYNCHRONIZE 0x00100000 /* The file handle can waited on to */ 2045 /* synchronize with the completion */ 2046 /* of an input/output request */ 2047#define SYSTEM_SECURITY 0x01000000 /* The system access control list */ 2048 /* associated with the file or */ 2049 /* directory can be read or written */ 2050 /* (cannot be in DACL, can in SACL) */ 2051#define MAXIMUM_ALLOWED 0x02000000 /* Maximal subset of GENERIC_ALL */ 2052 /* permissions which can be granted */ 2053 /* (cannot be in DACL nor SACL) */ 2054#define GENERIC_ALL 0x10000000 /* Same as: GENERIC_EXECUTE | */ 2055 /* GENERIC_WRITE | */ 2056 /* GENERIC_READ | */ 2057 /* FILE_DELETE_CHILD | */ 2058 /* DELETE | */ 2059 /* WRITE_DAC | */ 2060 /* WRITE_OWNER */ 2061 /* So GENERIC_ALL contains all bits */ 2062 /* mentioned above except these two */ 2063 /* SYSTEM_SECURITY MAXIMUM_ALLOWED */ 2064#define GENERIC_EXECUTE 0x20000000 /* Same as: FILE_EXECUTE | */ 2065 /* FILE_READ_ATTRIBUTES | */ 2066 /* READ_CONTROL | */ 2067 /* SYNCHRONIZE */ 2068#define GENERIC_WRITE 0x40000000 /* Same as: FILE_WRITE_DATA | */ 2069 /* FILE_APPEND_DATA | */ 2070 /* FILE_WRITE_EA | */ 2071 /* FILE_WRITE_ATTRIBUTES | */ 2072 /* READ_CONTROL | */ 2073 /* SYNCHRONIZE */ 2074#define GENERIC_READ 0x80000000 /* Same as: FILE_READ_DATA | */ 2075 /* FILE_READ_EA | */ 2076 /* FILE_READ_ATTRIBUTES | */ 2077 /* READ_CONTROL | */ 2078 /* SYNCHRONIZE */ 2079 2080/* Combinations of file access permission bits */ 2081#define FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES) 2082#define FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \ 2083 | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES) 2084#define FILE_EXEC_RIGHTS (FILE_EXECUTE) 2085#define SET_FILE_EXEC_RIGHTS (FILE_READ_EA | FILE_WRITE_EA | FILE_EXECUTE \ 2086 | FILE_READ_ATTRIBUTES \ 2087 | FILE_WRITE_ATTRIBUTES \ 2088 | DELETE | READ_CONTROL | WRITE_DAC \ 2089 | WRITE_OWNER | SYNCHRONIZE) 2090#define SET_MINIMUM_RIGHTS (FILE_READ_EA | FILE_READ_ATTRIBUTES \ 2091 | READ_CONTROL | SYNCHRONIZE) 2092 2093#endif /* _COMMON_SMB2PDU_H */
~/
Read-only file preview.