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_WILDCARD = 0x02FF
72
73# SMB2_SESSION_SETUP
74# Flags
75SMB2_SESSION_FLAG_BINDING        = 0x01
76SMB2_SESSION_FLAG_IS_GUEST       = 0x01
77SMB2_SESSION_FLAG_IS_NULL        = 0x02
78SMB2_SESSION_FLAG_ENCRYPT_DATA   = 0x04
79
80# SMB2_TREE_CONNECT
81# Types
82SMB2_SHARE_TYPE_DISK   = 0x1
83SMB2_SHARE_TYPE_PIPE   = 0x2
84SMB2_SHARE_TYPE_PRINT  = 0x3
85
86# Share Flags
87SMB2_SHAREFLAG_MANUAL_CACHING              = 0x00000000
88SMB2_SHAREFLAG_AUTO_CACHING                = 0x00000010
89SMB2_SHAREFLAG_VDO_CACHING                 = 0x00000020
90SMB2_SHAREFLAG_NO_CACHING                  = 0x00000030
91SMB2_SHAREFLAG_DFS                         = 0x00000001
92SMB2_SHAREFLAG_DFS_ROOT                    = 0x00000002
93SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS    = 0x00000100
94SMB2_SHAREFLAG_FORCE_SHARED_DELETE         = 0x00000200
95SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING     = 0x00000400
96SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM = 0x00000800
97SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK        = 0x00001000
98SMB2_SHAREFLAG_ENABLE_HASH_V1              = 0x00002000
99SMB2_SHAREFLAG_ENABLE_HASH_V2              = 0x00004000
100SMB2_SHAREFLAG_ENCRYPT_DATA                = 0x00008000
101
102# Capabilities
103SMB2_SHARE_CAP_DFS                         = 0x00000008
104SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY     = 0x00000010
105SMB2_SHARE_CAP_SCALEOUT                    = 0x00000020
106SMB2_SHARE_CAP_CLUSTER                     = 0x00000040
107
108# SMB_CREATE
109# Oplocks
110SMB2_OPLOCK_LEVEL_NONE       = 0x00
111SMB2_OPLOCK_LEVEL_II         = 0x01
112SMB2_OPLOCK_LEVEL_EXCLUSIVE  = 0x08
113SMB2_OPLOCK_LEVEL_BATCH      = 0x09
114SMB2_OPLOCK_LEVEL_LEASE      = 0xFF
115
116# Impersonation Level
117SMB2_IL_ANONYMOUS       = 0x00000000
118SMB2_IL_IDENTIFICATION  = 0x00000001
119SMB2_IL_IMPERSONATION   = 0x00000002
120SMB2_IL_DELEGATE        = 0x00000003
121
122# File Attributes
123FILE_ATTRIBUTE_ARCHIVE             = 0x00000020
124FILE_ATTRIBUTE_COMPRESSED          = 0x00000800
125FILE_ATTRIBUTE_DIRECTORY           = 0x00000010
126FILE_ATTRIBUTE_ENCRYPTED           = 0x00004000
127FILE_ATTRIBUTE_HIDDEN              = 0x00000002
128FILE_ATTRIBUTE_NORMAL              = 0x00000080
129FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000
130FILE_ATTRIBUTE_OFFLINE             = 0x00001000
131FILE_ATTRIBUTE_READONLY            = 0x00000001
132FILE_ATTRIBUTE_REPARSE_POINT       = 0x00000400
133FILE_ATTRIBUTE_SPARSE_FILE         = 0x00000200
134FILE_ATTRIBUTE_SYSTEM              = 0x00000004
135FILE_ATTRIBUTE_TEMPORARY           = 0x00000100
136FILE_ATTRIBUTE_INTEGRITY_STREAM    = 0x00000800
137FILE_ATTRIBUTE_NO_SCRUB_DATA       = 0x00020000
138
139# Share Access
140FILE_SHARE_READ         = 0x00000001
141FILE_SHARE_WRITE        = 0x00000002
142FILE_SHARE_DELETE       = 0x00000004
143
144# Create Disposition
145FILE_SUPERSEDE          = 0x00000000
146FILE_OPEN               = 0x00000001
147FILE_CREATE             = 0x00000002
148FILE_OPEN_IF            = 0x00000003
149FILE_OVERWRITE          = 0x00000004
150FILE_OVERWRITE_IF       = 0x00000005
151
152# Create Options
153FILE_DIRECTORY_FILE            = 0x00000001
154FILE_WRITE_THROUGH             = 0x00000002
155FILE_SEQUENTIAL_ONLY           = 0x00000004
156FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
157FILE_SYNCHRONOUS_IO_ALERT      = 0x00000010
158FILE_SYNCHRONOUS_IO_NONALERT   = 0x00000020
159FILE_NON_DIRECTORY_FILE        = 0x00000040
160FILE_COMPLETE_IF_OPLOCKED      = 0x00000100
161FILE_NO_EA_KNOWLEDGE           = 0x00000200
162FILE_RANDOM_ACCESS             = 0x00000800
163FILE_DELETE_ON_CLOSE           = 0x00001000
164FILE_OPEN_BY_FILE_ID           = 0x00002000
165FILE_OPEN_FOR_BACKUP_INTENT    = 0x00004000
166FILE_NO_COMPRESSION            = 0x00008000
167FILE_RESERVE_OPFILTER          = 0x00100000
168FILE_OPEN_REPARSE_POINT        = 0x00200000
169FILE_OPEN_NO_RECALL            = 0x00400000
170FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
171
172# File Access Mask / Desired Access
173FILE_READ_DATA         = 0x00000001
174FILE_WRITE_DATA        = 0x00000002
175FILE_APPEND_DATA       = 0x00000004
176FILE_READ_EA           = 0x00000008
177FILE_WRITE_EA          = 0x00000010
178FILE_EXECUTE           = 0x00000020
179FILE_READ_ATTRIBUTES   = 0x00000080
180FILE_WRITE_ATTRIBUTES  = 0x00000100
181DELETE                 = 0x00010000
182READ_CONTROL           = 0x00020000
183WRITE_DAC              = 0x00040000
184WRITE_OWNER            = 0x00080000
185SYNCHRONIZE            = 0x00100000
186ACCESS_SYSTEM_SECURITY = 0x01000000
187MAXIMUM_ALLOWED        = 0x02000000
188GENERIC_ALL            = 0x10000000
189GENERIC_EXECUTE        = 0x20000000
190GENERIC_WRITE          = 0x40000000
191GENERIC_READ           = 0x80000000
192
193# Directory Access Mask
194FILE_LIST_DIRECTORY    = 0x00000001
195FILE_ADD_FILE          = 0x00000002
196FILE_ADD_SUBDIRECTORY  = 0x00000004
197FILE_TRAVERSE          = 0x00000020
198FILE_DELETE_CHILD      = 0x00000040
199
200# Create Contexts
201SMB2_CREATE_EA_BUFFER                     = 0x45787441
202SMB2_CREATE_SD_BUFFER                     = 0x53656344
203SMB2_CREATE_DURABLE_HANDLE_REQUEST        = 0x44486e51
204SMB2_CREATE_DURABLE_HANDLE_RECONNECT      = 0x44486e43
205SMB2_CREATE_ALLOCATION_SIZE               = 0x416c5369
206SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST  = 0x4d784163
207SMB2_CREATE_TIMEWARP_TOKEN                = 0x54577270
208SMB2_CREATE_QUERY_ON_DISK_ID              = 0x51466964
209SMB2_CREATE_REQUEST                       = 0x52714c73
210SMB2_CREATE_REQUEST_LEASE_V2              = 0x52714c73
211SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2     = 0x44483251
212SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2   = 0x44483243
213SMB2_CREATE_APP_INSTANCE_ID               = 0x45BCA66AEFA7F74A9008FA462E144D74
214
215# Flags
216SMB2_CREATE_FLAG_REPARSEPOINT  = 0x1
217FILE_NEED_EA                   = 0x80
218
219# CreateAction
220FILE_SUPERSEDED    = 0x00000000
221FILE_OPENED        = 0x00000001
222FILE_CREATED       = 0x00000002
223FILE_OVERWRITTEN   = 0x00000003
224
225# SMB2_CREATE_REQUEST_LEASE states
226SMB2_LEASE_NONE            = 0x00
227SMB2_LEASE_READ_CACHING    = 0x01
228SMB2_LEASE_HANDLE_CACHING  = 0x02
229SMB2_LEASE_WRITE_CACHING   = 0x04
230
231# SMB2_CREATE_REQUEST_LEASE_V2 Flags
232SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET = 0x4
233
234# SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 Flags
235SMB2_DHANDLE_FLAG_PERSISTENT = 0x02
236
237# SMB2_CLOSE
238# Flags
239SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB  = 0x0001
240
241# SMB2_READ
242# Channel
243SMB2_CHANNEL_NONE     = 0x00
244SMB2_CHANNEL_RDMA_V1  = 0x01
245
246# SMB2_WRITE
247# Flags
248SMB2_WRITEFLAG_WRITE_THROUGH = 0x01
249
250# Lease Break Notification
251SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED  = 0x01
252
253# SMB_LOCK
254# Flags
255SMB2_LOCKFLAG_SHARED_LOCK       = 0x01
256SMB2_LOCKFLAG_EXCLUSIVE_LOCK    = 0x02
257SMB2_LOCKFLAG_UNLOCK            = 0x04
258SMB2_LOCKFLAG_FAIL_IMMEDIATELY  = 0x10
259
260# SMB IOCTL
261# Control Codes
262FSCTL_DFS_GET_REFERRALS              = 0x00060194
263FSCTL_PIPE_PEEK                      = 0x0011400C
264FSCTL_PIPE_WAIT                      = 0x00110018
265FSCTL_PIPE_TRANSCEIVE                = 0x0011C017
266FSCTL_SRV_COPYCHUNK                  = 0x001440F2
267FSCTL_SRV_ENUMERATE_SNAPSHOTS        = 0x00144064
268FSCTL_SRV_REQUEST_RESUME_KEY         = 0x00140078
269FSCTL_SRV_READ_HASH                  = 0x001441bb
270FSCTL_SRV_COPYCHUNK_WRITE            = 0x001480F2
271FSCTL_LMR_REQUEST_RESILIENCY         = 0x001401D4
272FSCTL_QUERY_NETWORK_INTERFACE_INFO   = 0x001401FC
273FSCTL_SET_REPARSE_POINT              = 0x000900A4
274FSCTL_DFS_GET_REFERRALS_EX           = 0x000601B0
275FSCTL_FILE_LEVEL_TRIM                = 0x00098208
276FSCTL_VALIDATE_NEGOTIATE_INFO        = 0x00140204
277
278# Flags
279SMB2_0_IOCTL_IS_FSCTL  = 0x1
280
281# SRV_READ_HASH
282# Type
283SRV_HASH_TYPE_PEER_DIST  = 0x01
284
285# Version
286SRV_HASH_VER_1  = 0x1
287SRV_HASH_VER_2  = 0x2
288
289# Retrieval Type
290SRV_HASH_RETRIEVE_HASH_BASED  = 0x01
291SRV_HASH_RETRIEVE_FILE_BASED  = 0x02
292
293# NETWORK_INTERFACE_INFO
294# Capabilities
295RSS_CAPABLE  = 0x01
296RDMA_CAPABLE = 0x02
297
298# SMB2_QUERY_DIRECTORIES
299# Information Class
300FILE_DIRECTORY_INFORMATION         = 0x01
301FILE_FULL_DIRECTORY_INFORMATION    = 0x02
302FILEID_FULL_DIRECTORY_INFORMATION  = 0x26
303FILE_BOTH_DIRECTORY_INFORMATION    = 0x03
304FILEID_BOTH_DIRECTORY_INFORMATION  = 0x25
305FILENAMES_INFORMATION              = 0x0C
306
307# Flags
308SMB2_RESTART_SCANS        = 0x01
309SMB2_RETURN_SINGLE_ENTRY  = 0x02
310SMB2_INDEX_SPECIFIED      = 0x04
311SMB2_REOPEN               = 0x10
312
313# SMB2_CHANGE_NOTIFY
314# Flags
315SMB2_WATCH_TREE  = 0x01
316
317# Filters
318FILE_NOTIFY_CHANGE_FILE_NAME     = 0x00000001
319FILE_NOTIFY_CHANGE_DIR_NAME      = 0x00000002
320FILE_NOTIFY_CHANGE_ATTRIBUTES    = 0x00000004
321FILE_NOTIFY_CHANGE_SIZE          = 0x00000008
322FILE_NOTIFY_CHANGE_LAST_WRITE    = 0x00000010
323FILE_NOTIFY_CHANGE_LAST_ACCESS   = 0x00000020
324FILE_NOTIFY_CHANGE_CREATION      = 0x00000040
325FILE_NOTIFY_CHANGE_EA            = 0x00000080
326FILE_NOTIFY_CHANGE_SECURITY      = 0x00000100
327FILE_NOTIFY_CHANGE_STREAM_NAME   = 0x00000200
328FILE_NOTIFY_CHANGE_STREAM_SIZE   = 0x00000400
329FILE_NOTIFY_CHANGE_STREAM_WRITE  = 0x00000800
330
331# FILE_NOTIFY_INFORMATION
332# Actions
333FILE_ACTION_ADDED            = 0x00000001
334FILE_ACTION_REMOVED          = 0x00000002
335FILE_ACTION_MODIFIED         = 0x00000003
336FILE_ACTION_RENAMED_OLD_NAME = 0x00000004
337FILE_ACTION_RENAMED_NEW_NAME = 0x00000005
338
339# SMB2_QUERY_INFO
340# InfoTypes
341SMB2_0_INFO_FILE        = 0x01
342SMB2_0_INFO_FILESYSTEM  = 0x02
343SMB2_0_INFO_SECURITY    = 0x03
344SMB2_0_INFO_QUOTA       = 0x04
345
346# File Information Classes
347SMB2_FILE_ACCESS_INFO                 = 8
348SMB2_FILE_ALIGNMENT_INFO              = 17
349SMB2_FILE_ALL_INFO                    = 18
350SMB2_FILE_ALLOCATION_INFO             = 19
351SMB2_FILE_ALTERNATE_NAME_INFO         = 21
352SMB2_ATTRIBUTE_TAG_INFO               = 35
353SMB2_FILE_BASIC_INFO                  = 4
354SMB2_FILE_BOTH_DIRECTORY_INFO         = 3
355SMB2_FILE_COMPRESSION_INFO            = 28
356SMB2_FILE_DIRECTORY_INFO              = 1
357SMB2_FILE_DISPOSITION_INFO            = 13
358SMB2_FILE_EA_INFO                     = 7
359SMB2_FILE_END_OF_FILE_INFO            = 20
360SMB2_FULL_DIRECTORY_INFO              = 2
361SMB2_FULL_EA_INFO                     = 15
362SMB2_FILE_HARDLINK_INFO               = 46
363SMB2_FILE_ID_BOTH_DIRECTORY_INFO      = 37
364SMB2_FILE_ID_FULL_DIRECTORY_INFO      = 38
365SMB2_FILE_ID_GLOBAL_TX_DIRECTORY_INFO = 50
366SMB2_FILE_INTERNAL_INFO               = 6
367SMB2_FILE_LINK_INFO                   = 11
368SMB2_FILE_MAILSLOT_QUERY_INFO         = 26
369SMB2_FILE_MAILSLOT_SET_INFO           = 27
370SMB2_FILE_MODE_INFO                   = 16
371SMB2_FILE_MOVE_CLUSTER_INFO           = 31
372SMB2_FILE_NAME_INFO                   = 9
373SMB2_FILE_NAMES_INFO                  = 12
374SMB2_FILE_NETWORK_OPEN_INFO           = 34
375SMB2_FILE_NORMALIZED_NAME_INFO        = 48
376SMB2_FILE_OBJECT_ID_INFO              = 29
377SMB2_FILE_PIPE_INFO                   = 23
378SMB2_FILE_PIPE_LOCAL_INFO             = 24
379SMB2_FILE_PIPE_REMOTE_INFO            = 25
380SMB2_FILE_POSITION_INFO               = 14
381SMB2_FILE_QUOTA_INFO                  = 32
382SMB2_FILE_RENAME_INFO                 = 10
383SMB2_FILE_REPARSE_POINT_INFO          = 33
384SMB2_FILE_SFIO_RESERVE_INFO           = 44
385SMB2_FILE_SHORT_NAME_INFO             = 45
386SMB2_FILE_STANDARD_INFO               = 5
387SMB2_FILE_STANDARD_LINK_INFO          = 54
388SMB2_FILE_STREAM_INFO                 = 22
389SMB2_FILE_TRACKING_INFO               = 36
390SMB2_FILE_VALID_DATA_LENGTH_INFO      = 39
391
392# File System Information Classes
393SMB2_FILESYSTEM_VOLUME_INFO           = 1
394SMB2_FILESYSTEM_LABEL_INFO            = 2
395SMB2_FILESYSTEM_SIZE_INFO             = 3
396SMB2_FILESYSTEM_DEVICE_INFO           = 4
397SMB2_FILESYSTEM_ATTRIBUTE_INFO        = 5
398SMB2_FILESYSTEM_CONTROL_INFO          = 6
399SMB2_FILESYSTEM_FULL_SIZE_INFO        = 7
400SMB2_FILESYSTEM_OBJECT_ID_INFO        = 8
401SMB2_FILESYSTEM_DRIVER_PATH_INFO      = 9
402SMB2_FILESYSTEM_SECTOR_SIZE_INFO      = 11
403
404# Additional information
405OWNER_SECURITY_INFORMATION  = 0x00000001
406GROUP_SECURITY_INFORMATION  = 0x00000002
407DACL_SECURITY_INFORMATION   = 0x00000004
408SACL_SECURITY_INFORMATION   = 0x00000008
409LABEL_SECURITY_INFORMATION  = 0x00000010
410
411# Flags
412SL_RESTART_SCAN         = 0x00000001
413SL_RETURN_SINGLE_ENTRY  = 0x00000002
414SL_INDEX_SPECIFIED      = 0x00000004
415
416# TRANSFORM_HEADER
417SMB2_ENCRYPTION_AES128_CCM = 0x0001
418
419
420# STRUCtures
421# Represents a SMB2/3 Packet
422class 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
439class 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
456class 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
474class 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
492class 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
511class 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
520class 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
536class 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
548class 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
571class 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
600class 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
613class SMB2Logoff(Structure):
614    structure = (
615        ('StructureSize','<H=4'),
616        ('Reserved','<H=0'),
617    )
618
619
620class SMB2Logoff_Response(Structure):
621    structure = (
622        ('StructureSize','<H=4'),
623        ('Reserved','<H=0'),
624    )
625
626# SMB2_TREE_CONNECT
627class 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
644class 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
655class SMB2TreeDisconnect(Structure):
656    structure = (
657        ('StructureSize','<H=4'),
658        ('Reserved','<H=0'),
659    )
660
661class SMB2TreeDisconnect_Response(Structure):
662    structure = (
663        ('StructureSize','<H=4'),
664        ('Reserved','<H=0'),
665    )
666
667# SMB2_CREATE
668class 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
696class 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
708class SMB2_FILEID(Structure):
709    structure = (
710        ('Persistent','<Q=0'),
711        ('Volatile','<Q=0'),
712    )
713
714class 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
737class 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
750class SMB2_CREATE_DURABLE_HANDLE_RECONNECT(Structure):
751    structure = (
752        ('Data',':',SMB2_FILEID),
753    )
754
755class SMB2_CREATE_DURABLE_HANDLE_REQUEST(Structure):
756    structure = (
757        ('DurableRequest','16s=""'),
758    )
759
760class SMB2_CREATE_DURABLE_HANDLE_RESPONSE(Structure):
761    structure = (
762        ('Reserved','<Q=0'),
763    )
764
765class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST(Structure):
766    structure = (
767        ('Timestamp','<Q=0'),
768    )
769
770class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE(Structure):
771    structure = (
772        ('QueryStatus','<L=0'),
773        ('MaximalAccess','<L=0'),
774    )
775
776class SMB2_CREATE_ALLOCATION_SIZE(Structure):
777    structure = (
778        ('AllocationSize','<Q=0'),
779    )
780
781class SMB2_CREATE_TIMEWARP_TOKEN(Structure):
782    structure = (
783        ('AllocationSize','<Q=0'),
784    )
785
786class SMB2_CREATE_REQUEST_LEASE(Structure):
787    structure = (
788        ('LeaseKey','16s=""'),
789        ('LeaseState','<L=0'),
790        ('LeaseFlags','<L=0'),
791        ('LeaseDuration','<Q=0'),
792    )
793
794SMB2_CREATE_RESPONSE_LEASE = SMB2_CREATE_REQUEST_LEASE
795
796class 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
807SMB2_CREATE_RESPONSE_LEASE_V2 = SMB2_CREATE_REQUEST_LEASE_V2
808
809class 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
817class SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2(Structure):
818    structure = (
819        ('Timeout','<L=0'),
820        ('Flags','<L=0'),
821    )
822
823class SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2(Structure):
824    structure = (
825        ('FileID',':', SMB2_FILEID),
826        ('CreateGuid','16s=""'),
827        ('Flags','<L=0'),
828    )
829
830class SMB2_CREATE_APP_INSTANCE_ID(Structure):
831    structure = (
832        ('StructureSize','<H=0'),
833        ('Reserved','<H=0'),
834        ('AppInstanceId','16s=""'),
835    )
836
837class 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
846class SMB2Close(Structure):
847    structure = (
848        ('StructureSize','<H=24'),
849        ('Flags','<H=0'),
850        ('Reserved','<L=0'),
851        ('FileID',':', SMB2_FILEID),
852    )
853
854class 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
869class SMB2Flush(Structure):
870    structure = (
871        ('StructureSize','<H=24'),
872        ('Reserved1','<H=0'),
873        ('Reserved2','<L=0'),
874        ('FileID',':',SMB2_FILEID),
875    )
876
877class SMB2Flush_Response(Structure):
878    structure = (
879        ('StructureSize','<H=4'),
880        ('Reserved','<H=0'),
881    )
882
883# SMB2_READ
884class 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
909class 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
924class 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
948class 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
958class 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
967SMB2OplockBreakAcknowledgment = SMB2OplockBreakNotification
968SMB2OplockBreakResponse       = SMB2OplockBreakNotification
969
970class 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
983class 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
993SMB2LeaseBreakResponse = SMB2LeaseBreakAcknowledgement
994
995# SMB2_LOCK
996class SMB2_LOCK_ELEMENT(Structure):
997    structure = (
998        ('Offset','<Q=0'),
999        ('Length','<Q=0'),
1000        ('Flags','<L=0'),
1001        ('Reserved','<L=0'),
1002    )
1003
1004class 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
1014class SMB2Lock_Response(Structure):
1015    structure = (
1016        ('StructureSize','<H=4'),
1017        ('Reserved','<H=0'),
1018    )
1019
1020
1021# SMB2_ECHO
1022class SMB2Echo(Structure):
1023    structure = (
1024        ('StructureSize','<H=4'),
1025        ('Reserved','<H=0'),
1026    )
1027
1028SMB2Echo_Response = SMB2Echo
1029
1030# SMB2_CANCEL`
1031class SMB2Cancel(Structure):
1032    structure = (
1033        ('StructureSize','<H=4'),
1034        ('Reserved','<H=0'),
1035    )
1036
1037# SMB2_IOCTL
1038class 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
1063class 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
1073class 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
1082class SRV_COPYCHUNK(Structure):
1083    structure = (
1084        ('SourceOffset','<Q=0'),
1085        ('TargetOffset','<Q=0'),
1086        ('Length','<L=0'),
1087        ('Reserved','<L=0'),
1088    )
1089
1090class SRV_COPYCHUNK_RESPONSE(Structure):
1091    structure = (
1092        ('ChunksWritten','<L=0'),
1093        ('ChunkBytesWritten','<L=0'),
1094        ('TotalBytesWritten','<L=0'),
1095    )
1096
1097class 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
1106class NETWORK_RESILIENCY_REQUEST(Structure):
1107    structure = (
1108        ('Timeout','<L=0'),
1109        ('Reserved','<L=0'),
1110    )
1111
1112class 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
1121class 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
1130class SRV_REQUEST_RESUME_KEY(Structure):
1131    structure = (
1132        ('ResumeKey','24s=""'),
1133        ('ContextLength','<L=0'),
1134        ('_Context','_-Context','self["ContextLength"]'),
1135        ('Context',':'),
1136    )
1137
1138class 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
1152class 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
1161class 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
1171class 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
1181class 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
1200class 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
1221class 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
1233class 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
1243class 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
1254class 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
1264class 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
1288class 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
1300class 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
1312class 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
1333class SMB2SetInfo_Response(Structure):
1334    structure = (
1335       ('StructureSize','<H=2'),
1336    )
1337
1338class 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
1348class 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
1360class FileInternalInformation(Structure):
1361    structure = (
1362        ('IndexNumber','<q=0'),
1363    )
1364