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