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