| # Copyright (c) 2003-2016 CORE Security Technologies |
| # |
| # This software is provided under under a slightly modified version |
| # of the Apache Software License. See the accompanying LICENSE file |
| # for more information. |
| # |
| # Author: Alberto Solino (@agsolino) |
| # |
| # Description: |
| # SMB 2 and 3 Protocol Structures and constants [MS-SMB2] |
| # |
| |
| from impacket.structure import Structure |
| |
| # Constants |
| |
| # SMB Packet |
| SMB2_PACKET_SIZE = 64 |
| |
| # SMB Commands |
| SMB2_NEGOTIATE = 0x0000 # |
| SMB2_SESSION_SETUP = 0x0001 # |
| SMB2_LOGOFF = 0x0002 # |
| SMB2_TREE_CONNECT = 0x0003 # |
| SMB2_TREE_DISCONNECT = 0x0004 # |
| SMB2_CREATE = 0x0005 # |
| SMB2_CLOSE = 0x0006 # |
| SMB2_FLUSH = 0x0007 # |
| SMB2_READ = 0x0008 # |
| SMB2_WRITE = 0x0009 # |
| SMB2_LOCK = 0x000A # |
| SMB2_IOCTL = 0x000B # |
| SMB2_CANCEL = 0x000C # |
| SMB2_ECHO = 0x000D # |
| SMB2_QUERY_DIRECTORY = 0x000E # |
| SMB2_CHANGE_NOTIFY = 0x000F |
| SMB2_QUERY_INFO = 0x0010 # |
| SMB2_SET_INFO = 0x0011 |
| SMB2_OPLOCK_BREAK = 0x0012 |
| |
| # SMB Flags |
| SMB2_FLAGS_SERVER_TO_REDIR = 0x00000001 |
| SMB2_FLAGS_ASYNC_COMMAND = 0x00000002 |
| SMB2_FLAGS_RELATED_OPERATIONS = 0x00000004 |
| SMB2_FLAGS_SIGNED = 0x00000008 |
| SMB2_FLAGS_DFS_OPERATIONS = 0x10000000 |
| SMB2_FLAGS_REPLAY_OPERATION = 0x80000000 |
| |
| # SMB Error SymLink Flags |
| SYMLINK_FLAG_ABSOLUTE = 0x0 |
| SYMLINK_FLAG_RELATIVE = 0x1 |
| |
| # SMB2_NEGOTIATE |
| # Security Modes |
| SMB2_NEGOTIATE_SIGNING_ENABLED = 0x1 |
| SMB2_NEGOTIATE_SIGNING_REQUIRED = 0x2 |
| |
| # Capabilities |
| SMB2_GLOBAL_CAP_DFS = 0x01 |
| SMB2_GLOBAL_CAP_LEASING = 0x02 |
| SMB2_GLOBAL_CAP_LARGE_MTU = 0x04 |
| SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08 |
| SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10 |
| SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20 |
| SMB2_GLOBAL_CAP_ENCRYPTION = 0x40 |
| |
| # Dialects |
| SMB2_DIALECT_002 = 0x0202 |
| SMB2_DIALECT_21 = 0x0210 |
| SMB2_DIALECT_30 = 0x0300 |
| SMB2_DIALECT_WILDCARD = 0x02FF |
| |
| # SMB2_SESSION_SETUP |
| # Flags |
| SMB2_SESSION_FLAG_BINDING = 0x01 |
| SMB2_SESSION_FLAG_IS_GUEST = 0x01 |
| SMB2_SESSION_FLAG_IS_NULL = 0x02 |
| SMB2_SESSION_FLAG_ENCRYPT_DATA = 0x04 |
| |
| # SMB2_TREE_CONNECT |
| # Types |
| SMB2_SHARE_TYPE_DISK = 0x1 |
| SMB2_SHARE_TYPE_PIPE = 0x2 |
| SMB2_SHARE_TYPE_PRINT = 0x3 |
| |
| # Share Flags |
| SMB2_SHAREFLAG_MANUAL_CACHING = 0x00000000 |
| SMB2_SHAREFLAG_AUTO_CACHING = 0x00000010 |
| SMB2_SHAREFLAG_VDO_CACHING = 0x00000020 |
| SMB2_SHAREFLAG_NO_CACHING = 0x00000030 |
| SMB2_SHAREFLAG_DFS = 0x00000001 |
| SMB2_SHAREFLAG_DFS_ROOT = 0x00000002 |
| SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS = 0x00000100 |
| SMB2_SHAREFLAG_FORCE_SHARED_DELETE = 0x00000200 |
| SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING = 0x00000400 |
| SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM = 0x00000800 |
| SMB2_SHAREFLAG_FORCE_LEVELII_OPLOCK = 0x00001000 |
| SMB2_SHAREFLAG_ENABLE_HASH_V1 = 0x00002000 |
| SMB2_SHAREFLAG_ENABLE_HASH_V2 = 0x00004000 |
| SMB2_SHAREFLAG_ENCRYPT_DATA = 0x00008000 |
| |
| # Capabilities |
| SMB2_SHARE_CAP_DFS = 0x00000008 |
| SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY = 0x00000010 |
| SMB2_SHARE_CAP_SCALEOUT = 0x00000020 |
| SMB2_SHARE_CAP_CLUSTER = 0x00000040 |
| |
| # SMB_CREATE |
| # Oplocks |
| SMB2_OPLOCK_LEVEL_NONE = 0x00 |
| SMB2_OPLOCK_LEVEL_II = 0x01 |
| SMB2_OPLOCK_LEVEL_EXCLUSIVE = 0x08 |
| SMB2_OPLOCK_LEVEL_BATCH = 0x09 |
| SMB2_OPLOCK_LEVEL_LEASE = 0xFF |
| |
| # Impersonation Level |
| SMB2_IL_ANONYMOUS = 0x00000000 |
| SMB2_IL_IDENTIFICATION = 0x00000001 |
| SMB2_IL_IMPERSONATION = 0x00000002 |
| SMB2_IL_DELEGATE = 0x00000003 |
| |
| # File Attributes |
| FILE_ATTRIBUTE_ARCHIVE = 0x00000020 |
| FILE_ATTRIBUTE_COMPRESSED = 0x00000800 |
| FILE_ATTRIBUTE_DIRECTORY = 0x00000010 |
| FILE_ATTRIBUTE_ENCRYPTED = 0x00004000 |
| FILE_ATTRIBUTE_HIDDEN = 0x00000002 |
| FILE_ATTRIBUTE_NORMAL = 0x00000080 |
| FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000 |
| FILE_ATTRIBUTE_OFFLINE = 0x00001000 |
| FILE_ATTRIBUTE_READONLY = 0x00000001 |
| FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 |
| FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200 |
| FILE_ATTRIBUTE_SYSTEM = 0x00000004 |
| FILE_ATTRIBUTE_TEMPORARY = 0x00000100 |
| FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00000800 |
| FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000 |
| |
| # Share Access |
| FILE_SHARE_READ = 0x00000001 |
| FILE_SHARE_WRITE = 0x00000002 |
| FILE_SHARE_DELETE = 0x00000004 |
| |
| # Create Disposition |
| FILE_SUPERSEDE = 0x00000000 |
| FILE_OPEN = 0x00000001 |
| FILE_CREATE = 0x00000002 |
| FILE_OPEN_IF = 0x00000003 |
| FILE_OVERWRITE = 0x00000004 |
| FILE_OVERWRITE_IF = 0x00000005 |
| |
| # Create Options |
| FILE_DIRECTORY_FILE = 0x00000001 |
| FILE_WRITE_THROUGH = 0x00000002 |
| FILE_SEQUENTIAL_ONLY = 0x00000004 |
| FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008 |
| FILE_SYNCHRONOUS_IO_ALERT = 0x00000010 |
| FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020 |
| FILE_NON_DIRECTORY_FILE = 0x00000040 |
| FILE_COMPLETE_IF_OPLOCKED = 0x00000100 |
| FILE_NO_EA_KNOWLEDGE = 0x00000200 |
| FILE_RANDOM_ACCESS = 0x00000800 |
| FILE_DELETE_ON_CLOSE = 0x00001000 |
| FILE_OPEN_BY_FILE_ID = 0x00002000 |
| FILE_OPEN_FOR_BACKUP_INTENT = 0x00004000 |
| FILE_NO_COMPRESSION = 0x00008000 |
| FILE_RESERVE_OPFILTER = 0x00100000 |
| FILE_OPEN_REPARSE_POINT = 0x00200000 |
| FILE_OPEN_NO_RECALL = 0x00400000 |
| FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000 |
| |
| # File Access Mask / Desired Access |
| FILE_READ_DATA = 0x00000001 |
| FILE_WRITE_DATA = 0x00000002 |
| FILE_APPEND_DATA = 0x00000004 |
| FILE_READ_EA = 0x00000008 |
| FILE_WRITE_EA = 0x00000010 |
| FILE_EXECUTE = 0x00000020 |
| FILE_READ_ATTRIBUTES = 0x00000080 |
| FILE_WRITE_ATTRIBUTES = 0x00000100 |
| DELETE = 0x00010000 |
| READ_CONTROL = 0x00020000 |
| WRITE_DAC = 0x00040000 |
| WRITE_OWNER = 0x00080000 |
| SYNCHRONIZE = 0x00100000 |
| ACCESS_SYSTEM_SECURITY = 0x01000000 |
| MAXIMUM_ALLOWED = 0x02000000 |
| GENERIC_ALL = 0x10000000 |
| GENERIC_EXECUTE = 0x20000000 |
| GENERIC_WRITE = 0x40000000 |
| GENERIC_READ = 0x80000000 |
| |
| # Directory Access Mask |
| FILE_LIST_DIRECTORY = 0x00000001 |
| FILE_ADD_FILE = 0x00000002 |
| FILE_ADD_SUBDIRECTORY = 0x00000004 |
| FILE_TRAVERSE = 0x00000020 |
| FILE_DELETE_CHILD = 0x00000040 |
| |
| # Create Contexts |
| SMB2_CREATE_EA_BUFFER = 0x45787441 |
| SMB2_CREATE_SD_BUFFER = 0x53656344 |
| SMB2_CREATE_DURABLE_HANDLE_REQUEST = 0x44486e51 |
| SMB2_CREATE_DURABLE_HANDLE_RECONNECT = 0x44486e43 |
| SMB2_CREATE_ALLOCATION_SIZE = 0x416c5369 |
| SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST = 0x4d784163 |
| SMB2_CREATE_TIMEWARP_TOKEN = 0x54577270 |
| SMB2_CREATE_QUERY_ON_DISK_ID = 0x51466964 |
| SMB2_CREATE_REQUEST = 0x52714c73 |
| SMB2_CREATE_REQUEST_LEASE_V2 = 0x52714c73 |
| SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 = 0x44483251 |
| SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 = 0x44483243 |
| SMB2_CREATE_APP_INSTANCE_ID = 0x45BCA66AEFA7F74A9008FA462E144D74 |
| |
| # Flags |
| SMB2_CREATE_FLAG_REPARSEPOINT = 0x1 |
| FILE_NEED_EA = 0x80 |
| |
| # CreateAction |
| FILE_SUPERSEDED = 0x00000000 |
| FILE_OPENED = 0x00000001 |
| FILE_CREATED = 0x00000002 |
| FILE_OVERWRITTEN = 0x00000003 |
| |
| # SMB2_CREATE_REQUEST_LEASE states |
| SMB2_LEASE_NONE = 0x00 |
| SMB2_LEASE_READ_CACHING = 0x01 |
| SMB2_LEASE_HANDLE_CACHING = 0x02 |
| SMB2_LEASE_WRITE_CACHING = 0x04 |
| |
| # SMB2_CREATE_REQUEST_LEASE_V2 Flags |
| SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET = 0x4 |
| |
| # SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 Flags |
| SMB2_DHANDLE_FLAG_PERSISTENT = 0x02 |
| |
| # SMB2_CLOSE |
| # Flags |
| SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB = 0x0001 |
| |
| # SMB2_READ |
| # Channel |
| SMB2_CHANNEL_NONE = 0x00 |
| SMB2_CHANNEL_RDMA_V1 = 0x01 |
| |
| # SMB2_WRITE |
| # Flags |
| SMB2_WRITEFLAG_WRITE_THROUGH = 0x01 |
| |
| # Lease Break Notification |
| SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED = 0x01 |
| |
| # SMB_LOCK |
| # Flags |
| SMB2_LOCKFLAG_SHARED_LOCK = 0x01 |
| SMB2_LOCKFLAG_EXCLUSIVE_LOCK = 0x02 |
| SMB2_LOCKFLAG_UNLOCK = 0x04 |
| SMB2_LOCKFLAG_FAIL_IMMEDIATELY = 0x10 |
| |
| # SMB IOCTL |
| # Control Codes |
| FSCTL_DFS_GET_REFERRALS = 0x00060194 |
| FSCTL_PIPE_PEEK = 0x0011400C |
| FSCTL_PIPE_WAIT = 0x00110018 |
| FSCTL_PIPE_TRANSCEIVE = 0x0011C017 |
| FSCTL_SRV_COPYCHUNK = 0x001440F2 |
| FSCTL_SRV_ENUMERATE_SNAPSHOTS = 0x00144064 |
| FSCTL_SRV_REQUEST_RESUME_KEY = 0x00140078 |
| FSCTL_SRV_READ_HASH = 0x001441bb |
| FSCTL_SRV_COPYCHUNK_WRITE = 0x001480F2 |
| FSCTL_LMR_REQUEST_RESILIENCY = 0x001401D4 |
| FSCTL_QUERY_NETWORK_INTERFACE_INFO = 0x001401FC |
| FSCTL_SET_REPARSE_POINT = 0x000900A4 |
| FSCTL_DFS_GET_REFERRALS_EX = 0x000601B0 |
| FSCTL_FILE_LEVEL_TRIM = 0x00098208 |
| FSCTL_VALIDATE_NEGOTIATE_INFO = 0x00140204 |
| |
| # Flags |
| SMB2_0_IOCTL_IS_FSCTL = 0x1 |
| |
| # SRV_READ_HASH |
| # Type |
| SRV_HASH_TYPE_PEER_DIST = 0x01 |
| |
| # Version |
| SRV_HASH_VER_1 = 0x1 |
| SRV_HASH_VER_2 = 0x2 |
| |
| # Retrieval Type |
| SRV_HASH_RETRIEVE_HASH_BASED = 0x01 |
| SRV_HASH_RETRIEVE_FILE_BASED = 0x02 |
| |
| # NETWORK_INTERFACE_INFO |
| # Capabilities |
| RSS_CAPABLE = 0x01 |
| RDMA_CAPABLE = 0x02 |
| |
| # SMB2_QUERY_DIRECTORIES |
| # Information Class |
| FILE_DIRECTORY_INFORMATION = 0x01 |
| FILE_FULL_DIRECTORY_INFORMATION = 0x02 |
| FILEID_FULL_DIRECTORY_INFORMATION = 0x26 |
| FILE_BOTH_DIRECTORY_INFORMATION = 0x03 |
| FILEID_BOTH_DIRECTORY_INFORMATION = 0x25 |
| FILENAMES_INFORMATION = 0x0C |
| |
| # Flags |
| SMB2_RESTART_SCANS = 0x01 |
| SMB2_RETURN_SINGLE_ENTRY = 0x02 |
| SMB2_INDEX_SPECIFIED = 0x04 |
| SMB2_REOPEN = 0x10 |
| |
| # SMB2_CHANGE_NOTIFY |
| # Flags |
| SMB2_WATCH_TREE = 0x01 |
| |
| # Filters |
| FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001 |
| FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002 |
| FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x00000004 |
| FILE_NOTIFY_CHANGE_SIZE = 0x00000008 |
| FILE_NOTIFY_CHANGE_LAST_WRITE = 0x00000010 |
| FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x00000020 |
| FILE_NOTIFY_CHANGE_CREATION = 0x00000040 |
| FILE_NOTIFY_CHANGE_EA = 0x00000080 |
| FILE_NOTIFY_CHANGE_SECURITY = 0x00000100 |
| FILE_NOTIFY_CHANGE_STREAM_NAME = 0x00000200 |
| FILE_NOTIFY_CHANGE_STREAM_SIZE = 0x00000400 |
| FILE_NOTIFY_CHANGE_STREAM_WRITE = 0x00000800 |
| |
| # FILE_NOTIFY_INFORMATION |
| # Actions |
| FILE_ACTION_ADDED = 0x00000001 |
| FILE_ACTION_REMOVED = 0x00000002 |
| FILE_ACTION_MODIFIED = 0x00000003 |
| FILE_ACTION_RENAMED_OLD_NAME = 0x00000004 |
| FILE_ACTION_RENAMED_NEW_NAME = 0x00000005 |
| |
| # SMB2_QUERY_INFO |
| # InfoTypes |
| SMB2_0_INFO_FILE = 0x01 |
| SMB2_0_INFO_FILESYSTEM = 0x02 |
| SMB2_0_INFO_SECURITY = 0x03 |
| SMB2_0_INFO_QUOTA = 0x04 |
| |
| # File Information Classes |
| SMB2_FILE_ACCESS_INFO = 8 |
| SMB2_FILE_ALIGNMENT_INFO = 17 |
| SMB2_FILE_ALL_INFO = 18 |
| SMB2_FILE_ALLOCATION_INFO = 19 |
| SMB2_FILE_ALTERNATE_NAME_INFO = 21 |
| SMB2_ATTRIBUTE_TAG_INFO = 35 |
| SMB2_FILE_BASIC_INFO = 4 |
| SMB2_FILE_BOTH_DIRECTORY_INFO = 3 |
| SMB2_FILE_COMPRESSION_INFO = 28 |
| SMB2_FILE_DIRECTORY_INFO = 1 |
| SMB2_FILE_DISPOSITION_INFO = 13 |
| SMB2_FILE_EA_INFO = 7 |
| SMB2_FILE_END_OF_FILE_INFO = 20 |
| SMB2_FULL_DIRECTORY_INFO = 2 |
| SMB2_FULL_EA_INFO = 15 |
| SMB2_FILE_HARDLINK_INFO = 46 |
| SMB2_FILE_ID_BOTH_DIRECTORY_INFO = 37 |
| SMB2_FILE_ID_FULL_DIRECTORY_INFO = 38 |
| SMB2_FILE_ID_GLOBAL_TX_DIRECTORY_INFO = 50 |
| SMB2_FILE_INTERNAL_INFO = 6 |
| SMB2_FILE_LINK_INFO = 11 |
| SMB2_FILE_MAILSLOT_QUERY_INFO = 26 |
| SMB2_FILE_MAILSLOT_SET_INFO = 27 |
| SMB2_FILE_MODE_INFO = 16 |
| SMB2_FILE_MOVE_CLUSTER_INFO = 31 |
| SMB2_FILE_NAME_INFO = 9 |
| SMB2_FILE_NAMES_INFO = 12 |
| SMB2_FILE_NETWORK_OPEN_INFO = 34 |
| SMB2_FILE_NORMALIZED_NAME_INFO = 48 |
| SMB2_FILE_OBJECT_ID_INFO = 29 |
| SMB2_FILE_PIPE_INFO = 23 |
| SMB2_FILE_PIPE_LOCAL_INFO = 24 |
| SMB2_FILE_PIPE_REMOTE_INFO = 25 |
| SMB2_FILE_POSITION_INFO = 14 |
| SMB2_FILE_QUOTA_INFO = 32 |
| SMB2_FILE_RENAME_INFO = 10 |
| SMB2_FILE_REPARSE_POINT_INFO = 33 |
| SMB2_FILE_SFIO_RESERVE_INFO = 44 |
| SMB2_FILE_SHORT_NAME_INFO = 45 |
| SMB2_FILE_STANDARD_INFO = 5 |
| SMB2_FILE_STANDARD_LINK_INFO = 54 |
| SMB2_FILE_STREAM_INFO = 22 |
| SMB2_FILE_TRACKING_INFO = 36 |
| SMB2_FILE_VALID_DATA_LENGTH_INFO = 39 |
| |
| # File System Information Classes |
| SMB2_FILESYSTEM_VOLUME_INFO = 1 |
| SMB2_FILESYSTEM_LABEL_INFO = 2 |
| SMB2_FILESYSTEM_SIZE_INFO = 3 |
| SMB2_FILESYSTEM_DEVICE_INFO = 4 |
| SMB2_FILESYSTEM_ATTRIBUTE_INFO = 5 |
| SMB2_FILESYSTEM_CONTROL_INFO = 6 |
| SMB2_FILESYSTEM_FULL_SIZE_INFO = 7 |
| SMB2_FILESYSTEM_OBJECT_ID_INFO = 8 |
| SMB2_FILESYSTEM_DRIVER_PATH_INFO = 9 |
| SMB2_FILESYSTEM_SECTOR_SIZE_INFO = 11 |
| |
| # Additional information |
| OWNER_SECURITY_INFORMATION = 0x00000001 |
| GROUP_SECURITY_INFORMATION = 0x00000002 |
| DACL_SECURITY_INFORMATION = 0x00000004 |
| SACL_SECURITY_INFORMATION = 0x00000008 |
| LABEL_SECURITY_INFORMATION = 0x00000010 |
| |
| # Flags |
| SL_RESTART_SCAN = 0x00000001 |
| SL_RETURN_SINGLE_ENTRY = 0x00000002 |
| SL_INDEX_SPECIFIED = 0x00000004 |
| |
| # TRANSFORM_HEADER |
| SMB2_ENCRYPTION_AES128_CCM = 0x0001 |
| |
| |
| # STRUCtures |
| # Represents a SMB2/3 Packet |
| class SMBPacketBase(Structure): |
| def addCommand(self,command): |
| # Pad to 8 bytes and put the offset of another SMBPacket |
| raise 'Implement This!' |
| |
| def isValidAnswer(self, status): |
| if self['Status'] != status: |
| import smb3 |
| raise smb3.SessionError(self['Status'], self) |
| return True |
| |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['TreeID'] = 0 |
| |
| |
| class SMB2PacketAsync(SMBPacketBase): |
| structure = ( |
| ('ProtocolID','"\xfeSMB'), |
| ('StructureSize','<H=64'), |
| ('CreditCharge','<H=0'), |
| ('Status','<L=0'), |
| ('Command','<H=0'), |
| ('CreditRequestResponse','<H=0'), |
| ('Flags','<L=0'), |
| ('NextCommand','<L=0'), |
| ('MessageID','<Q=0'), |
| ('AsyncID','<Q=0'), |
| ('SessionID','<Q=0'), |
| ('Signature','16s=""'), |
| ('Data',':=""'), |
| ) |
| |
| class SMB3PacketAsync(SMBPacketBase): |
| structure = ( |
| ('ProtocolID','"\xfeSMB'), |
| ('StructureSize','<H=64'), |
| ('CreditCharge','<H=0'), |
| ('ChannelSequence','<H=0'), |
| ('Reserved','<H=0'), |
| ('Command','<H=0'), |
| ('CreditRequestResponse','<H=0'), |
| ('Flags','<L=0'), |
| ('NextCommand','<L=0'), |
| ('MessageID','<Q=0'), |
| ('AsyncID','<Q=0'), |
| ('SessionID','<Q=0'), |
| ('Signature','16s=""'), |
| ('Data',':=""'), |
| ) |
| |
| class SMB2Packet(SMBPacketBase): |
| structure = ( |
| ('ProtocolID','"\xfeSMB'), |
| ('StructureSize','<H=64'), |
| ('CreditCharge','<H=0'), |
| ('Status','<L=0'), |
| ('Command','<H=0'), |
| ('CreditRequestResponse','<H=0'), |
| ('Flags','<L=0'), |
| ('NextCommand','<L=0'), |
| ('MessageID','<Q=0'), |
| ('Reserved','<L=0'), |
| ('TreeID','<L=0'), |
| ('SessionID','<Q=0'), |
| ('Signature','16s=""'), |
| ('Data',':=""'), |
| ) |
| |
| class SMB3Packet(SMBPacketBase): |
| structure = ( |
| ('ProtocolID','"\xfeSMB'), |
| ('StructureSize','<H=64'), |
| ('CreditCharge','<H=0'), |
| ('ChannelSequence','<H=0'), |
| ('Reserved','<H=0'), |
| ('Command','<H=0'), |
| ('CreditRequestResponse','<H=0'), |
| ('Flags','<L=0'), |
| ('NextCommand','<L=0'), |
| ('MessageID','<Q=0'), |
| ('Reserved','<L=0'), |
| ('TreeID','<L=0'), |
| ('SessionID','<Q=0'), |
| ('Signature','16s=""'), |
| ('Data',':=""'), |
| ) |
| |
| class SMB2Error(Structure): |
| structure = ( |
| ('StructureSize','<H=9'), |
| ('Reserved','<H=0'), |
| ('ByteCount','<L=0'), |
| ('_ErrorData','_-ErrorData','self["ByteCount"]'), |
| ('ErrorData','"\xff'), |
| ) |
| |
| class SMB2ErrorSymbolicLink(Structure): |
| structure = ( |
| ('SymLinkLength','<L=0'), |
| ('SymLinkErrorTag','<L=0'), |
| ('ReparseTag','<L=0'), |
| ('ReparseDataLenght','<H=0'), |
| ('UnparsedPathLength','<H=0'), |
| ('SubstituteNameOffset','<H=0'), |
| ('SubstituteNameLength','<H=0'), |
| ('PrintNameOffset','<H=0'), |
| ('PrintNameLength','<H=0'), |
| ('Flags','<L=0'), |
| ('PathBuffer',':'), |
| ) |
| |
| # SMB2_NEGOTIATE |
| class SMB2Negotiate(Structure): |
| structure = ( |
| ('StructureSize','<H=36'), |
| ('DialectCount','<H=0'), |
| ('SecurityMode','<H=0'), |
| ('Reserved','<H=0'), |
| ('Capabilities','<L=0'), |
| ('ClientGuid','16s=""'), |
| ('ClientStartTime','<Q=0'), |
| ('Dialects','*<H'), |
| ) |
| |
| class SMB2Negotiate_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=65'), |
| ('SecurityMode','<H=0'), |
| ('DialectRevision','<H=0'), |
| ('Reserved','<H=0'), |
| ('ServerGuid','16s=""'), |
| ('Capabilities','<L=0'), |
| ('MaxTransactSize','<L=0'), |
| ('MaxReadSize','<L=0'), |
| ('MaxWriteSize','<L=0'), |
| ('SystemTime','<Q=0'), |
| ('ServerStartTime','<Q=0'), |
| ('SecurityBufferOffset','<H=0'), |
| ('SecurityBufferLength','<H=0'), |
| ('Reserved2','<L=0'), |
| ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["SecurityBufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| # SMB2_SESSION_SETUP |
| class SMB2SessionSetup(Structure): |
| SIZE = 24 |
| structure = ( |
| ('StructureSize','<H=25'), |
| ('Flags','<B=0'), |
| ('SecurityMode','<B=0'), |
| ('Capabilities','<L=0'), |
| ('Channel','<L=0'), |
| ('SecurityBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('SecurityBufferLength','<H=0'), |
| ('PreviousSessionId','<Q=0'), |
| ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["SecurityBufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| def getData(self): |
| #self['AlignPad'] = '\x00' * ((8 - ((24 + SMB2_PACKET_SIZE) & 7)) & 7) |
| #self['SecurityBufferOffset'] = 24 + SMB2_PACKET_SIZE +len(self['AlignPad']) |
| #self['SecurityBufferLength'] += len(self['AlignPad']) |
| return Structure.getData(self) |
| |
| |
| class SMB2SessionSetup_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=9'), |
| ('SessionFlags','<H=0'), |
| ('SecurityBufferOffset','<H=0'), |
| ('SecurityBufferLength','<H=0'), |
| ('_AlignPad','_-AlignPad','self["SecurityBufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["SecurityBufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| # SMB2_LOGOFF |
| class SMB2Logoff(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| |
| class SMB2Logoff_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| # SMB2_TREE_CONNECT |
| class SMB2TreeConnect(Structure): |
| SIZE = 8 |
| structure = ( |
| ('StructureSize','<H=9'), |
| ('Reserved','<H=0'), |
| ('PathOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('PathLength','<H=0'), |
| ('_AlignPad','_-AlignPad','self["PathOffset"] - (64 + self.SIZE - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["PathLength"]'), |
| ('Buffer',':'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| class SMB2TreeConnect_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=16'), |
| ('ShareType','<B=0'), |
| ('Reserved','<B=0'), |
| ('ShareFlags','<L=0'), |
| ('Capabilities','<L=0'), |
| ('MaximalAccess','<L=0'), |
| ) |
| |
| # SMB2_TREE_DISCONNECT |
| class SMB2TreeDisconnect(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| class SMB2TreeDisconnect_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| # SMB2_CREATE |
| class SMB2Create(Structure): |
| SIZE = 56 |
| structure = ( |
| ('StructureSize','<H=57'), |
| ('SecurityFlags','<B=0'), |
| ('RequestedOplockLevel','<B=0'), |
| ('ImpersonationLevel','<L=0'), |
| ('SmbCreateFlags','<Q=0'), |
| ('Reserved','<Q=0'), |
| ('DesiredAccess','<L=0'), |
| ('FileAttributes','<L=0'), |
| ('ShareAccess','<L=0'), |
| ('CreateDisposition','<L=0'), |
| ('CreateOptions','<L=0'), |
| ('NameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('NameLength','<H=0'), |
| ('CreateContextsOffset','<L=0'), |
| ('CreateContextsLength','<L=0'), |
| ('_AlignPad','_-AlignPad','self["NameOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["CreateContextsLength"]+self["NameLength"]'), |
| ('Buffer',':'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| class SMB2CreateContext(Structure): |
| structure = ( |
| ('Next','<L=0'), |
| ('NameOffset','<H=0'), |
| ('NameLength','<H=0'), |
| ('Reserved','<H=0'), |
| ('DataOffset','<H=0'), |
| ('DataLength','<L=0'), |
| ('_Buffer','_-Buffer','self["DataLength"]+self["NameLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| class SMB2_FILEID(Structure): |
| structure = ( |
| ('Persistent','<Q=0'), |
| ('Volatile','<Q=0'), |
| ) |
| |
| class SMB2Create_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=89'), |
| ('OplockLevel','<B=0'), |
| ('Flags','<B=0'), |
| ('CreateAction','<L=0'), |
| ('CreationTime','<Q=0'), |
| ('LastAccessTime','<Q=0'), |
| ('LastWriteTime','<Q=0'), |
| ('ChangeTime','<Q=0'), |
| ('AllocationSize','<Q=0'), |
| ('EndOfFile','<Q=0'), |
| ('FileAttributes','<L=0'), |
| ('Reserved2','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('CreateContextsOffset','<L=0'), |
| ('CreateContextsLength','<L=0'), |
| ('_AlignPad','_-AlignPad','self["CreateContextsOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["CreateContextsLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| class FILE_FULL_EA_INFORMATION(Structure): |
| structure = ( |
| ('NextEntryOffset','<L=0'), |
| ('Flags','<B=0'), |
| ('EaNameLength','<B=0'), |
| ('EaValueLength','<H=0'), |
| ('_EaName','_-EaName','self["EaNameLength"]'), |
| ('EaName',':'), |
| ('_EaValue','_-EaValue','self["EaValue"]'), |
| ('EaValue',':'), |
| ) |
| |
| |
| class SMB2_CREATE_DURABLE_HANDLE_RECONNECT(Structure): |
| structure = ( |
| ('Data',':',SMB2_FILEID), |
| ) |
| |
| class SMB2_CREATE_DURABLE_HANDLE_REQUEST(Structure): |
| structure = ( |
| ('DurableRequest','16s=""'), |
| ) |
| |
| class SMB2_CREATE_DURABLE_HANDLE_RESPONSE(Structure): |
| structure = ( |
| ('Reserved','<Q=0'), |
| ) |
| |
| class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST(Structure): |
| structure = ( |
| ('Timestamp','<Q=0'), |
| ) |
| |
| class SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE(Structure): |
| structure = ( |
| ('QueryStatus','<L=0'), |
| ('MaximalAccess','<L=0'), |
| ) |
| |
| class SMB2_CREATE_ALLOCATION_SIZE(Structure): |
| structure = ( |
| ('AllocationSize','<Q=0'), |
| ) |
| |
| class SMB2_CREATE_TIMEWARP_TOKEN(Structure): |
| structure = ( |
| ('AllocationSize','<Q=0'), |
| ) |
| |
| class SMB2_CREATE_REQUEST_LEASE(Structure): |
| structure = ( |
| ('LeaseKey','16s=""'), |
| ('LeaseState','<L=0'), |
| ('LeaseFlags','<L=0'), |
| ('LeaseDuration','<Q=0'), |
| ) |
| |
| SMB2_CREATE_RESPONSE_LEASE = SMB2_CREATE_REQUEST_LEASE |
| |
| class SMB2_CREATE_REQUEST_LEASE_V2(Structure): |
| structure = ( |
| ('LeaseKey','16s=""'), |
| ('LeaseState','<L=0'), |
| ('Flags','<L=0'), |
| ('LeaseDuration','<Q=0'), |
| ('ParentLeaseKey','16s=""'), |
| ('Epoch','<H=0'), |
| ('Reserved','<H=0'), |
| ) |
| |
| SMB2_CREATE_RESPONSE_LEASE_V2 = SMB2_CREATE_REQUEST_LEASE_V2 |
| |
| class SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2(Structure): |
| structure = ( |
| ('Timeout','<L=0'), |
| ('Flags','<L=0'), |
| ('Reserved','8s=""'), |
| ('CreateGuid','16s=""'), |
| ) |
| |
| class SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2(Structure): |
| structure = ( |
| ('Timeout','<L=0'), |
| ('Flags','<L=0'), |
| ) |
| |
| class SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2(Structure): |
| structure = ( |
| ('FileID',':', SMB2_FILEID), |
| ('CreateGuid','16s=""'), |
| ('Flags','<L=0'), |
| ) |
| |
| class SMB2_CREATE_APP_INSTANCE_ID(Structure): |
| structure = ( |
| ('StructureSize','<H=0'), |
| ('Reserved','<H=0'), |
| ('AppInstanceId','16s=""'), |
| ) |
| |
| class SMB2_CREATE_QUERY_ON_DISK_ID(Structure): |
| structure = ( |
| ('DiskIDBuffer','32s=""'), |
| ) |
| |
| # Todo: Add Classes for |
| #SMB2_CREATE_SD_BUFFER |
| |
| # SMB2_CLOSE |
| class SMB2Close(Structure): |
| structure = ( |
| ('StructureSize','<H=24'), |
| ('Flags','<H=0'), |
| ('Reserved','<L=0'), |
| ('FileID',':', SMB2_FILEID), |
| ) |
| |
| class SMB2Close_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=60'), |
| ('Flags','<H=0'), |
| ('Reserved','<L=0'), |
| ('CreationTime','<Q=0'), |
| ('LastAccessTime','<Q=0'), |
| ('LastWriteTime','<Q=0'), |
| ('ChangeTime','<Q=0'), |
| ('AllocationSize','<Q=0'), |
| ('EndofFile','<Q=0'), |
| ('FileAttributes','<L=0'), |
| ) |
| |
| # SMB2_FLUSH |
| class SMB2Flush(Structure): |
| structure = ( |
| ('StructureSize','<H=24'), |
| ('Reserved1','<H=0'), |
| ('Reserved2','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ) |
| |
| class SMB2Flush_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| # SMB2_READ |
| class SMB2Read(Structure): |
| SIZE = 48 |
| structure = ( |
| ('StructureSize','<H=49'), |
| ('Padding','<B=0'), |
| ('Reserved','<B=0'), |
| ('Length','<L=0'), |
| ('Offset','<Q=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('MinimumCount','<L=0'), |
| ('Channel','<L=0'), |
| ('RemainingBytes','<L=0'), |
| ('ReadChannelInfoOffset','<H=0'), |
| ('ReadChannelInfoLength','<H=0'), |
| ('_AlignPad','_-AlignPad','self["ReadChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["ReadChannelInfoLength"]'), |
| ('Buffer',':=0'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| |
| class SMB2Read_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=17'), |
| ('DataOffset','<B=0'), |
| ('Reserved','<B=0'), |
| ('DataLength','<L=0'), |
| ('DataRemaining','<L=0'), |
| ('Reserved2','<L=0'), |
| ('_AlignPad','_-AlignPad','self["DataOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["DataLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| # SMB2_WRITE |
| class SMB2Write(Structure): |
| SIZE = 48 |
| structure = ( |
| ('StructureSize','<H=49'), |
| ('DataOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('Length','<L=0'), |
| ('Offset','<Q=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('Channel','<L=0'), |
| ('RemainingBytes','<L=0'), |
| ('WriteChannelInfoOffset','<H=0'), |
| ('WriteChannelInfoLength','<H=0'), |
| ('_AlignPad','_-AlignPad','self["DataOffset"] + self["WriteChannelInfoOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('Flags','<L=0'), |
| ('_Buffer','_-Buffer','self["Length"]+self["WriteChannelInfoLength"]'), |
| ('Buffer',':'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| |
| class SMB2Write_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=17'), |
| ('Reserved','<H=0'), |
| ('Count','<L=0'), |
| ('Remaining','<L=0'), |
| ('WriteChannelInfoOffset','<H=0'), |
| ('WriteChannelInfoLength','<H=0'), |
| ) |
| |
| class SMB2OplockBreakNotification(Structure): |
| structure = ( |
| ('StructureSize','<H=24'), |
| ('OplockLevel','<B=0'), |
| ('Reserved','<B=0'), |
| ('Reserved2','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ) |
| |
| SMB2OplockBreakAcknowledgment = SMB2OplockBreakNotification |
| SMB2OplockBreakResponse = SMB2OplockBreakNotification |
| |
| class SMB2LeaseBreakNotification(Structure): |
| structure = ( |
| ('StructureSize','<H=44'), |
| ('NewEpoch','<H=0'), |
| ('Flags','<L=0'), |
| ('LeaseKey','16s=""'), |
| ('CurrentLeaseState','<L=0'), |
| ('NewLeaseState','<L=0'), |
| ('BreakReason','<L=0'), |
| ('AccessMaskHint','<L=0'), |
| ('ShareMaskHint','<L=0'), |
| ) |
| |
| class SMB2LeaseBreakAcknowledgement(Structure): |
| structure = ( |
| ('StructureSize','<H=36'), |
| ('Reserved','<H=0'), |
| ('Flags','<L=0'), |
| ('LeaseKey','16s=""'), |
| ('LeaseState','<L=0'), |
| ('LeaseDuration','<Q=0'), |
| ) |
| |
| SMB2LeaseBreakResponse = SMB2LeaseBreakAcknowledgement |
| |
| # SMB2_LOCK |
| class SMB2_LOCK_ELEMENT(Structure): |
| structure = ( |
| ('Offset','<Q=0'), |
| ('Length','<Q=0'), |
| ('Flags','<L=0'), |
| ('Reserved','<L=0'), |
| ) |
| |
| class SMB2Lock(Structure): |
| structure = ( |
| ('StructureSize','<H=48'), |
| ('LockCount','<H=0'), |
| ('LockSequence','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('_Locks','_-Locks','self["LockCount"]*24'), |
| ('Locks',':'), |
| ) |
| |
| class SMB2Lock_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| |
| # SMB2_ECHO |
| class SMB2Echo(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| SMB2Echo_Response = SMB2Echo |
| |
| # SMB2_CANCEL` |
| class SMB2Cancel(Structure): |
| structure = ( |
| ('StructureSize','<H=4'), |
| ('Reserved','<H=0'), |
| ) |
| |
| # SMB2_IOCTL |
| class SMB2Ioctl(Structure): |
| SIZE = 56 |
| structure = ( |
| ('StructureSize','<H=57'), |
| ('Reserved','<H=0'), |
| ('CtlCode','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('InputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('InputCount','<L=0'), |
| ('MaxInputResponse','<L=0'), |
| ('OutputOffset','<L=(self.SIZE + 64 + len(self["AlignPad"]) + self["InputCount"])'), |
| ('OutputCount','<L=0'), |
| ('MaxOutputResponse','<L=0'), |
| ('Flags','<L=0'), |
| ('Reserved2','<L=0'), |
| #('_AlignPad','_-AlignPad','self["InputOffset"] + self["OutputOffset"] - (64 + self["StructureSize"] - 1)'), |
| #('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'), |
| ('Buffer',':'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| class FSCTL_PIPE_WAIT_STRUCTURE(Structure): |
| structure = ( |
| ('Timeout','<q=0'), |
| ('NameLength','<L=0'), |
| ('TimeoutSpecified','<B=0'), |
| ('Padding','<B=0'), |
| ('_Name','_-Name','self["NameLength"]'), |
| ('Name',':'), |
| ) |
| |
| class SRV_COPYCHUNK_COPY(Structure): |
| structure = ( |
| ('SourceKey','24s=""'), |
| ('ChunkCount','<L=0'), |
| ('Reserved','<L=0'), |
| ('_Chunks','_-Chunks', 'self["ChunkCount"]*len(SRV_COPYCHUNK)'), |
| ('Chunks',':'), |
| ) |
| |
| class SRV_COPYCHUNK(Structure): |
| structure = ( |
| ('SourceOffset','<Q=0'), |
| ('TargetOffset','<Q=0'), |
| ('Length','<L=0'), |
| ('Reserved','<L=0'), |
| ) |
| |
| class SRV_COPYCHUNK_RESPONSE(Structure): |
| structure = ( |
| ('ChunksWritten','<L=0'), |
| ('ChunkBytesWritten','<L=0'), |
| ('TotalBytesWritten','<L=0'), |
| ) |
| |
| class SRV_READ_HASH(Structure): |
| structure = ( |
| ('HashType','<L=0'), |
| ('HashVersion','<L=0'), |
| ('HashRetrievalType','<L=0'), |
| ('Length','<L=0'), |
| ('Offset','<Q=0'), |
| ) |
| |
| class NETWORK_RESILIENCY_REQUEST(Structure): |
| structure = ( |
| ('Timeout','<L=0'), |
| ('Reserved','<L=0'), |
| ) |
| |
| class VALIDATE_NEGOTIATE_INFO(Structure): |
| structure = ( |
| ('Capabilities','<L=0'), |
| ('Guid','16s=""'), |
| ('SecurityMode','<H=0'), |
| #('DialectCount','<H=0'), |
| ('Dialects','<H*<H'), |
| ) |
| |
| class SRV_SNAPSHOT_ARRAY(Structure): |
| structure = ( |
| ('NumberOfSnapShots','<L=0'), |
| ('NumberOfSnapShotsReturned','<L=0'), |
| ('SnapShotArraySize','<L=0'), |
| ('_SnapShots','_-SnapShots','self["SnapShotArraySize"]'), |
| ('SnapShots',':'), |
| ) |
| |
| class SRV_REQUEST_RESUME_KEY(Structure): |
| structure = ( |
| ('ResumeKey','24s=""'), |
| ('ContextLength','<L=0'), |
| ('_Context','_-Context','self["ContextLength"]'), |
| ('Context',':'), |
| ) |
| |
| class HASH_HEADER(Structure): |
| structure = ( |
| ('HashType','<L=0'), |
| ('HashVersion','<L=0'), |
| ('SourceFileChangeTime','<Q=0'), |
| ('SourceFileSize','<Q=0'), |
| ('HashBlobLength','<L=0'), |
| ('HashBlobOffset','<L=0'), |
| ('Dirty','<H=0'), |
| ('SourceFileNameLength','<L=0'), |
| ('_SourceFileName','_-SourceFileName','self["SourceFileNameLength"]',), |
| ('SourceFileName',':'), |
| ) |
| |
| class SRV_HASH_RETRIEVE_HASH_BASED(Structure): |
| structure = ( |
| ('Offset','<Q=0'), |
| ('BufferLength','<L=0'), |
| ('Reserved','<L=0'), |
| ('_Buffer','_-Buffer','self["BufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| class SRV_HASH_RETRIEVE_FILE_BASED(Structure): |
| structure = ( |
| ('FileDataOffset','<Q=0'), |
| ('FileDataLength','<Q=0'), |
| ('BufferLength','<L=0'), |
| ('Reserved','<L=0'), |
| ('_Buffer','_-Buffer','self["BufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| class NETWORK_INTERFACE_INFO(Structure): |
| structure = ( |
| ('Next','<L=0'), |
| ('IfIndex','<L=0'), |
| ('Capability','<L=0'), |
| ('Reserved','<L=0'), |
| ('LinkSpeed','<Q=0'), |
| ('SockAddr_Storage','128s=""'), |
| ) |
| |
| class SMB2Ioctl_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=49'), |
| ('Reserved','<H=0'), |
| ('CtlCode','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('InputOffset','<L=0'), |
| ('InputCount','<L=0'), |
| ('OutputOffset','<L=0'), |
| ('OutputCount','<L=0'), |
| ('Flags','<L=0'), |
| ('Reserved2','<L=0'), |
| ('_AlignPad','_-AlignPad','self["OutputOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["InputCount"]+self["OutputCount"]'), |
| ('Buffer',':'), |
| ) |
| |
| # SMB2_QUERY_DIRECTORY |
| class SMB2QueryDirectory(Structure): |
| SIZE = 32 |
| structure = ( |
| ('StructureSize','<H=33'), |
| ('FileInformationClass','<B=0'), |
| ('Flags','<B=0'), |
| ('FileIndex','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('FileNameOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('FileNameLength','<H=0'), |
| ('OutputBufferLength','<L=0'), |
| ('_AlignPad','_-AlignPad','self["FileNameOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["FileNameLength"]'), |
| ('Buffer',':'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| class SMB2QueryDirectory_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=9'), |
| ('OutputBufferOffset','<H=0'), |
| ('OutputBufferLength','<L=0'), |
| ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["OutputBufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| # SMB2_CHANGE_NOTIFY |
| class SMB2ChangeNotify(Structure): |
| structure = ( |
| ('StructureSize','<H=32'), |
| ('Flags','<H=0'), |
| ('OutputBufferLength','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('CompletionFilter','<L=0'), |
| ('Reserved','<L=0'), |
| ) |
| |
| class SMB2ChangeNotify_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=9'), |
| ('OutputBufferOffset','<H=0'), |
| ('OutputBufferLength','<L=0'), |
| ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["OutputBufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| class FILE_NOTIFY_INFORMATION(Structure): |
| structure = ( |
| ('NextEntryOffset','<L=0'), |
| ('Action','<L=0'), |
| ('FileNameLength','<L=0'), |
| ('_FileName','_-FileName','self["FileNameLength"]',), |
| ('FileName',':'), |
| ) |
| |
| # SMB2_QUERY_INFO |
| class SMB2QueryInfo(Structure): |
| SIZE = 40 |
| structure = ( |
| ('StructureSize','<H=41'), |
| ('InfoType','<B=0'), |
| ('FileInfoClass','<B=0'), |
| ('OutputBufferLength','<L=0'), |
| ('InputBufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('Reserved','<H=0'), |
| ('InputBufferLength','<L=0'), |
| ('AdditionalInformation','<L=0'), |
| ('Flags','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('_AlignPad','_-AlignPad','self["InputBufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["InputBufferLength"]'), |
| ('Buffer',':'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| |
| class SMB2_QUERY_QUOTA_INFO(Structure): |
| structure = ( |
| ('ReturnSingle','<B=0'), |
| ('RestartScan','<B=0'), |
| ('Reserved','<H=0'), |
| ('SidListLength','<L=0'), |
| ('StartSidLength','<L=0'), |
| ('StartSidOffset','<L=0'), |
| # ToDo: Check 2.2.37.1 here |
| ('SidBuffer',':'), |
| ) |
| |
| class SMB2QueryInfo_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=9'), |
| ('OutputBufferOffset','<H=0'), |
| ('OutputBufferLength','<L=0'), |
| ('_AlignPad','_-AlignPad','self["OutputBufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["OutputBufferLength"]'), |
| ('Buffer',':'), |
| ) |
| |
| # SMB2_SET_INFO |
| class SMB2SetInfo(Structure): |
| SIZE = 32 |
| structure = ( |
| ('StructureSize','<H=33'), |
| ('InfoType','<B=0'), |
| ('FileInfoClass','<B=0'), |
| ('BufferLength','<L=0'), |
| ('BufferOffset','<H=(self.SIZE + 64 + len(self["AlignPad"]))'), |
| ('Reserved','<H=0'), |
| ('AdditionalInformation','<L=0'), |
| ('FileID',':',SMB2_FILEID), |
| ('_AlignPad','_-AlignPad','self["BufferOffset"] - (64 + self["StructureSize"] - 1)'), |
| ('AlignPad',':=""'), |
| ('_Buffer','_-Buffer','self["BufferLength"]'), |
| ('Buffer',':'), |
| ) |
| def __init__(self, data = None): |
| Structure.__init__(self,data) |
| if data is None: |
| self['AlignPad'] = '' |
| |
| class SMB2SetInfo_Response(Structure): |
| structure = ( |
| ('StructureSize','<H=2'), |
| ) |
| |
| class FILE_RENAME_INFORMATION_TYPE_2(Structure): |
| structure = ( |
| ('ReplaceIfExists','<B=0'), |
| ('Reserved','7s=""'), |
| ('RootDirectory','<Q=0'), |
| ('FileNameLength','<L=0'), |
| ('_FileName','_-FileName','self["FileNameLength"]'), |
| ('FileName',':'), |
| ) |
| |
| class SMB2_TRANSFORM_HEADER(Structure): |
| structure = ( |
| ('ProtocolID','"\xfdSMB'), |
| ('Signature','16s=""'), |
| ('Nonce','16s=""'), |
| ('OriginalMessageSize','<L=0'), |
| ('Reserved','<H=0'), |
| ('EncryptionAlgorithm','<H=0'), |
| ('SessionID','<Q=0'), |
| ) |
| |
| # SMB2_FILE_INTERNAL_INFO |
| class FileInternalInformation(Structure): |
| structure = ( |
| ('IndexNumber','<q=0'), |
| ) |