Home | History | Annotate | Download | only in impacket
      1 # Copyright (c) 2003-2016 CORE Security Technologies
      2 #
      3 # This software is provided under under a slightly modified version
      4 # of the Apache Software License. See the accompanying LICENSE file
      5 # for more information.
      6 #
      7 # Author: Alberto Solino (@agsolino)
      8 #
      9 # Description:
     10 #   SMB 2 and 3 Protocol Structures and constants [MS-SMB2]
     11 #
     12 
     13 from impacket.structure import Structure
     14 
     15 # Constants
     16 
     17 # SMB Packet
     18 SMB2_PACKET_SIZE     = 64
     19 
     20 # SMB Commands
     21 SMB2_NEGOTIATE       = 0x0000 #
     22 SMB2_SESSION_SETUP   = 0x0001 #
     23 SMB2_LOGOFF          = 0x0002 #
     24 SMB2_TREE_CONNECT    = 0x0003 #
     25 SMB2_TREE_DISCONNECT = 0x0004 #
     26 SMB2_CREATE          = 0x0005 #
     27 SMB2_CLOSE           = 0x0006 #
     28 SMB2_FLUSH           = 0x0007 #
     29 SMB2_READ            = 0x0008 #
     30 SMB2_WRITE           = 0x0009 #
     31 SMB2_LOCK            = 0x000A #
     32 SMB2_IOCTL           = 0x000B #
     33 SMB2_CANCEL          = 0x000C #
     34 SMB2_ECHO            = 0x000D #
     35 SMB2_QUERY_DIRECTORY = 0x000E #
     36 SMB2_CHANGE_NOTIFY   = 0x000F
     37 SMB2_QUERY_INFO      = 0x0010 #
     38 SMB2_SET_INFO        = 0x0011
     39 SMB2_OPLOCK_BREAK    = 0x0012
     40 
     41 # SMB Flags
     42 SMB2_FLAGS_SERVER_TO_REDIR    = 0x00000001
     43 SMB2_FLAGS_ASYNC_COMMAND      = 0x00000002
     44 SMB2_FLAGS_RELATED_OPERATIONS = 0x00000004
     45 SMB2_FLAGS_SIGNED             = 0x00000008
     46 SMB2_FLAGS_DFS_OPERATIONS     = 0x10000000
     47 SMB2_FLAGS_REPLAY_OPERATION   = 0x80000000
     48 
     49 # SMB Error SymLink Flags
     50 SYMLINK_FLAG_ABSOLUTE         = 0x0
     51 SYMLINK_FLAG_RELATIVE         = 0x1
     52 
     53 # SMB2_NEGOTIATE
     54 # Security Modes
     55 SMB2_NEGOTIATE_SIGNING_ENABLED  = 0x1
     56 SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x2
     57 
     58 # Capabilities
     59 SMB2_GLOBAL_CAP_DFS                = 0x01
     60 SMB2_GLOBAL_CAP_LEASING            = 0x02
     61 SMB2_GLOBAL_CAP_LARGE_MTU          = 0x04
     62 SMB2_GLOBAL_CAP_MULTI_CHANNEL      = 0x08
     63 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
     64 SMB2_GLOBAL_CAP_DIRECTORY_LEASING  = 0x20
     65 SMB2_GLOBAL_CAP_ENCRYPTION         = 0x40
     66 
     67 # Dialects
     68 SMB2_DIALECT_002      = 0x0202 
     69 SMB2_DIALECT_21       = 0x0210 
     70 SMB2_DIALECT_30       = 0x0300 
     71 SMB2_DIALECT_WILDCARD = 0x02FF 
     72 
     73 # SMB2_SESSION_SETUP
     74 # Flags
     75 SMB2_SESSION_FLAG_BINDING        = 0x01
     76 SMB2_SESSION_FLAG_IS_GUEST       = 0x01
     77 SMB2_SESSION_FLAG_IS_NULL        = 0x02
     78 SMB2_SESSION_FLAG_ENCRYPT_DATA   = 0x04
     79 
     80 # SMB2_TREE_CONNECT 
     81 # Types
     82 SMB2_SHARE_TYPE_DISK   = 0x1
     83 SMB2_SHARE_TYPE_PIPE   = 0x2
     84 SMB2_SHARE_TYPE_PRINT  = 0x3
     85 
     86 # Share Flags
     87 SMB2_SHAREFLAG_MANUAL_CACHING              = 0x00000000
     88 SMB2_SHAREFLAG_AUTO_CACHING                = 0x00000010
     89 SMB2_SHAREFLAG_VDO_CACHING                 = 0x00000020
     90 SMB2_SHAREFLAG_NO_CACHING                  = 0x00000030
     91 SMB2_SHAREFLAG_DFS                         = 0x00000001
     92 SMB2_SHAREFLAG_DFS_ROOT                    = 0x00000002
     93 SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS    = 0x00000100
     94 SMB2_SHAREFLAG_FORCE_SHARED_DELETE         = 0x00000200
     95 SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING     = 0x00000400
     96 SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM = 0x00000800
     97 SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK        = 0x00001000
     98 SMB2_SHAREFLAG_ENABLE_HASH_V1              = 0x00002000
     99 SMB2_SHAREFLAG_ENABLE_HASH_V2              = 0x00004000
    100 SMB2_SHAREFLAG_ENCRYPT_DATA                = 0x00008000
    101 
    102 # Capabilities
    103 SMB2_SHARE_CAP_DFS                         = 0x00000008
    104 SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY     = 0x00000010
    105 SMB2_SHARE_CAP_SCALEOUT                    = 0x00000020
    106 SMB2_SHARE_CAP_CLUSTER                     = 0x00000040
    107 
    108 # SMB_CREATE 
    109 # Oplocks
    110 SMB2_OPLOCK_LEVEL_NONE       = 0x00
    111 SMB2_OPLOCK_LEVEL_II         = 0x01
    112 SMB2_OPLOCK_LEVEL_EXCLUSIVE  = 0x08
    113 SMB2_OPLOCK_LEVEL_BATCH      = 0x09
    114 SMB2_OPLOCK_LEVEL_LEASE      = 0xFF
    115 
    116 # Impersonation Level
    117 SMB2_IL_ANONYMOUS       = 0x00000000
    118 SMB2_IL_IDENTIFICATION  = 0x00000001
    119 SMB2_IL_IMPERSONATION   = 0x00000002
    120 SMB2_IL_DELEGATE        = 0x00000003
    121 
    122 # File Attributes
    123 FILE_ATTRIBUTE_ARCHIVE             = 0x00000020
    124 FILE_ATTRIBUTE_COMPRESSED          = 0x00000800
    125 FILE_ATTRIBUTE_DIRECTORY           = 0x00000010
    126 FILE_ATTRIBUTE_ENCRYPTED           = 0x00004000
    127 FILE_ATTRIBUTE_HIDDEN              = 0x00000002
    128 FILE_ATTRIBUTE_NORMAL              = 0x00000080
    129 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000
    130 FILE_ATTRIBUTE_OFFLINE             = 0x00001000
    131 FILE_ATTRIBUTE_READONLY            = 0x00000001
    132 FILE_ATTRIBUTE_REPARSE_POINT       = 0x00000400
    133 FILE_ATTRIBUTE_SPARSE_FILE         = 0x00000200
    134 FILE_ATTRIBUTE_SYSTEM              = 0x00000004
    135 FILE_ATTRIBUTE_TEMPORARY           = 0x00000100
    136 FILE_ATTRIBUTE_INTEGRITY_STREAM    = 0x00000800
    137 FILE_ATTRIBUTE_NO_SCRUB_DATA       = 0x00020000
    138 
    139 # Share Access
    140 FILE_SHARE_READ         = 0x00000001
    141 FILE_SHARE_WRITE        = 0x00000002
    142 FILE_SHARE_DELETE       = 0x00000004
    143 
    144 # Create Disposition
    145 FILE_SUPERSEDE          = 0x00000000 
    146 FILE_OPEN               = 0x00000001
    147 FILE_CREATE             = 0x00000002
    148 FILE_OPEN_IF            = 0x00000003
    149 FILE_OVERWRITE          = 0x00000004
    150 FILE_OVERWRITE_IF       = 0x00000005
    151 
    152 # Create Options
    153 FILE_DIRECTORY_FILE            = 0x00000001
    154 FILE_WRITE_THROUGH             = 0x00000002
    155 FILE_SEQUENTIAL_ONLY           = 0x00000004
    156 FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
    157 FILE_SYNCHRONOUS_IO_ALERT      = 0x00000010
    158 FILE_SYNCHRONOUS_IO_NONALERT   = 0x00000020
    159 FILE_NON_DIRECTORY_FILE        = 0x00000040
    160 FILE_COMPLETE_IF_OPLOCKED      = 0x00000100
    161 FILE_NO_EA_KNOWLEDGE           = 0x00000200
    162 FILE_RANDOM_ACCESS             = 0x00000800
    163 FILE_DELETE_ON_CLOSE           = 0x00001000
    164 FILE_OPEN_BY_FILE_ID           = 0x00002000
    165 FILE_OPEN_FOR_BACKUP_INTENT    = 0x00004000
    166 FILE_NO_COMPRESSION            = 0x00008000
    167 FILE_RESERVE_OPFILTER          = 0x00100000
    168 FILE_OPEN_REPARSE_POINT        = 0x00200000 
    169 FILE_OPEN_NO_RECALL            = 0x00400000
    170 FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
    171 
    172 # File Access Mask / Desired Access
    173 FILE_READ_DATA         = 0x00000001
    174 FILE_WRITE_DATA        = 0x00000002
    175 FILE_APPEND_DATA       = 0x00000004
    176 FILE_READ_EA           = 0x00000008
    177 FILE_WRITE_EA          = 0x00000010
    178 FILE_EXECUTE           = 0x00000020
    179 FILE_READ_ATTRIBUTES   = 0x00000080
    180 FILE_WRITE_ATTRIBUTES  = 0x00000100
    181 DELETE                 = 0x00010000
    182 READ_CONTROL           = 0x00020000
    183 WRITE_DAC              = 0x00040000
    184 WRITE_OWNER            = 0x00080000
    185 SYNCHRONIZE            = 0x00100000
    186 ACCESS_SYSTEM_SECURITY = 0x01000000
    187 MAXIMUM_ALLOWED        = 0x02000000
    188 GENERIC_ALL            = 0x10000000
    189 GENERIC_EXECUTE        = 0x20000000
    190 GENERIC_WRITE          = 0x40000000
    191 GENERIC_READ           = 0x80000000
    192 
    193 # Directory Access Mask 
    194 FILE_LIST_DIRECTORY    = 0x00000001
    195 FILE_ADD_FILE          = 0x00000002
    196 FILE_ADD_SUBDIRECTORY  = 0x00000004
    197 FILE_TRAVERSE          = 0x00000020
    198 FILE_DELETE_CHILD      = 0x00000040
    199 
    200 # Create Contexts
    201 SMB2_CREATE_EA_BUFFER                     = 0x45787441 
    202 SMB2_CREATE_SD_BUFFER                     = 0x53656344
    203 SMB2_CREATE_DURABLE_HANDLE_REQUEST        = 0x44486e51 
    204 SMB2_CREATE_DURABLE_HANDLE_RECONNECT      = 0x44486e43 
    205 SMB2_CREATE_ALLOCATION_SIZE               = 0x416c5369 
    206 SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST  = 0x4d784163 
    207 SMB2_CREATE_TIMEWARP_TOKEN                = 0x54577270 
    208 SMB2_CREATE_QUERY_ON_DISK_ID              = 0x51466964 
    209 SMB2_CREATE_REQUEST                       = 0x52714c73 
    210 SMB2_CREATE_REQUEST_LEASE_V2              = 0x52714c73 
    211 SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2     = 0x44483251 
    212 SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2   = 0x44483243 
    213 SMB2_CREATE_APP_INSTANCE_ID               = 0x45BCA66AEFA7F74A9008FA462E144D74 
    214 
    215 # Flags
    216 SMB2_CREATE_FLAG_REPARSEPOINT  = 0x1
    217 FILE_NEED_EA                   = 0x80
    218 
    219 # CreateAction
    220 FILE_SUPERSEDED    = 0x00000000
    221 FILE_OPENED        = 0x00000001
    222 FILE_CREATED       = 0x00000002
    223 FILE_OVERWRITTEN   = 0x00000003
    224 
    225 # SMB2_CREATE_REQUEST_LEASE states
    226 SMB2_LEASE_NONE            = 0x00
    227 SMB2_LEASE_READ_CACHING    = 0x01
    228 SMB2_LEASE_HANDLE_CACHING  = 0x02
    229 SMB2_LEASE_WRITE_CACHING   = 0x04
    230 
    231 # SMB2_CREATE_REQUEST_LEASE_V2 Flags
    232 SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET = 0x4
    233 
    234 # SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 Flags
    235 SMB2_DHANDLE_FLAG_PERSISTENT = 0x02
    236  
    237 # SMB2_CLOSE
    238 # Flags
    239 SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB  = 0x0001
    240 
    241 # SMB2_READ
    242 # Channel
    243 SMB2_CHANNEL_NONE     = 0x00
    244 SMB2_CHANNEL_RDMA_V1  = 0x01
    245 
    246 # SMB2_WRITE
    247 # Flags
    248 SMB2_WRITEFLAG_WRITE_THROUGH = 0x01
    249 
    250 # Lease Break Notification
    251 SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED  = 0x01
    252 
    253 # SMB_LOCK
    254 # Flags
    255 SMB2_LOCKFLAG_SHARED_LOCK       = 0x01
    256 SMB2_LOCKFLAG_EXCLUSIVE_LOCK    = 0x02
    257 SMB2_LOCKFLAG_UNLOCK            = 0x04
    258 SMB2_LOCKFLAG_FAIL_IMMEDIATELY  = 0x10
    259 
    260 # SMB IOCTL
    261 # Control Codes
    262 FSCTL_DFS_GET_REFERRALS              = 0x00060194
    263 FSCTL_PIPE_PEEK                      = 0x0011400C
    264 FSCTL_PIPE_WAIT                      = 0x00110018
    265 FSCTL_PIPE_TRANSCEIVE                = 0x0011C017
    266 FSCTL_SRV_COPYCHUNK                  = 0x001440F2
    267 FSCTL_SRV_ENUMERATE_SNAPSHOTS        = 0x00144064
    268 FSCTL_SRV_REQUEST_RESUME_KEY         = 0x00140078
    269 FSCTL_SRV_READ_HASH                  = 0x001441bb
    270 FSCTL_SRV_COPYCHUNK_WRITE            = 0x001480F2
    271 FSCTL_LMR_REQUEST_RESILIENCY         = 0x001401D4
    272 FSCTL_QUERY_NETWORK_INTERFACE_INFO   = 0x001401FC
    273 FSCTL_SET_REPARSE_POINT              = 0x000900A4
    274 FSCTL_DFS_GET_REFERRALS_EX           = 0x000601B0
    275 FSCTL_FILE_LEVEL_TRIM                = 0x00098208
    276 FSCTL_VALIDATE_NEGOTIATE_INFO        = 0x00140204
    277 
    278 # Flags
    279 SMB2_0_IOCTL_IS_FSCTL  = 0x1
    280 
    281 # SRV_READ_HASH
    282 # Type
    283 SRV_HASH_TYPE_PEER_DIST  = 0x01
    284 
    285 # Version
    286 SRV_HASH_VER_1  = 0x1
    287 SRV_HASH_VER_2  = 0x2
    288 
    289 # Retrieval Type
    290 SRV_HASH_RETRIEVE_HASH_BASED  = 0x01
    291 SRV_HASH_RETRIEVE_FILE_BASED  = 0x02
    292 
    293 # NETWORK_INTERFACE_INFO
    294 # Capabilities
    295 RSS_CAPABLE  = 0x01
    296 RDMA_CAPABLE = 0x02
    297 
    298 # SMB2_QUERY_DIRECTORIES
    299 # Information Class 
    300 FILE_DIRECTORY_INFORMATION         = 0x01
    301 FILE_FULL_DIRECTORY_INFORMATION    = 0x02
    302 FILEID_FULL_DIRECTORY_INFORMATION  = 0x26
    303 FILE_BOTH_DIRECTORY_INFORMATION    = 0x03
    304 FILEID_BOTH_DIRECTORY_INFORMATION  = 0x25
    305 FILENAMES_INFORMATION              = 0x0C
    306 
    307 # Flags
    308 SMB2_RESTART_SCANS        = 0x01
    309 SMB2_RETURN_SINGLE_ENTRY  = 0x02
    310 SMB2_INDEX_SPECIFIED      = 0x04
    311 SMB2_REOPEN               = 0x10
    312 
    313 # SMB2_CHANGE_NOTIFY
    314 # Flags
    315 SMB2_WATCH_TREE  = 0x01
    316 
    317 # Filters
    318 FILE_NOTIFY_CHANGE_FILE_NAME     = 0x00000001
    319 FILE_NOTIFY_CHANGE_DIR_NAME      = 0x00000002
    320 FILE_NOTIFY_CHANGE_ATTRIBUTES    = 0x00000004
    321 FILE_NOTIFY_CHANGE_SIZE          = 0x00000008
    322 FILE_NOTIFY_CHANGE_LAST_WRITE    = 0x00000010
    323 FILE_NOTIFY_CHANGE_LAST_ACCESS   = 0x00000020
    324 FILE_NOTIFY_CHANGE_CREATION      = 0x00000040
    325 FILE_NOTIFY_CHANGE_EA            = 0x00000080
    326 FILE_NOTIFY_CHANGE_SECURITY      = 0x00000100
    327 FILE_NOTIFY_CHANGE_STREAM_NAME   = 0x00000200
    328 FILE_NOTIFY_CHANGE_STREAM_SIZE   = 0x00000400
    329 FILE_NOTIFY_CHANGE_STREAM_WRITE  = 0x00000800
    330 
    331 # FILE_NOTIFY_INFORMATION
    332 # Actions
    333 FILE_ACTION_ADDED            = 0x00000001
    334 FILE_ACTION_REMOVED          = 0x00000002
    335 FILE_ACTION_MODIFIED         = 0x00000003
    336 FILE_ACTION_RENAMED_OLD_NAME = 0x00000004 
    337 FILE_ACTION_RENAMED_NEW_NAME = 0x00000005
    338 
    339 # SMB2_QUERY_INFO
    340 # InfoTypes
    341 SMB2_0_INFO_FILE        = 0x01
    342 SMB2_0_INFO_FILESYSTEM  = 0x02
    343 SMB2_0_INFO_SECURITY    = 0x03
    344 SMB2_0_INFO_QUOTA       = 0x04
    345 
    346 # File Information Classes
    347 SMB2_FILE_ACCESS_INFO                 = 8
    348 SMB2_FILE_ALIGNMENT_INFO              = 17
    349 SMB2_FILE_ALL_INFO                    = 18
    350 SMB2_FILE_ALLOCATION_INFO             = 19
    351 SMB2_FILE_ALTERNATE_NAME_INFO         = 21
    352 SMB2_ATTRIBUTE_TAG_INFO               = 35
    353 SMB2_FILE_BASIC_INFO                  = 4
    354 SMB2_FILE_BOTH_DIRECTORY_INFO         = 3
    355 SMB2_FILE_COMPRESSION_INFO            = 28
    356 SMB2_FILE_DIRECTORY_INFO              = 1
    357 SMB2_FILE_DISPOSITION_INFO            = 13
    358 SMB2_FILE_EA_INFO                     = 7
    359 SMB2_FILE_END_OF_FILE_INFO            = 20
    360 SMB2_FULL_DIRECTORY_INFO              = 2
    361 SMB2_FULL_EA_INFO                     = 15
    362 SMB2_FILE_HARDLINK_INFO               = 46
    363 SMB2_FILE_ID_BOTH_DIRECTORY_INFO      = 37
    364 SMB2_FILE_ID_FULL_DIRECTORY_INFO      = 38
    365 SMB2_FILE_ID_GLOBAL_TX_DIRECTORY_INFO = 50
    366 SMB2_FILE_INTERNAL_INFO               = 6
    367 SMB2_FILE_LINK_INFO                   = 11
    368 SMB2_FILE_MAILSLOT_QUERY_INFO         = 26
    369 SMB2_FILE_MAILSLOT_SET_INFO           = 27
    370 SMB2_FILE_MODE_INFO                   = 16
    371 SMB2_FILE_MOVE_CLUSTER_INFO           = 31
    372 SMB2_FILE_NAME_INFO                   = 9
    373 SMB2_FILE_NAMES_INFO                  = 12
    374 SMB2_FILE_NETWORK_OPEN_INFO           = 34
    375 SMB2_FILE_NORMALIZED_NAME_INFO        = 48
    376 SMB2_FILE_OBJECT_ID_INFO              = 29
    377 SMB2_FILE_PIPE_INFO                   = 23
    378 SMB2_FILE_PIPE_LOCAL_INFO             = 24
    379 SMB2_FILE_PIPE_REMOTE_INFO            = 25
    380 SMB2_FILE_POSITION_INFO               = 14
    381 SMB2_FILE_QUOTA_INFO                  = 32
    382 SMB2_FILE_RENAME_INFO                 = 10
    383 SMB2_FILE_REPARSE_POINT_INFO          = 33
    384 SMB2_FILE_SFIO_RESERVE_INFO           = 44
    385 SMB2_FILE_SHORT_NAME_INFO             = 45
    386 SMB2_FILE_STANDARD_INFO               = 5
    387 SMB2_FILE_STANDARD_LINK_INFO          = 54
    388 SMB2_FILE_STREAM_INFO                 = 22
    389 SMB2_FILE_TRACKING_INFO               = 36
    390 SMB2_FILE_VALID_DATA_LENGTH_INFO      = 39
    391 
    392 # File System Information Classes
    393 SMB2_FILESYSTEM_VOLUME_INFO           = 1
    394 SMB2_FILESYSTEM_LABEL_INFO            = 2
    395 SMB2_FILESYSTEM_SIZE_INFO             = 3
    396 SMB2_FILESYSTEM_DEVICE_INFO           = 4
    397 SMB2_FILESYSTEM_ATTRIBUTE_INFO        = 5
    398 SMB2_FILESYSTEM_CONTROL_INFO          = 6
    399 SMB2_FILESYSTEM_FULL_SIZE_INFO        = 7
    400 SMB2_FILESYSTEM_OBJECT_ID_INFO        = 8
    401 SMB2_FILESYSTEM_DRIVER_PATH_INFO      = 9
    402 SMB2_FILESYSTEM_SECTOR_SIZE_INFO      = 11
    403 
    404 # Additional information
    405 OWNER_SECURITY_INFORMATION  = 0x00000001
    406 GROUP_SECURITY_INFORMATION  = 0x00000002
    407 DACL_SECURITY_INFORMATION   = 0x00000004
    408 SACL_SECURITY_INFORMATION   = 0x00000008
    409 LABEL_SECURITY_INFORMATION  = 0x00000010
    410 
    411 # Flags
    412 SL_RESTART_SCAN         = 0x00000001
    413 SL_RETURN_SINGLE_ENTRY  = 0x00000002
    414 SL_INDEX_SPECIFIED      = 0x00000004
    415 
    416 # TRANSFORM_HEADER
    417 SMB2_ENCRYPTION_AES128_CCM = 0x0001
    418 
    419 
    420 # STRUCtures
    421 # Represents a SMB2/3 Packet
    422 class SMBPacketBase(Structure):
    423     def addCommand(self,command):
    424         # Pad to 8 bytes and put the offset of another SMBPacket
    425         raise 'Implement This!' 
    426 
    427     def isValidAnswer(self, status):
    428         if self['Status'] != status:
    429             import smb3
    430             raise smb3.SessionError(self['Status'], self)
    431         return True
    432 
    433     def __init__(self, data = None):
    434         Structure.__init__(self,data)
    435         if data is None:
    436             self['TreeID'] = 0
    437 
    438 
    439 class SMB2PacketAsync(SMBPacketBase):
    440     structure = (
    441         ('ProtocolID','"\xfeSMB'),
    442         ('StructureSize','<H=64'),
    443         ('CreditCharge','<H=0'),
    444         ('Status','<L=0'),
    445         ('Command','<H=0'),
    446         ('CreditRequestResponse','<H=0'),
    447         ('Flags','<L=0'),
    448         ('NextCommand','<L=0'),
    449         ('MessageID','<Q=0'),
    450         ('AsyncID','<Q=0'),
    451         ('SessionID','<Q=0'),
    452         ('Signature','16s=""'),
    453         ('Data',':=""'),
    454     )
    455 
    456 class SMB3PacketAsync(SMBPacketBase):
    457     structure = (
    458         ('ProtocolID','"\xfeSMB'),
    459         ('StructureSize','<H=64'),
    460         ('CreditCharge','<H=0'),
    461         ('ChannelSequence','<H=0'),
    462         ('Reserved','<H=0'),
    463         ('Command','<H=0'),
    464         ('CreditRequestResponse','<H=0'),
    465         ('Flags','<L=0'),
    466         ('NextCommand','<L=0'),
    467         ('MessageID','<Q=0'),
    468         ('AsyncID','<Q=0'),
    469         ('SessionID','<Q=0'),
    470         ('Signature','16s=""'),
    471         ('Data',':=""'),
    472     )
    473 
    474 class SMB2Packet(SMBPacketBase):
    475     structure = (
    476         ('ProtocolID','"\xfeSMB'),
    477         ('StructureSize','<H=64'),
    478         ('CreditCharge','<H=0'),
    479         ('Status','<L=0'),
    480         ('Command','<H=0'),
    481         ('CreditRequestResponse','<H=0'),
    482         ('Flags','<L=0'),
    483         ('NextCommand','<L=0'),
    484         ('MessageID','<Q=0'),
    485         ('Reserved','<L=0'),
    486         ('TreeID','<L=0'),
    487         ('SessionID','<Q=0'),
    488         ('Signature','16s=""'),
    489         ('Data',':=""'),
    490     )
    491 
    492 class SMB3Packet(SMBPacketBase):
    493     structure = (
    494         ('ProtocolID','"\xfeSMB'),
    495         ('StructureSize','<H=64'),
    496         ('CreditCharge','<H=0'),
    497         ('ChannelSequence','<H=0'),
    498         ('Reserved','<H=0'),
    499         ('Command','<H=0'),
    500         ('CreditRequestResponse','<H=0'),
    501         ('Flags','<L=0'),
    502         ('NextCommand','<L=0'),
    503         ('MessageID','<Q=0'),
    504         ('Reserved','<L=0'),
    505         ('TreeID','<L=0'),
    506         ('SessionID','<Q=0'),
    507         ('Signature','16s=""'),
    508         ('Data',':=""'),
    509     )
    510 
    511 class SMB2Error(Structure):
    512     structure = (
    513         ('StructureSize','<H=9'),
    514         ('Reserved','<H=0'),
    515         ('ByteCount','<L=0'),
    516         ('_ErrorData','_-ErrorData','self["ByteCount"]'),
    517         ('ErrorData','"\xff'),
    518     )
    519 
    520 class SMB2ErrorSymbolicLink(Structure):
    521     structure = (
    522         ('SymLinkLength','<L=0'),
    523         ('SymLinkErrorTag','<L=0'),
    524         ('ReparseTag','<L=0'),
    525         ('ReparseDataLenght','<H=0'),
    526         ('UnparsedPathLength','<H=0'),
    527         ('SubstituteNameOffset','<H=0'),
    528         ('SubstituteNameLength','<H=0'),
    529         ('PrintNameOffset','<H=0'),
    530         ('PrintNameLength','<H=0'),
    531         ('Flags','<L=0'),
    532         ('PathBuffer',':'),
    533     )
    534 
    535 # SMB2_NEGOTIATE
    536 class SMB2Negotiate(Structure):
    537     structure = (
    538         ('StructureSize','<H=36'),
    539         ('DialectCount','<H=0'),
    540         ('SecurityMode','<H=0'),
    541         ('Reserved','<H=0'),
    542         ('Capabilities','<L=0'),
    543         ('ClientGuid','16s=""'),
    544         ('ClientStartTime','<Q=0'),
    545         ('Dialects','*<H'),
    546     )
    547 
    548 class SMB2Negotiate_Response(Structure):
    549     structure = (
    550         ('StructureSize','<H=65'),
    551         ('SecurityMode','<H=0'),
    552         ('DialectRevision','<H=0'),
    553         ('Reserved','<H=0'),
    554         ('ServerGuid','16s=""'),
    555         ('Capabilities','<L=0'),
    556         ('MaxTransactSize','<L=0'),
    557         ('MaxReadSize','<L=0'),
    558         ('MaxWriteSize','<L=0'),
    559         ('SystemTime','<Q=0'),
    560         ('ServerStartTime','<Q=0'),
    561         ('SecurityBufferOffset','<H=0'),
    562         ('SecurityBufferLength','<H=0'),
    563         ('Reserved2','<L=0'),
    564         ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
    565         ('AlignPad',':=""'),
    566         ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
    567         ('Buffer',':'),
    568     )
    569 
    570 # SMB2_SESSION_SETUP 
    571 class SMB2SessionSetup(Structure):
    572     SIZE = 24
    573     structure = (
    574         ('StructureSize','<H=25'),
    575         ('Flags','<B=0'),
    576         ('SecurityMode','<B=0'),
    577         ('Capabilities','<L=0'),
    578         ('Channel','<L=0'),
    579         ('SecurityBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
    580         ('SecurityBufferLength','<H=0'),
    581         ('PreviousSessionId','<Q=0'),
    582         ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
    583         ('AlignPad',':=""'),
    584         ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
    585         ('Buffer',':'),
    586     )
    587 
    588     def __init__(self, data = None):
    589         Structure.__init__(self,data)
    590         if data is None:
    591             self['AlignPad'] = ''
    592 
    593     def getData(self):
    594         #self['AlignPad'] = '\x00' * ((8 - ((24 + SMB2_PACKET_SIZE) & 7)) & 7)
    595         #self['SecurityBufferOffset'] = 24 + SMB2_PACKET_SIZE +len(self['AlignPad']) 
    596         #self['SecurityBufferLength'] += len(self['AlignPad'])
    597         return Structure.getData(self)
    598         
    599 
    600 class SMB2SessionSetup_Response(Structure):
    601     structure = (
    602         ('StructureSize','<H=9'),
    603         ('SessionFlags','<H=0'),
    604         ('SecurityBufferOffset','<H=0'),
    605         ('SecurityBufferLength','<H=0'),
    606         ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'),
    607         ('AlignPad',':=""'),
    608         ('_Buffer','_-Buffer','self["SecurityBufferLength"]'),
    609         ('Buffer',':'),
    610     )
    611 
    612 # SMB2_LOGOFF
    613 class SMB2Logoff(Structure):
    614     structure = (
    615         ('StructureSize','<H=4'),
    616         ('Reserved','<H=0'),
    617     ) 
    618 
    619 
    620 class SMB2Logoff_Response(Structure):
    621     structure = (
    622         ('StructureSize','<H=4'),
    623         ('Reserved','<H=0'),
    624     )
    625 
    626 # SMB2_TREE_CONNECT
    627 class SMB2TreeConnect(Structure):
    628     SIZE = 8
    629     structure = (
    630         ('StructureSize','<H=9'),
    631         ('Reserved','<H=0'),
    632         ('PathOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
    633         ('PathLength','<H=0'),
    634         ('_AlignPad','_-AlignPad','self["PathOffset"] - (64 + self.SIZE - 1)'),
    635         ('AlignPad',':=""'),
    636         ('_Buffer','_-Buffer','self["PathLength"]'),
    637         ('Buffer',':'),
    638     )
    639     def __init__(self, data = None):
    640         Structure.__init__(self,data)
    641         if data is None:
    642             self['AlignPad'] = ''
    643 
    644 class SMB2TreeConnect_Response(Structure):
    645     structure = (
    646         ('StructureSize','<H=16'),
    647         ('ShareType','<B=0'),
    648         ('Reserved','<B=0'),
    649         ('ShareFlags','<L=0'),
    650         ('Capabilities','<L=0'),
    651         ('MaximalAccess','<L=0'),
    652     )
    653 
    654 # SMB2_TREE_DISCONNECT
    655 class SMB2TreeDisconnect(Structure):
    656     structure = (
    657         ('StructureSize','<H=4'),
    658         ('Reserved','<H=0'),
    659     )
    660 
    661 class SMB2TreeDisconnect_Response(Structure):
    662     structure = (
    663         ('StructureSize','<H=4'),
    664         ('Reserved','<H=0'),
    665     )
    666 
    667 # SMB2_CREATE
    668 class SMB2Create(Structure):
    669     SIZE = 56
    670     structure = (
    671         ('StructureSize','<H=57'),
    672         ('SecurityFlags','<B=0'),
    673         ('RequestedOplockLevel','<B=0'),
    674         ('ImpersonationLevel','<L=0'),
    675         ('SmbCreateFlags','<Q=0'),
    676         ('Reserved','<Q=0'),
    677         ('DesiredAccess','<L=0'),
    678         ('FileAttributes','<L=0'),
    679         ('ShareAccess','<L=0'),
    680         ('CreateDisposition','<L=0'),
    681         ('CreateOptions','<L=0'),
    682         ('NameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
    683         ('NameLength','<H=0'),
    684         ('CreateContextsOffset','<L=0'),
    685         ('CreateContextsLength','<L=0'),
    686         ('_AlignPad','_-AlignPad','self["NameOffset"] - (64 + self["StructureSize"] - 1)'),
    687         ('AlignPad',':=""'),
    688         ('_Buffer','_-Buffer','self["CreateContextsLength"]+self["NameLength"]'),
    689         ('Buffer',':'),
    690     )
    691     def __init__(self, data = None):
    692         Structure.__init__(self,data)
    693         if data is None:
    694             self['AlignPad'] = ''
    695 
    696 class SMB2CreateContext(Structure):
    697      structure = (
    698          ('Next','<L=0'),
    699          ('NameOffset','<H=0'),
    700          ('NameLength','<H=0'),
    701          ('Reserved','<H=0'),
    702          ('DataOffset','<H=0'),
    703          ('DataLength','<L=0'),
    704          ('_Buffer','_-Buffer','self["DataLength"]+self["NameLength"]'),
    705          ('Buffer',':'),
    706      )
    707 
    708 class SMB2_FILEID(Structure):
    709     structure = (
    710         ('Persistent','<Q=0'),
    711         ('Volatile','<Q=0'),
    712     )
    713 
    714 class SMB2Create_Response(Structure):
    715     structure = (
    716         ('StructureSize','<H=89'),
    717         ('OplockLevel','<B=0'),
    718         ('Flags','<B=0'),
    719         ('CreateAction','<L=0'),
    720         ('CreationTime','<Q=0'),
    721         ('LastAccessTime','<Q=0'),
    722         ('LastWriteTime','<Q=0'),
    723         ('ChangeTime','<Q=0'),
    724         ('AllocationSize','<Q=0'),
    725         ('EndOfFile','<Q=0'),
    726         ('FileAttributes','<L=0'),
    727         ('Reserved2','<L=0'),
    728         ('FileID',':',SMB2_FILEID),
    729         ('CreateContextsOffset','<L=0'),
    730         ('CreateContextsLength','<L=0'),
    731         ('_AlignPad','_-AlignPad','self["CreateContextsOffset"] - (64 + self["StructureSize"] - 1)'),
    732         ('AlignPad',':=""'),
    733         ('_Buffer','_-Buffer','self["CreateContextsLength"]'),
    734         ('Buffer',':'),
    735     )
    736 
    737 class FILE_FULL_EA_INFORMATION(Structure):
    738     structure = (
    739         ('NextEntryOffset','<L=0'),
    740         ('Flags','<B=0'),
    741         ('EaNameLength','<B=0'),
    742         ('EaValueLength','<H=0'),
    743         ('_EaName','_-EaName','self["EaNameLength"]'),
    744         ('EaName',':'),
    745         ('_EaValue','_-EaValue','self["EaValue"]'),
    746         ('EaValue',':'),
    747     )
    748 
    749 
    750 class SMB2_CREATE_DURABLE_HANDLE_RECONNECT(Structure):
    751     structure = (
    752         ('Data',':',SMB2_FILEID),
    753     )
    754 
    755 class SMB2_CREATE_DURABLE_HANDLE_REQUEST(Structure):
    756     structure = (
    757         ('DurableRequest','16s=""'),
    758     )
    759 
    760 class SMB2_CREATE_DURABLE_HANDLE_RESPONSE(Structure):
    761     structure = (
    762         ('Reserved','<Q=0'),
    763     )
    764 
    765 class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST(Structure):
    766     structure = (
    767         ('Timestamp','<Q=0'),
    768     )
    769 
    770 class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE(Structure):
    771     structure = (
    772         ('QueryStatus','<L=0'),
    773         ('MaximalAccess','<L=0'),
    774     )
    775 
    776 class SMB2_CREATE_ALLOCATION_SIZE(Structure):
    777     structure = (
    778         ('AllocationSize','<Q=0'),
    779     )
    780 
    781 class SMB2_CREATE_TIMEWARP_TOKEN(Structure):
    782     structure = (
    783         ('AllocationSize','<Q=0'),
    784     )
    785 
    786 class SMB2_CREATE_REQUEST_LEASE(Structure):
    787     structure = (
    788         ('LeaseKey','16s=""'),
    789         ('LeaseState','<L=0'),
    790         ('LeaseFlags','<L=0'),
    791         ('LeaseDuration','<Q=0'),
    792     )
    793 
    794 SMB2_CREATE_RESPONSE_LEASE = SMB2_CREATE_REQUEST_LEASE
    795 
    796 class SMB2_CREATE_REQUEST_LEASE_V2(Structure):
    797     structure = (
    798         ('LeaseKey','16s=""'),
    799         ('LeaseState','<L=0'),
    800         ('Flags','<L=0'),
    801         ('LeaseDuration','<Q=0'),
    802         ('ParentLeaseKey','16s=""'),
    803         ('Epoch','<H=0'),
    804         ('Reserved','<H=0'),
    805     )
    806 
    807 SMB2_CREATE_RESPONSE_LEASE_V2 = SMB2_CREATE_REQUEST_LEASE_V2
    808 
    809 class SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2(Structure):
    810     structure = (
    811         ('Timeout','<L=0'),
    812         ('Flags','<L=0'),
    813         ('Reserved','8s=""'),
    814         ('CreateGuid','16s=""'),
    815     )
    816 
    817 class SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2(Structure):
    818     structure = (
    819         ('Timeout','<L=0'),
    820         ('Flags','<L=0'),
    821     )
    822 
    823 class SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2(Structure):
    824     structure = (
    825         ('FileID',':', SMB2_FILEID),
    826         ('CreateGuid','16s=""'),
    827         ('Flags','<L=0'),
    828     )
    829 
    830 class SMB2_CREATE_APP_INSTANCE_ID(Structure):
    831     structure = (
    832         ('StructureSize','<H=0'),
    833         ('Reserved','<H=0'),
    834         ('AppInstanceId','16s=""'),
    835     )
    836 
    837 class SMB2_CREATE_QUERY_ON_DISK_ID(Structure):
    838     structure = (
    839         ('DiskIDBuffer','32s=""'),
    840     )
    841 
    842 # Todo: Add Classes for
    843 #SMB2_CREATE_SD_BUFFER                    
    844 
    845 # SMB2_CLOSE
    846 class SMB2Close(Structure):
    847     structure = (
    848         ('StructureSize','<H=24'),
    849         ('Flags','<H=0'),
    850         ('Reserved','<L=0'),
    851         ('FileID',':', SMB2_FILEID),
    852     )
    853 
    854 class SMB2Close_Response(Structure):
    855     structure = (
    856         ('StructureSize','<H=60'),
    857         ('Flags','<H=0'),
    858         ('Reserved','<L=0'),
    859         ('CreationTime','<Q=0'),
    860         ('LastAccessTime','<Q=0'),
    861         ('LastWriteTime','<Q=0'),
    862         ('ChangeTime','<Q=0'),
    863         ('AllocationSize','<Q=0'),
    864         ('EndofFile','<Q=0'),
    865         ('FileAttributes','<L=0'),
    866     )
    867 
    868 # SMB2_FLUSH
    869 class SMB2Flush(Structure):
    870     structure = (
    871         ('StructureSize','<H=24'),
    872         ('Reserved1','<H=0'),
    873         ('Reserved2','<L=0'),
    874         ('FileID',':',SMB2_FILEID),
    875     )
    876 
    877 class SMB2Flush_Response(Structure):
    878     structure = (
    879         ('StructureSize','<H=4'),
    880         ('Reserved','<H=0'),
    881     )
    882 
    883 # SMB2_READ
    884 class SMB2Read(Structure):
    885     SIZE = 48
    886     structure = (
    887         ('StructureSize','<H=49'),
    888         ('Padding','<B=0'),
    889         ('Reserved','<B=0'),
    890         ('Length','<L=0'),
    891         ('Offset','<Q=0'),
    892         ('FileID',':',SMB2_FILEID),
    893         ('MinimumCount','<L=0'),
    894         ('Channel','<L=0'),
    895         ('RemainingBytes','<L=0'),
    896         ('ReadChannelInfoOffset','<H=0'),
    897         ('ReadChannelInfoLength','<H=0'),
    898         ('_AlignPad','_-AlignPad','self["ReadChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
    899         ('AlignPad',':=""'),
    900         ('_Buffer','_-Buffer','self["ReadChannelInfoLength"]'),
    901         ('Buffer',':=0'),
    902     )
    903     def __init__(self, data = None):
    904         Structure.__init__(self,data)
    905         if data is None:
    906             self['AlignPad'] = ''
    907 
    908 
    909 class SMB2Read_Response(Structure):
    910     structure = (
    911         ('StructureSize','<H=17'),
    912         ('DataOffset','<B=0'),
    913         ('Reserved','<B=0'),
    914         ('DataLength','<L=0'),
    915         ('DataRemaining','<L=0'),
    916         ('Reserved2','<L=0'),
    917         ('_AlignPad','_-AlignPad','self["DataOffset"] - (64 + self["StructureSize"] - 1)'),
    918         ('AlignPad',':=""'),
    919         ('_Buffer','_-Buffer','self["DataLength"]'),
    920         ('Buffer',':'),
    921     )
    922 
    923 # SMB2_WRITE
    924 class SMB2Write(Structure):
    925     SIZE = 48
    926     structure = (
    927         ('StructureSize','<H=49'),
    928         ('DataOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
    929         ('Length','<L=0'),
    930         ('Offset','<Q=0'),
    931         ('FileID',':',SMB2_FILEID),
    932         ('Channel','<L=0'),
    933         ('RemainingBytes','<L=0'),
    934         ('WriteChannelInfoOffset','<H=0'),
    935         ('WriteChannelInfoLength','<H=0'),
    936         ('_AlignPad','_-AlignPad','self["DataOffset"] + self["WriteChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'),
    937         ('AlignPad',':=""'),
    938         ('Flags','<L=0'),
    939         ('_Buffer','_-Buffer','self["Length"]+self["WriteChannelInfoLength"]'),
    940         ('Buffer',':'),
    941     )
    942     def __init__(self, data = None):
    943         Structure.__init__(self,data)
    944         if data is None:
    945             self['AlignPad'] = ''
    946 
    947 
    948 class SMB2Write_Response(Structure):
    949     structure = (
    950         ('StructureSize','<H=17'),
    951         ('Reserved','<H=0'),
    952         ('Count','<L=0'),
    953         ('Remaining','<L=0'),
    954         ('WriteChannelInfoOffset','<H=0'),
    955         ('WriteChannelInfoLength','<H=0'),
    956     )
    957 
    958 class SMB2OplockBreakNotification(Structure):
    959     structure = (
    960         ('StructureSize','<H=24'),
    961         ('OplockLevel','<B=0'),
    962         ('Reserved','<B=0'),
    963         ('Reserved2','<L=0'),
    964         ('FileID',':',SMB2_FILEID),
    965     )
    966 
    967 SMB2OplockBreakAcknowledgment = SMB2OplockBreakNotification
    968 SMB2OplockBreakResponse       = SMB2OplockBreakNotification
    969 
    970 class SMB2LeaseBreakNotification(Structure):
    971     structure = (
    972         ('StructureSize','<H=44'),
    973         ('NewEpoch','<H=0'),
    974         ('Flags','<L=0'),
    975         ('LeaseKey','16s=""'),
    976         ('CurrentLeaseState','<L=0'),
    977         ('NewLeaseState','<L=0'),
    978         ('BreakReason','<L=0'),
    979         ('AccessMaskHint','<L=0'),
    980         ('ShareMaskHint','<L=0'),
    981     )
    982 
    983 class SMB2LeaseBreakAcknowledgement(Structure):
    984     structure = (
    985         ('StructureSize','<H=36'),
    986         ('Reserved','<H=0'),
    987         ('Flags','<L=0'),
    988         ('LeaseKey','16s=""'),
    989         ('LeaseState','<L=0'),
    990         ('LeaseDuration','<Q=0'),
    991     )
    992 
    993 SMB2LeaseBreakResponse = SMB2LeaseBreakAcknowledgement
    994 
    995 # SMB2_LOCK
    996 class SMB2_LOCK_ELEMENT(Structure):
    997     structure = (
    998         ('Offset','<Q=0'),
    999         ('Length','<Q=0'),
   1000         ('Flags','<L=0'),
   1001         ('Reserved','<L=0'),
   1002     )
   1003 
   1004 class SMB2Lock(Structure):
   1005     structure = (
   1006         ('StructureSize','<H=48'),
   1007         ('LockCount','<H=0'),
   1008         ('LockSequence','<L=0'),
   1009         ('FileID',':',SMB2_FILEID),
   1010         ('_Locks','_-Locks','self["LockCount"]*24'),
   1011         ('Locks',':'),
   1012     )
   1013 
   1014 class SMB2Lock_Response(Structure):
   1015     structure = (
   1016         ('StructureSize','<H=4'),
   1017         ('Reserved','<H=0'),
   1018     )
   1019 
   1020 
   1021 # SMB2_ECHO
   1022 class SMB2Echo(Structure):
   1023     structure = (
   1024         ('StructureSize','<H=4'),
   1025         ('Reserved','<H=0'),
   1026     )
   1027 
   1028 SMB2Echo_Response = SMB2Echo
   1029 
   1030 # SMB2_CANCEL`
   1031 class SMB2Cancel(Structure):
   1032     structure = (
   1033         ('StructureSize','<H=4'),
   1034         ('Reserved','<H=0'),
   1035     )
   1036 
   1037 # SMB2_IOCTL
   1038 class SMB2Ioctl(Structure):
   1039     SIZE = 56
   1040     structure = (
   1041         ('StructureSize','<H=57'),
   1042         ('Reserved','<H=0'),
   1043         ('CtlCode','<L=0'),
   1044         ('FileID',':',SMB2_FILEID),
   1045         ('InputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]))'),
   1046         ('InputCount','<L=0'),
   1047         ('MaxInputResponse','<L=0'),
   1048         ('OutputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]) + self["InputCount"])'),
   1049         ('OutputCount','<L=0'),
   1050         ('MaxOutputResponse','<L=0'),
   1051         ('Flags','<L=0'),
   1052         ('Reserved2','<L=0'),
   1053         #('_AlignPad','_-AlignPad','self["InputOffset"] + self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
   1054         #('AlignPad',':=""'),
   1055         ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
   1056         ('Buffer',':'),
   1057     )
   1058     def __init__(self, data = None):
   1059         Structure.__init__(self,data)
   1060         if data is None:
   1061             self['AlignPad'] = ''
   1062 
   1063 class FSCTL_PIPE_WAIT_STRUCTURE(Structure):
   1064     structure = (
   1065         ('Timeout','<q=0'),
   1066         ('NameLength','<L=0'),
   1067         ('TimeoutSpecified','<B=0'),
   1068         ('Padding','<B=0'),
   1069         ('_Name','_-Name','self["NameLength"]'),
   1070         ('Name',':'),
   1071     )
   1072 
   1073 class SRV_COPYCHUNK_COPY(Structure):
   1074     structure = (
   1075         ('SourceKey','24s=""'),
   1076         ('ChunkCount','<L=0'),
   1077         ('Reserved','<L=0'),
   1078         ('_Chunks','_-Chunks', 'self["ChunkCount"]*len(SRV_COPYCHUNK)'),
   1079         ('Chunks',':'),
   1080     )
   1081 
   1082 class SRV_COPYCHUNK(Structure):
   1083     structure = (
   1084         ('SourceOffset','<Q=0'),
   1085         ('TargetOffset','<Q=0'),
   1086         ('Length','<L=0'),
   1087         ('Reserved','<L=0'),
   1088     )
   1089 
   1090 class SRV_COPYCHUNK_RESPONSE(Structure):
   1091     structure = (
   1092         ('ChunksWritten','<L=0'),
   1093         ('ChunkBytesWritten','<L=0'),
   1094         ('TotalBytesWritten','<L=0'),
   1095     )
   1096 
   1097 class SRV_READ_HASH(Structure):
   1098     structure = (
   1099         ('HashType','<L=0'),
   1100         ('HashVersion','<L=0'),
   1101         ('HashRetrievalType','<L=0'),
   1102         ('Length','<L=0'),
   1103         ('Offset','<Q=0'),
   1104     )
   1105 
   1106 class NETWORK_RESILIENCY_REQUEST(Structure):
   1107     structure = (
   1108         ('Timeout','<L=0'),
   1109         ('Reserved','<L=0'),
   1110     ) 
   1111 
   1112 class VALIDATE_NEGOTIATE_INFO(Structure):
   1113     structure = (
   1114         ('Capabilities','<L=0'),
   1115         ('Guid','16s=""'),
   1116         ('SecurityMode','<H=0'),
   1117         #('DialectCount','<H=0'),
   1118         ('Dialects','<H*<H'),
   1119     )
   1120 
   1121 class SRV_SNAPSHOT_ARRAY(Structure):
   1122     structure = (
   1123         ('NumberOfSnapShots','<L=0'),
   1124         ('NumberOfSnapShotsReturned','<L=0'),
   1125         ('SnapShotArraySize','<L=0'),
   1126         ('_SnapShots','_-SnapShots','self["SnapShotArraySize"]'),
   1127         ('SnapShots',':'),
   1128     )
   1129 
   1130 class SRV_REQUEST_RESUME_KEY(Structure):
   1131     structure = (
   1132         ('ResumeKey','24s=""'),
   1133         ('ContextLength','<L=0'),
   1134         ('_Context','_-Context','self["ContextLength"]'),
   1135         ('Context',':'),
   1136     )
   1137 
   1138 class HASH_HEADER(Structure):
   1139     structure = (
   1140         ('HashType','<L=0'),
   1141         ('HashVersion','<L=0'),
   1142         ('SourceFileChangeTime','<Q=0'),
   1143         ('SourceFileSize','<Q=0'),
   1144         ('HashBlobLength','<L=0'),
   1145         ('HashBlobOffset','<L=0'),
   1146         ('Dirty','<H=0'),
   1147         ('SourceFileNameLength','<L=0'),
   1148         ('_SourceFileName','_-SourceFileName','self["SourceFileNameLength"]',),
   1149         ('SourceFileName',':'),
   1150     )
   1151 
   1152 class SRV_HASH_RETRIEVE_HASH_BASED(Structure):
   1153     structure = (
   1154         ('Offset','<Q=0'),
   1155         ('BufferLength','<L=0'),
   1156         ('Reserved','<L=0'),
   1157         ('_Buffer','_-Buffer','self["BufferLength"]'),
   1158         ('Buffer',':'),
   1159     )
   1160 
   1161 class SRV_HASH_RETRIEVE_FILE_BASED(Structure):
   1162     structure = (
   1163         ('FileDataOffset','<Q=0'),
   1164         ('FileDataLength','<Q=0'),
   1165         ('BufferLength','<L=0'),
   1166         ('Reserved','<L=0'),
   1167         ('_Buffer','_-Buffer','self["BufferLength"]'),
   1168         ('Buffer',':'),
   1169     )
   1170 
   1171 class NETWORK_INTERFACE_INFO(Structure):
   1172     structure = (
   1173         ('Next','<L=0'),
   1174         ('IfIndex','<L=0'),
   1175         ('Capability','<L=0'),
   1176         ('Reserved','<L=0'),
   1177         ('LinkSpeed','<Q=0'),
   1178         ('SockAddr_Storage','128s=""'),
   1179     )
   1180 
   1181 class SMB2Ioctl_Response(Structure):
   1182     structure = (
   1183         ('StructureSize','<H=49'),
   1184         ('Reserved','<H=0'),
   1185         ('CtlCode','<L=0'),
   1186         ('FileID',':',SMB2_FILEID),
   1187         ('InputOffset','<L=0'),
   1188         ('InputCount','<L=0'),
   1189         ('OutputOffset','<L=0'),
   1190         ('OutputCount','<L=0'),
   1191         ('Flags','<L=0'),
   1192         ('Reserved2','<L=0'),
   1193         ('_AlignPad','_-AlignPad','self["OutputOffset"] - (64 + self["StructureSize"] - 1)'),
   1194         ('AlignPad',':=""'),
   1195         ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'),
   1196         ('Buffer',':'),
   1197     )
   1198 
   1199 # SMB2_QUERY_DIRECTORY
   1200 class SMB2QueryDirectory(Structure):
   1201     SIZE = 32
   1202     structure = (
   1203         ('StructureSize','<H=33'),
   1204         ('FileInformationClass','<B=0'),
   1205         ('Flags','<B=0'),
   1206         ('FileIndex','<L=0'),
   1207         ('FileID',':',SMB2_FILEID),
   1208         ('FileNameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
   1209         ('FileNameLength','<H=0'),
   1210         ('OutputBufferLength','<L=0'),
   1211         ('_AlignPad','_-AlignPad','self["FileNameOffset"] - (64 + self["StructureSize"] - 1)'),
   1212         ('AlignPad',':=""'),
   1213         ('_Buffer','_-Buffer','self["FileNameLength"]'),
   1214         ('Buffer',':'),
   1215     )
   1216     def __init__(self, data = None):
   1217         Structure.__init__(self,data)
   1218         if data is None:
   1219             self['AlignPad'] = ''
   1220 
   1221 class SMB2QueryDirectory_Response(Structure):
   1222     structure = (
   1223         ('StructureSize','<H=9'),
   1224         ('OutputBufferOffset','<H=0'),
   1225         ('OutputBufferLength','<L=0'),
   1226         ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
   1227         ('AlignPad',':=""'),
   1228         ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
   1229         ('Buffer',':'),
   1230     )
   1231 
   1232 # SMB2_CHANGE_NOTIFY
   1233 class SMB2ChangeNotify(Structure):
   1234     structure = (
   1235         ('StructureSize','<H=32'),
   1236         ('Flags','<H=0'),
   1237         ('OutputBufferLength','<L=0'),
   1238         ('FileID',':',SMB2_FILEID),
   1239         ('CompletionFilter','<L=0'),
   1240         ('Reserved','<L=0'),
   1241     )
   1242 
   1243 class SMB2ChangeNotify_Response(Structure):
   1244     structure = (
   1245         ('StructureSize','<H=9'),
   1246         ('OutputBufferOffset','<H=0'),
   1247         ('OutputBufferLength','<L=0'),
   1248         ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
   1249         ('AlignPad',':=""'),
   1250         ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
   1251         ('Buffer',':'),
   1252     )
   1253 
   1254 class FILE_NOTIFY_INFORMATION(Structure):
   1255     structure = (
   1256         ('NextEntryOffset','<L=0'),
   1257         ('Action','<L=0'),
   1258         ('FileNameLength','<L=0'),
   1259         ('_FileName','_-FileName','self["FileNameLength"]',),
   1260         ('FileName',':'),
   1261     )
   1262 
   1263 # SMB2_QUERY_INFO
   1264 class SMB2QueryInfo(Structure):
   1265     SIZE = 40
   1266     structure = (
   1267        ('StructureSize','<H=41'),
   1268        ('InfoType','<B=0'),
   1269        ('FileInfoClass','<B=0'),
   1270        ('OutputBufferLength','<L=0'),
   1271        ('InputBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
   1272        ('Reserved','<H=0'),
   1273        ('InputBufferLength','<L=0'),
   1274        ('AdditionalInformation','<L=0'),
   1275        ('Flags','<L=0'),
   1276        ('FileID',':',SMB2_FILEID),
   1277        ('_AlignPad','_-AlignPad','self["InputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
   1278        ('AlignPad',':=""'),
   1279        ('_Buffer','_-Buffer','self["InputBufferLength"]'),
   1280        ('Buffer',':'),
   1281     )
   1282     def __init__(self, data = None):
   1283         Structure.__init__(self,data)
   1284         if data is None:
   1285             self['AlignPad'] = ''
   1286 
   1287 
   1288 class SMB2_QUERY_QUOTA_INFO(Structure):
   1289     structure = (
   1290         ('ReturnSingle','<B=0'),
   1291         ('RestartScan','<B=0'),
   1292         ('Reserved','<H=0'),
   1293         ('SidListLength','<L=0'),
   1294         ('StartSidLength','<L=0'),
   1295         ('StartSidOffset','<L=0'),
   1296         # ToDo: Check 2.2.37.1 here
   1297         ('SidBuffer',':'),
   1298     )
   1299 
   1300 class SMB2QueryInfo_Response(Structure):
   1301    structure = (
   1302        ('StructureSize','<H=9'),
   1303        ('OutputBufferOffset','<H=0'),
   1304        ('OutputBufferLength','<L=0'),
   1305        ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'),
   1306        ('AlignPad',':=""'),
   1307        ('_Buffer','_-Buffer','self["OutputBufferLength"]'),
   1308        ('Buffer',':'),
   1309    )
   1310 
   1311 # SMB2_SET_INFO
   1312 class SMB2SetInfo(Structure):
   1313     SIZE = 32
   1314     structure = (
   1315        ('StructureSize','<H=33'),
   1316        ('InfoType','<B=0'),
   1317        ('FileInfoClass','<B=0'),
   1318        ('BufferLength','<L=0'),
   1319        ('BufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'),
   1320        ('Reserved','<H=0'),
   1321        ('AdditionalInformation','<L=0'),
   1322        ('FileID',':',SMB2_FILEID),
   1323        ('_AlignPad','_-AlignPad','self["BufferOffset"] - (64 + self["StructureSize"] - 1)'),
   1324        ('AlignPad',':=""'),
   1325        ('_Buffer','_-Buffer','self["BufferLength"]'),
   1326        ('Buffer',':'),
   1327     )
   1328     def __init__(self, data = None):
   1329         Structure.__init__(self,data)
   1330         if data is None:
   1331             self['AlignPad'] = ''
   1332 
   1333 class SMB2SetInfo_Response(Structure):
   1334     structure = (
   1335        ('StructureSize','<H=2'),
   1336     )
   1337 
   1338 class FILE_RENAME_INFORMATION_TYPE_2(Structure):
   1339     structure = (
   1340         ('ReplaceIfExists','<B=0'),
   1341         ('Reserved','7s=""'),
   1342         ('RootDirectory','<Q=0'),
   1343         ('FileNameLength','<L=0'),
   1344         ('_FileName','_-FileName','self["FileNameLength"]'),
   1345         ('FileName',':'),
   1346     )
   1347 
   1348 class SMB2_TRANSFORM_HEADER(Structure):
   1349     structure = (
   1350         ('ProtocolID','"\xfdSMB'),
   1351         ('Signature','16s=""'),
   1352         ('Nonce','16s=""'),
   1353         ('OriginalMessageSize','<L=0'),
   1354         ('Reserved','<H=0'),
   1355         ('EncryptionAlgorithm','<H=0'),
   1356         ('SessionID','<Q=0'),
   1357     )
   1358 
   1359 # SMB2_FILE_INTERNAL_INFO
   1360 class FileInternalInformation(Structure):
   1361     structure = (
   1362         ('IndexNumber','<q=0'),
   1363     )
   1364