|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
smbtrans.h
Abstract:
This file contains request and response structure definitions for the specific parameters of Transaction and Transaction2 SMBs.
Author:
Chuck Lenzmeier (chuckl) 23-Feb-1990 David Treadwell (davidtr)
Revision History:
--*/
#ifndef _SMBTRANS_ #define _SMBTRANS_
//#include <nt.h>
//#include <smbtypes.h> //#include <smb.h>
// // Force misalignment of the following structures //
#ifndef NO_PACKING #include <packon.h> #endif // ndef NO_PACKING
// // Named pipe function codes //
#define TRANS_SET_NMPIPE_STATE 0x01 #define TRANS_RAW_READ_NMPIPE 0x11 #define TRANS_QUERY_NMPIPE_STATE 0x21 #define TRANS_QUERY_NMPIPE_INFO 0x22 #define TRANS_PEEK_NMPIPE 0x23 #define TRANS_TRANSACT_NMPIPE 0x26 #define TRANS_RAW_WRITE_NMPIPE 0x31 #define TRANS_READ_NMPIPE 0x36 #define TRANS_WRITE_NMPIPE 0x37 #define TRANS_WAIT_NMPIPE 0x53 #define TRANS_CALL_NMPIPE 0x54
// // Mailslot function code //
#define TRANS_MAILSLOT_WRITE 0x01
// // Transaction2 function codes //
#define TRANS2_OPEN2 0x00 #define TRANS2_FIND_FIRST2 0x01 #define TRANS2_FIND_NEXT2 0x02 #define TRANS2_QUERY_FS_INFORMATION 0x03 #define TRANS2_SET_FS_INFORMATION 0x04 #define TRANS2_QUERY_PATH_INFORMATION 0x05 #define TRANS2_SET_PATH_INFORMATION 0x06 #define TRANS2_QUERY_FILE_INFORMATION 0x07 #define TRANS2_SET_FILE_INFORMATION 0x08 #define TRANS2_FSCTL 0x09 #define TRANS2_IOCTL2 0x0A #define TRANS2_FIND_NOTIFY_FIRST 0x0B #define TRANS2_FIND_NOTIFY_NEXT 0x0C #define TRANS2_CREATE_DIRECTORY 0x0D #define TRANS2_SESSION_SETUP 0x0E #define TRANS2_QUERY_FS_INFORMATION_FID 0x0F #define TRANS2_GET_DFS_REFERRAL 0x10 #define TRANS2_REPORT_DFS_INCONSISTENCY 0x11
#define TRANS2_MAX_FUNCTION 0x11
// // Nt Transaction function codes //
#define NT_TRANSACT_MIN_FUNCTION 1
#define NT_TRANSACT_CREATE 1 #define NT_TRANSACT_IOCTL 2 #define NT_TRANSACT_SET_SECURITY_DESC 3 #define NT_TRANSACT_NOTIFY_CHANGE 4 #define NT_TRANSACT_RENAME 5 #define NT_TRANSACT_QUERY_SECURITY_DESC 6 #define NT_TRANSACT_QUERY_QUOTA 7 #define NT_TRANSACT_SET_QUOTA 8
#define NT_TRANSACT_MAX_FUNCTION 8
// // File information levels //
#define SMB_INFO_STANDARD 1 #define SMB_INFO_QUERY_EA_SIZE 2 #define SMB_INFO_SET_EAS 2 #define SMB_INFO_QUERY_EAS_FROM_LIST 3 #define SMB_INFO_QUERY_ALL_EAS 4 // undocumented but supported #define SMB_INFO_QUERY_FULL_NAME 5 // never sent by redir #define SMB_INFO_IS_NAME_VALID 6 #define SMB_INFO_PASSTHROUGH 1000 // any info above here is a simple pass-through
// // NT extension to file info levels //
#define SMB_QUERY_FILE_BASIC_INFO 0x101 #define SMB_QUERY_FILE_STANDARD_INFO 0x102 #define SMB_QUERY_FILE_EA_INFO 0x103 #define SMB_QUERY_FILE_NAME_INFO 0x104 #define SMB_QUERY_FILE_ALLOCATION_INFO 0x105 #define SMB_QUERY_FILE_END_OF_FILEINFO 0x106 #define SMB_QUERY_FILE_ALL_INFO 0x107 #define SMB_QUERY_FILE_ALT_NAME_INFO 0x108 #define SMB_QUERY_FILE_STREAM_INFO 0x109 #define SMB_QUERY_FILE_COMPRESSION_INFO 0x10B
#define SMB_SET_FILE_BASIC_INFO 0x101 #define SMB_SET_FILE_DISPOSITION_INFO 0x102 #define SMB_SET_FILE_ALLOCATION_INFO 0x103 #define SMB_SET_FILE_END_OF_FILE_INFO 0x104
#define SMB_QUERY_FS_LABEL_INFO 0x101 #define SMB_QUERY_FS_VOLUME_INFO 0x102 #define SMB_QUERY_FS_SIZE_INFO 0x103 #define SMB_QUERY_FS_DEVICE_INFO 0x104 #define SMB_QUERY_FS_ATTRIBUTE_INFO 0x105 #define SMB_QUERY_FS_QUOTA_INFO 0x106 // unused? #define SMB_QUERY_FS_CONTROL_INFO 0x107
// // Volume information levels. //
#define SMB_INFO_ALLOCATION 1 #define SMB_INFO_VOLUME 2
// // Rename2 information levels. //
#define SMB_NT_RENAME_MOVE_CLUSTER_INFO 0x102 #define SMB_NT_RENAME_SET_LINK_INFO 0x103 #define SMB_NT_RENAME_RENAME_FILE 0x104 // Server internal #define SMB_NT_RENAME_MOVE_FILE 0x105 // Server internal
// // Protocol for NtQueryQuotaInformationFile // typedef struct { _USHORT( Fid ); // FID of target UCHAR ReturnSingleEntry; // Indicates that only a single entry should be returned // rather than filling the buffer with as // many entries as possible. UCHAR RestartScan; // Indicates whether the scan of the quota information // is to be restarted from the beginning. _ULONG ( SidListLength ); // Supplies the length of the SID list if present _ULONG ( StartSidLength ); // Supplies an optional SID that indicates that the returned // information is to start with an entry other // than the first. This parameter is ignored if a // SidList is given _ULONG( StartSidOffset); // Supplies the offset of Start Sid in the buffer } REQ_NT_QUERY_FS_QUOTA_INFO, *PREQ_NT_QUERY_FS_QUOTA_INFO; // // Desciptor response // // Data Bytes: The Quota Information // typedef struct { _ULONG ( Length ); } RESP_NT_QUERY_FS_QUOTA_INFO, *PRESP_NT_QUERY_FS_QUOTA_INFO;
// // Protocol for NtSetQuotaInformationFile // typedef struct { _USHORT( Fid ); // FID of target } REQ_NT_SET_FS_QUOTA_INFO, *PREQ_NT_SET_FS_QUOTA_INFO; // // Response: // // Setup words: None. // Parameter Bytes: None. // Data Bytes: None. //
#ifdef INCLUDE_SMB_CAIRO
// // protocol for sessionsetup as trans2 // function is srvsmbsessionsetup (int srv\smbtrans.c) // #define TRANS2_SESSION_SETUP 0x0E //
typedef struct _REQ_CAIRO_TRANS2_SESSION_SETUP { UCHAR WordCount; // Count of parameter words = 6 UCHAR Pad; // So things are aligned _USHORT ( MaxBufferSize ); // Max transmit buffer size _USHORT ( MaxMpxCount ); // Max pending multiplexed requests _USHORT ( VcNumber ); // 0 = first (only), nonzero=additional VC number _ULONG ( SessionKey ); // Session key (valid iff VcNumber != 0) _ULONG ( Capabilities ); // Server capabilities _ULONG ( BufferLength ); UCHAR Buffer[1]; //UCHAR KerberosTicket[]; // The KerberosTicket } REQ_CAIRO_TRANS2_SESSION_SETUP; typedef REQ_CAIRO_TRANS2_SESSION_SETUP *PREQ_CAIRO_TRANS2_SESSION_SETUP; // *** NOT SMB_UNALIGNED!
typedef struct _RESP_CAIRO_TRANS2_SESSION_SETUP { UCHAR WordCount; // Count of parameter words = 0 UCHAR Pad; // So things are aligned _USHORT( Uid ); // Unauthenticated user id _ULONG ( BufferLength ); UCHAR Buffer[1]; //UCHAR KerberosTicket[]; // The KerberosTicket } RESP_CAIRO_TRANS2_SESSION_SETUP; typedef RESP_CAIRO_TRANS2_SESSION_SETUP *PRESP_CAIRO_TRANS2_SESSION_SETUP; // *** NOT SMB_UNALIGNED!
typedef struct _REQ_QUERY_FS_INFORMATION_FID { _USHORT( InformationLevel ); _USHORT( Fid ); } REQ_QUERY_FS_INFORMATION_FID; typedef REQ_QUERY_FS_INFORMATION_FID SMB_UNALIGNED *PREQ_QUERY_FS_INFORMATION_FID;
// // Setup words for NT I/O control request //
struct _TempSetup { _ULONG( FunctionCode ); _USHORT( Fid ); BOOLEAN IsFsctl; UCHAR IsFlags; };
typedef struct _REQ_CAIRO_IO_CONTROL { _USHORT( Trans2Function ); // used for Trans2, but not NT transact _ULONG( FunctionCode ); _USHORT( Fid ); BOOLEAN IsFsctl; UCHAR IsFlags; } REQ_CAIRO_IO_CONTROL; typedef REQ_CAIRO_IO_CONTROL SMB_UNALIGNED *PREQ_CAIRO_IO_CONTROL;
// // For Cairo remoting general FSCTLS //
#define IsTID 1
#endif // INCLUDE_SMB_CAIRO
// // Dfs Transactions //
// // Request for Referral. // typedef struct { USHORT MaxReferralLevel; // Latest version of referral understood UCHAR RequestFileName[1]; // Dfs name for which referral is sought } REQ_GET_DFS_REFERRAL; typedef REQ_GET_DFS_REFERRAL SMB_UNALIGNED *PREQ_GET_DFS_REFERRAL;
// // The format of an individual referral contains version and length information // allowing the client to skip referrals it does not understand. // // !! All referral elements must have VersionNumber and Size as the first 2 elements !! //
typedef struct { USHORT VersionNumber; // == 1 USHORT Size; // Size of this whole element USHORT ServerType; // Type of server: 0 == Don't know, 1 == SMB, 2 == Netware struct { USHORT StripPath : 1; // Strip off PathConsumed characters from front of // DfsPathName prior to submitting name to UncShareName }; WCHAR ShareName[1]; // The server+share name go right here. NULL terminated. } DFS_REFERRAL_V1; typedef DFS_REFERRAL_V1 SMB_UNALIGNED *PDFS_REFERRAL_V1;
typedef struct { USHORT VersionNumber; // == 2 USHORT Size; // Size of this whole element USHORT ServerType; // Type of server: 0 == Don't know, 1 == SMB, 2 == Netware struct { USHORT StripPath : 1; // Strip off PathConsumed characters from front of // DfsPathName prior to submitting name to UncShareName }; ULONG Proximity; // Hint of transport cost ULONG TimeToLive; // In number of seconds USHORT DfsPathOffset; // Offset from beginning of this element to Path to access USHORT DfsAlternatePathOffset; // Offset from beginning of this element to 8.3 path USHORT NetworkAddressOffset; // Offset from beginning of this element to Network path } DFS_REFERRAL_V2; typedef DFS_REFERRAL_V2 SMB_UNALIGNED *PDFS_REFERRAL_V2;
typedef struct { USHORT VersionNumber; // == 3 USHORT Size; // Size of this whole element USHORT ServerType; // Type of server: 0 == Don't know, 1 == SMB, 2 == Netware struct { USHORT StripPath : 1; // Strip off PathConsumed characters from front of // DfsPathName prior to submitting name to UncShareName USHORT NameListReferral : 1; // This referral contains an expanded name list }; ULONG TimeToLive; // In number of seconds union { struct { USHORT DfsPathOffset; // Offset from beginning of this element to Path to access USHORT DfsAlternatePathOffset; // Offset from beginning of this element to 8.3 path USHORT NetworkAddressOffset; // Offset from beginning of this element to Network path GUID ServiceSiteGuid; // The guid for the site }; struct { USHORT SpecialNameOffset; // Offset from this element to the special name string USHORT NumberOfExpandedNames; // Number of expanded names USHORT ExpandedNameOffset; // Offset from this element to the expanded name list }; }; } DFS_REFERRAL_V3; typedef DFS_REFERRAL_V3 SMB_UNALIGNED *PDFS_REFERRAL_V3;
typedef struct { USHORT PathConsumed; // Number of WCHARs consumed in DfsPathName USHORT NumberOfReferrals; // Number of referrals contained here struct { ULONG ReferralServers : 1; // Elements in Referrals[] are referral servers ULONG StorageServers : 1; // Elements in Referrals[] are storage servers }; union { // The vector of referrals DFS_REFERRAL_V1 v1; DFS_REFERRAL_V2 v2; DFS_REFERRAL_V3 v3; } Referrals[1]; // [ NumberOfReferrals ]
// // WCHAR StringBuffer[]; // Used by DFS_REFERRAL_V2 //
} RESP_GET_DFS_REFERRAL; typedef RESP_GET_DFS_REFERRAL SMB_UNALIGNED *PRESP_GET_DFS_REFERRAL;
// // During Dfs operations, a client may discover a knowledge inconsistency in the Dfs. // The parameter portion of the TRANS2_REPORT_DFS_INCONSISTENCY SMB is // encoded in this way //
typedef struct { UCHAR RequestFileName[1]; // Dfs name for which inconsistency is being reported union { DFS_REFERRAL_V1 v1; // The single referral thought to be in error } Referral; } REQ_REPORT_DFS_INCONSISTENCY; typedef REQ_REPORT_DFS_INCONSISTENCY SMB_UNALIGNED *PREQ_REPORT_DFS_INCONSISTENCY;
// // The client also needs to send to this server the referral which it believes to be // in error. The data part of this transaction contains the errant referral(s), encoded // as above in the DFS_REFERRAL_* structures. //
// // Find First, information levels //
#define SMB_FIND_FILE_DIRECTORY_INFO 0x101 #define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102 #define SMB_FIND_FILE_NAMES_INFO 0x103 #define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104 #define SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO 0x105 #define SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO 0x106
#ifdef INCLUDE_SMB_DIRECTORY
// // CreateDirectory2 function code os Transaction2 SMB, see #3 page 51 // Function is SrvSmbCreateDirectory2() // TRANS2_CREATE_DIRECTORY 0x0D //
typedef struct _REQ_CREATE_DIRECTORY2 { _ULONG( Reserved ); // Reserved--must be zero UCHAR Buffer[1]; // Directory name to create } REQ_CREATE_DIRECTORY2; typedef REQ_CREATE_DIRECTORY2 SMB_UNALIGNED *PREQ_CREATE_DIRECTORY2;
// Data bytes for CreateDirectory2 request are the extended attributes for the // created file.
typedef struct _RESP_CREATE_DIRECTORY2 { _USHORT( EaErrorOffset ); // Offset into FEAList of first error // which occurred while setting EAs } RESP_CREATE_DIRECTORY2; typedef RESP_CREATE_DIRECTORY2 SMB_UNALIGNED *PRESP_CREATE_DIRECTORY2;
#endif // def INCLUDE_SMB_DIRECTORY
#ifdef INCLUDE_SMB_SEARCH
// // FindFirst2 function code of Transaction2 SMB, see #3 page 22 // Function is SrvSmbFindFirst2() // TRANS2_FIND_FIRST2 0x01 //
typedef struct _REQ_FIND_FIRST2 { _USHORT( SearchAttributes ); _USHORT( SearchCount ); // Maximum number of entries to return _USHORT( Flags ); // Additional information: bit set- // 0 - close search after this request // 1 - close search if end reached // 2 - return resume keys _USHORT( InformationLevel ); _ULONG(SearchStorageType); UCHAR Buffer[1]; // File name } REQ_FIND_FIRST2; typedef REQ_FIND_FIRST2 SMB_UNALIGNED *PREQ_FIND_FIRST2;
// Data bytes for Find First2 request are a list of extended attributes // to retrieve (a GEAList), if InformationLevel is QUERY_EAS_FROM_LIST.
typedef struct _RESP_FIND_FIRST2 { _USHORT( Sid ); // Search handle _USHORT( SearchCount ); // Number of entries returned _USHORT( EndOfSearch ); // Was last entry returned? _USHORT( EaErrorOffset ); // Offset into EA list if EA error _USHORT( LastNameOffset ); // Offset into data to file name of // last entry, if server needs it // to resume search; else 0 } RESP_FIND_FIRST2; typedef RESP_FIND_FIRST2 SMB_UNALIGNED *PRESP_FIND_FIRST2;
// Data bytes for Find First2 response are level-dependent information // about the matching files. If bit 2 in the request parameters was // set, each entry is preceded by a four-byte resume key.
// // FindNext2 function code of Transaction2 SMB, see #3 page 26 // Function is SrvSmbFindNext2() // TRANS2_FIND_NEXT2 0x02 //
typedef struct _REQ_FIND_NEXT2 { _USHORT( Sid ); // Search handle _USHORT( SearchCount ); // Maximum number of entries to return _USHORT( InformationLevel ); _ULONG( ResumeKey ); // Value returned by previous find _USHORT( Flags ); // Additional information: bit set- // 0 - close search after this request // 1 - close search if end reached // 2 - return resume keys // 3 - resume/continue, NOT rewind UCHAR Buffer[1]; // Resume file name } REQ_FIND_NEXT2; typedef REQ_FIND_NEXT2 SMB_UNALIGNED *PREQ_FIND_NEXT2;
// Data bytes for Find Next2 request are a list of extended attributes // to retrieve, if InformationLevel is QUERY_EAS_FROM_LIST.
typedef struct _RESP_FIND_NEXT2 { _USHORT( SearchCount ); // Number of entries returned _USHORT( EndOfSearch ); // Was last entry returned? _USHORT( EaErrorOffset ); // Offset into EA list if EA error _USHORT( LastNameOffset ); // Offset into data to file name of // last entry, if server needs it // to resume search; else 0 } RESP_FIND_NEXT2; typedef RESP_FIND_NEXT2 SMB_UNALIGNED *PRESP_FIND_NEXT2;
// Data bytes for Find Next2 response are level-dependent information // about the matching files. If bit 2 in the request parameters was // set, each entry is preceded by a four-byte resume key.
// // Flags for REQ_FIND_FIRST2.Flags //
#define SMB_FIND_CLOSE_AFTER_REQUEST 0x01 #define SMB_FIND_CLOSE_AT_EOS 0x02 #define SMB_FIND_RETURN_RESUME_KEYS 0x04 #define SMB_FIND_CONTINUE_FROM_LAST 0x08 #define SMB_FIND_WITH_BACKUP_INTENT 0x10
#endif // def INCLUDE_SMB_SEARCH
#ifdef INCLUDE_SMB_OPEN_CLOSE
// // Open2 function code of Transaction2 SMB, see #3 page 19 // Function is SrvSmbOpen2() // TRANS2_OPEN2 0x00 // // *** Note that the REQ_OPEN2 and RESP_OPEN2 structures closely // resemble the REQ_OPEN_ANDX and RESP_OPEN_ANDX structures. //
typedef struct _REQ_OPEN2 { _USHORT( Flags ); // Additional information: bit set- // 0 - return additional info // 1 - set single user total file lock // 2 - server notifies consumer of // actions which may change file // 3 - return total length of EAs _USHORT( DesiredAccess ); // File open mode _USHORT( SearchAttributes ); // *** ignored _USHORT( FileAttributes ); _ULONG( CreationTimeInSeconds ); _USHORT( OpenFunction ); _ULONG( AllocationSize ); // Bytes to reserve on create or truncate _USHORT( Reserved )[5]; // Pad through OpenAndX's Timeout, // Reserved, and ByteCount UCHAR Buffer[1]; // File name } REQ_OPEN2; typedef REQ_OPEN2 SMB_UNALIGNED *PREQ_OPEN2;
// Data bytes for Open2 request are the extended attributes for the // created file.
typedef struct _RESP_OPEN2 { _USHORT( Fid ); // File handle _USHORT( FileAttributes ); _ULONG( CreationTimeInSeconds ); _ULONG( DataSize ); // Current file size _USHORT( GrantedAccess ); // Access permissions actually allowed _USHORT( FileType ); _USHORT( DeviceState ); // state of IPC device (e.g. pipe) _USHORT( Action ); // Action taken _ULONG( ServerFid ); // Server unique file id _USHORT( EaErrorOffset ); // Offset into EA list if EA error _ULONG( EaLength ); // Total EA length for opened file } RESP_OPEN2; typedef RESP_OPEN2 SMB_UNALIGNED *PRESP_OPEN2;
// The Open2 response has no data bytes.
#endif // def INCLUDE_SMB_OPEN_CLOSE
#ifdef INCLUDE_SMB_MISC
// // QueryFsInformation function code of Transaction2 SMB, see #3 page 30 // Function is SrvSmbQueryFsInformation() // TRANS2_QUERY_FS_INFORMATION 0x03 //
typedef struct _REQ_QUERY_FS_INFORMATION { _USHORT( InformationLevel ); } REQ_QUERY_FS_INFORMATION; typedef REQ_QUERY_FS_INFORMATION SMB_UNALIGNED *PREQ_QUERY_FS_INFORMATION;
// No data bytes for Query FS Information request.
//typedef struct _RESP_QUERY_FS_INFORMATION { //} RESP_QUERY_FS_INFORMATION; //typedef RESP_QUERY_FS_INFORMATION SMB_UNALIGNED *PRESP_QUERY_FS_INFORMATION;
// Data bytes for Query FS Information response are level-dependent // information about the specified volume.
// // SetFSInformation function code of Transaction2 SMB, see #3 page 31 // Function is SrvSmbSetFSInformation() // TRANS2_SET_PATH_INFORMATION 0x04 //
typedef struct _REQ_SET_FS_INFORMATION { _USHORT( Fid ); _USHORT( InformationLevel ); } REQ_SET_FS_INFORMATION; typedef REQ_SET_FS_INFORMATION SMB_UNALIGNED *PREQ_SET_FS_INFORMATION;
// Data bytes for Set FS Information request are level-dependant // information about the specified volume.
//typedef struct _RESP_SET_FS_INFORMATION { //} RESP_SET_FS_INFORMATION; //typedef RESP_SET_FS_INFORMATION SMB_UNALIGNED *PRESP_SET_FS_INFORMATION;
// The Set FS Information response has no data bytes.
#endif // def INCLUDE_SMB_MISC
#ifdef INCLUDE_SMB_QUERY_SET
// // QueryPathInformation function code of Transaction2 SMB, see #3 page 33 // Function is SrvSmbQueryPathInformation() // TRANS2_QUERY_PATH_INFORMATION 0x05 //
typedef struct _REQ_QUERY_PATH_INFORMATION { _USHORT( InformationLevel ); _ULONG( Reserved ); // Must be zero UCHAR Buffer[1]; // File name } REQ_QUERY_PATH_INFORMATION; typedef REQ_QUERY_PATH_INFORMATION SMB_UNALIGNED *PREQ_QUERY_PATH_INFORMATION;
// Data bytes for Query Path Information request are a list of extended // attributes to retrieve, if InformationLevel is QUERY_EAS_FROM_LIST.
typedef struct _RESP_QUERY_PATH_INFORMATION { _USHORT( EaErrorOffset ); // Offset into EA list if EA error } RESP_QUERY_PATH_INFORMATION; typedef RESP_QUERY_PATH_INFORMATION SMB_UNALIGNED *PRESP_QUERY_PATH_INFORMATION;
// Data bytes for Query Path Information response are level-dependent // information about the specified path/file.
// // SetPathInformation function code of Transaction2 SMB, see #3 page 35 // Function is SrvSmbSetPathInformation() // TRANS2_SET_PATH_INFORMATION 0x06 //
typedef struct _REQ_SET_PATH_INFORMATION { _USHORT( InformationLevel ); _ULONG( Reserved ); // Must be zero UCHAR Buffer[1]; // File name } REQ_SET_PATH_INFORMATION; typedef REQ_SET_PATH_INFORMATION SMB_UNALIGNED *PREQ_SET_PATH_INFORMATION;
// Data bytes for Set Path Information request are either file information // and attributes or a list of extended attributes for the file.
typedef struct _RESP_SET_PATH_INFORMATION { _USHORT( EaErrorOffset ); // Offset into EA list if EA error } RESP_SET_PATH_INFORMATION; typedef RESP_SET_PATH_INFORMATION SMB_UNALIGNED *PRESP_SET_PATH_INFORMATION;
// The Set Path Information response has no data bytes.
// // QueryFileInformation function code of Transaction2 SMB, see #3 page 37 // Function is SrvSmbQueryFileInformation() // TRANS2_QUERY_FILE_INFORMATION 0x07 //
typedef struct _REQ_QUERY_FILE_INFORMATION { _USHORT( Fid ); // File handle _USHORT( InformationLevel ); } REQ_QUERY_FILE_INFORMATION; typedef REQ_QUERY_FILE_INFORMATION SMB_UNALIGNED *PREQ_QUERY_FILE_INFORMATION;
// Data bytes for Query File Information request are a list of extended // attributes to retrieve, if InformationLevel is QUERY_EAS_FROM_LIST.
typedef struct _RESP_QUERY_FILE_INFORMATION { _USHORT( EaErrorOffset ); // Offset into EA list if EA error } RESP_QUERY_FILE_INFORMATION; typedef RESP_QUERY_FILE_INFORMATION SMB_UNALIGNED *PRESP_QUERY_FILE_INFORMATION;
// Data bytes for Query File Information response are level-dependent // information about the specified path/file.
// // SetFileInformation function code of Transaction2 SMB, see #3 page 39 // Function is SrvSmbSetFileInformation() // TRANS2_SET_FILE_INFORMATION 0x08 //
typedef struct _REQ_SET_FILE_INFORMATION { _USHORT( Fid ); // File handle _USHORT( InformationLevel ); _USHORT( Flags ); // File I/O control flags: bit set- // 4 - write through // 5 - no cache } REQ_SET_FILE_INFORMATION; typedef REQ_SET_FILE_INFORMATION SMB_UNALIGNED *PREQ_SET_FILE_INFORMATION;
// Data bytes for Set File Information request are either file information // and attributes or a list of extended attributes for the file.
typedef struct _RESP_SET_FILE_INFORMATION { _USHORT( EaErrorOffset ); // Offset into EA list if EA error } RESP_SET_FILE_INFORMATION; typedef RESP_SET_FILE_INFORMATION SMB_UNALIGNED *PRESP_SET_FILE_INFORMATION;
// The Set File Information response has no data bytes.
#endif // def INCLUDE_SMB_QUERY_SET
// // Opcodes for Mailslot transactions. Not all filled in at present. // WARNING ... the info here on mailslots (opcode and smb struct) // is duplicated in net/h/mslotsmb.h //
#define MS_WRITE_OPCODE 1
typedef struct _SMB_TRANSACT_MAILSLOT { UCHAR WordCount; // Count of data bytes; value = 17 _USHORT( TotalParameterCount ); // Total parameter bytes being sent _USHORT( TotalDataCount ); // Total data bytes being sent _USHORT( MaxParameterCount ); // Max parameter bytes to return _USHORT( MaxDataCount ); // Max data bytes to return UCHAR MaxSetupCount; // Max setup words to return UCHAR Reserved; _USHORT( Flags ); // Additional information: // bit 0 - unused // bit 1 - one-way transacion (no resp) _ULONG( Timeout ); _USHORT( Reserved1 ); _USHORT( ParameterCount ); // Parameter bytes sent this buffer _USHORT( ParameterOffset ); // Offset (from header start) to params _USHORT( DataCount ); // Data bytes sent this buffer _USHORT( DataOffset ); // Offset (from header start) to data UCHAR SetupWordCount; // = 3 UCHAR Reserved2; // Reserved (pad above to word) _USHORT( Opcode ); // 1 -- Write Mailslot _USHORT( Priority ); // Priority of transaction _USHORT( Class ); // Class: 1 = reliable, 2 = unreliable _USHORT( ByteCount ); // Count of data bytes UCHAR Buffer[1]; // Buffer containing: //UCHAR MailslotName[]; // "\MAILSLOT\<name>0" //UCHAR Pad[] // Pad to SHORT or LONG //UCHAR Data[]; // Data to write to mailslot } SMB_TRANSACT_MAILSLOT; typedef SMB_TRANSACT_MAILSLOT SMB_UNALIGNED *PSMB_TRANSACT_MAILSLOT;
typedef struct _SMB_TRANSACT_NAMED_PIPE { UCHAR WordCount; // Count of data bytes; value = 16 _USHORT( TotalParameterCount ); // Total parameter bytes being sent _USHORT( TotalDataCount ); // Total data bytes being sent _USHORT( MaxParameterCount ); // Max parameter bytes to return _USHORT( MaxDataCount ); // Max data bytes to return UCHAR MaxSetupCount; // Max setup words to return UCHAR Reserved; _USHORT( Flags ); // Additional information: // bit 0 - also disconnect TID in Tid // bit 1 - one-way transacion (no resp) _ULONG( Timeout ); _USHORT( Reserved1 ); _USHORT( ParameterCount ); // Buffer containing: //UCHAR PipeName[]; // "\PIPE\<name>0" //UCHAR Pad[] // Pad to SHORT or LONG //UCHAR Param[]; // Parameter bytes (# = ParameterCount) //UCHAR Pad1[] // Pad to SHORT or LONG //UCHAR Data[]; // Data bytes (# = DataCount) } SMB_TRANSACT_NAMED_PIPE; typedef SMB_TRANSACT_NAMED_PIPE SMB_UNALIGNED *PSMB_TRANSACT_NAMED_PIPE;
// // Transaction - QueryInformationNamedPipe, Level 1, output data format //
typedef struct _NAMED_PIPE_INFORMATION_1 { _USHORT( OutputBufferSize ); _USHORT( InputBufferSize ); UCHAR MaximumInstances; UCHAR CurrentInstances; UCHAR PipeNameLength; UCHAR PipeName[1]; } NAMED_PIPE_INFORMATION_1; typedef NAMED_PIPE_INFORMATION_1 SMB_UNALIGNED *PNAMED_PIPE_INFORMATION_1;
// // Transaction - PeekNamedPipe, output format //
typedef struct _RESP_PEEK_NMPIPE { _USHORT( ReadDataAvailable ); _USHORT( MessageLength ); _USHORT( NamedPipeState ); //UCHAR Pad[]; //UCHAR Data[]; } RESP_PEEK_NMPIPE; typedef RESP_PEEK_NMPIPE SMB_UNALIGNED *PRESP_PEEK_NMPIPE;
// // Define SMB pipe handle state bits used by Query/SetNamedPipeHandleState // // These number are the bit location of the fields in the handle state. //
#define PIPE_COMPLETION_MODE_BITS 15 #define PIPE_PIPE_END_BITS 14 #define PIPE_PIPE_TYPE_BITS 10 #define PIPE_READ_MODE_BITS 8 #define PIPE_MAXIMUM_INSTANCES_BITS 0
/* DosPeekNmPipe() pipe states */
#define PIPE_STATE_DISCONNECTED 0x0001 #define PIPE_STATE_LISTENING 0x0002 #define PIPE_STATE_CONNECTED 0x0003 #define PIPE_STATE_CLOSING 0x0004
/* DosCreateNPipe and DosQueryNPHState state */
#define SMB_PIPE_READMODE_BYTE 0x0000 #define SMB_PIPE_READMODE_MESSAGE 0x0100 #define SMB_PIPE_TYPE_BYTE 0x0000 #define SMB_PIPE_TYPE_MESSAGE 0x0400 #define SMB_PIPE_END_CLIENT 0x0000 #define SMB_PIPE_END_SERVER 0x4000 #define SMB_PIPE_WAIT 0x0000 #define SMB_PIPE_NOWAIT 0x8000 #define SMB_PIPE_UNLIMITED_INSTANCES 0x00FF
// // Pipe name string for conversion between SMB and NT formats. //
#define SMB_PIPE_PREFIX "\\PIPE" #define UNICODE_SMB_PIPE_PREFIX L"\\PIPE" #define CANONICAL_PIPE_PREFIX "PIPE\\" #define NT_PIPE_PREFIX L"\\Device\\NamedPipe"
#define SMB_PIPE_PREFIX_LENGTH (sizeof(SMB_PIPE_PREFIX) - 1) #define UNICODE_SMB_PIPE_PREFIX_LENGTH \ (sizeof(UNICODE_SMB_PIPE_PREFIX) - sizeof(WCHAR)) #define CANONICAL_PIPE_PREFIX_LENGTH (sizeof(CANONICAL_PIPE_PREFIX) - 1) #define NT_PIPE_PREFIX_LENGTH (sizeof(NT_PIPE_PREFIX) - sizeof(WCHAR))
// // Mailslot name strings. //
#define SMB_MAILSLOT_PREFIX "\\MAILSLOT" #define UNICODE_SMB_MAILSLOT_PREFIX L"\\MAILSLOT"
#define SMB_MAILSLOT_PREFIX_LENGTH (sizeof(SMB_MAILSLOT_PREFIX) - 1) #define UNICODE_SMB_MAILSLOT_PREFIX_LENGTH \ (sizeof(UNICODE_SMB_MAILSLOT_PREFIX) - sizeof(WCHAR))
// // NT Transaction subfunctions //
#ifdef INCLUDE_SMB_OPEN_CLOSE
typedef struct _REQ_CREATE_WITH_SD_OR_EA { _ULONG( Flags ); // Creation flags NT_CREATE_xxx _ULONG( RootDirectoryFid ); // Optional directory for relative open ACCESS_MASK DesiredAccess; // Desired access (NT format) LARGE_INTEGER AllocationSize; // The initial allocation size in bytes _ULONG( FileAttributes ); // The file attributes _ULONG( ShareAccess ); // The share access _ULONG( CreateDisposition ); // Action to take if file exists or not _ULONG( CreateOptions ); // Options for creating a new file _ULONG( SecurityDescriptorLength );// Length of SD in bytes _ULONG( EaLength ); // Length of EA in bytes _ULONG( NameLength ); // Length of name in characters _ULONG( ImpersonationLevel ); // Security QOS information UCHAR SecurityFlags; // Security QOS information UCHAR Buffer[1]; //UCHAR Name[]; // The name of the file (not NUL terminated) } REQ_CREATE_WITH_SD_OR_EA; typedef REQ_CREATE_WITH_SD_OR_EA SMB_UNALIGNED *PREQ_CREATE_WITH_SD_OR_EA;
// // Data format: // UCHAR SecurityDesciptor[]; // UCHAR Pad1[]; // Pad to LONG // UCHAR EaList[]; //
typedef struct _RESP_CREATE_WITH_SD_OR_EA { UCHAR OplockLevel; // The oplock level granted union { UCHAR Reserved; UCHAR ExtendedResponse; // set to zero for standard response }; _USHORT( Fid ); // The file ID _ULONG( CreateAction ); // The action taken _ULONG( EaErrorOffset ); // Offset of the EA error TIME CreationTime; // The time the file was created TIME LastAccessTime; // The time the file was accessed TIME LastWriteTime; // The time the file was last written TIME ChangeTime; // The time the file was last changed _ULONG( FileAttributes ); // The file attributes LARGE_INTEGER AllocationSize; // The number of byes allocated LARGE_INTEGER EndOfFile; // The end of file offset _USHORT( FileType ); _USHORT( DeviceState ); // state of IPC device (e.g. pipe) BOOLEAN Directory; // TRUE if this is a directory } RESP_CREATE_WITH_SD_OR_EA; typedef RESP_CREATE_WITH_SD_OR_EA SMB_UNALIGNED *PRESP_CREATE_WITH_SD_OR_EA;
// No data bytes for the response
typedef struct _RESP_EXTENDED_CREATE_WITH_SD_OR_EA { UCHAR OplockLevel; // The oplock level granted UCHAR ExtendedResponse; // set to 1 for Extended response _USHORT( Fid ); // The file ID _ULONG( CreateAction ); // The action taken _ULONG( EaErrorOffset ); // Offset of the EA error TIME CreationTime; // The time the file was created TIME LastAccessTime; // The time the file was accessed TIME LastWriteTime; // The time the file was last written TIME ChangeTime; // The time the file was last changed _ULONG( FileAttributes ); // The file attributes LARGE_INTEGER AllocationSize; // The number of byes allocated LARGE_INTEGER EndOfFile; // The end of file offset _USHORT( FileType ); _USHORT( DeviceState ); // state of IPC device (e.g. pipe) BOOLEAN Directory; // TRUE if this is a directory UCHAR VolumeGuid[16]; // the volume GUID UCHAR FileId[8]; // the file id _ULONG ( MaximalAccessRights ); // the access rights for the session owner _ULONG ( GuestMaximalAccessRights ); // the maximal access rights for guest } RESP_EXTENDED_CREATE_WITH_SD_OR_EA; typedef RESP_EXTENDED_CREATE_WITH_SD_OR_EA SMB_UNALIGNED *PRESP_EXTENDED_CREATE_WITH_SD_OR_EA;
#ifdef INCLUDE_SMB_IFMODIFIED
typedef struct _RESP_EXTENDED_CREATE_WITH_SD_OR_EA2 { UCHAR OplockLevel; // The oplock level granted UCHAR ExtendedResponse; // set to 1 for Extended response _USHORT( Fid ); // The file ID _ULONG( CreateAction ); // The action taken _ULONG( EaErrorOffset ); // Offset of the EA error TIME CreationTime; // The time the file was created TIME LastAccessTime; // The time the file was accessed TIME LastWriteTime; // The time the file was last written TIME ChangeTime; // The time the file was last changed _ULONG( FileAttributes ); // The file attributes LARGE_INTEGER AllocationSize; // The number of byes allocated LARGE_INTEGER EndOfFile; // The end of file offset _USHORT( FileType ); _USHORT( DeviceState ); // state of IPC device (e.g. pipe) BOOLEAN Directory; // TRUE if this is a directory UCHAR VolumeGuid[16]; // the volume GUID UCHAR FileId[8]; // the file id _ULONG ( MaximalAccessRights ); // the access rights for the session owner _ULONG ( GuestMaximalAccessRights ); // the maximal access rights for guest
// below here is where it differs from RESP_EXTENDED_CREATE_WITH_SD_OR_EA
LARGE_INTEGER UsnValue; // The file's USN # in NTFS LARGE_INTEGER FileReferenceNumber; // WCHAR ShortName[13]; // if not present, empty string.
_USHORT( ByteCount ); // length of long name WCHAR Buffer[1]; // long name goes here
} RESP_EXTENDED_CREATE_WITH_SD_OR_EA2; typedef RESP_EXTENDED_CREATE_WITH_SD_OR_EA2 SMB_UNALIGNED *PRESP_EXTENDED_CREATE_WITH_SD_OR_EA2;
#endif // def INCLUDE_SMB_IFMODIFIED
// No data bytes for the response
#endif // INCLUDE_SMB_OPEN_CLOSE
// // Setup words for NT I/O control request //
typedef struct _REQ_NT_IO_CONTROL { _ULONG( FunctionCode ); _USHORT( Fid ); BOOLEAN IsFsctl; UCHAR IsFlags; } REQ_NT_IO_CONTROL; typedef REQ_NT_IO_CONTROL SMB_UNALIGNED *PREQ_NT_IO_CONTROL;
// // Request parameter bytes - The first buffer // Request data bytes - The second buffer //
// // NT I/O Control response: // // Setup Words: None. // Parameter Bytes: First buffer. // Data Bytes: Second buffer. //
// // NT Notify directory change //
// Request Setup Words
typedef struct _REQ_NOTIFY_CHANGE { _ULONG( CompletionFilter ); // Specifies operation to monitor _USHORT( Fid ); // Fid of directory to monitor BOOLEAN WatchTree; // TRUE = watch all subdirectories too UCHAR Reserved; // MBZ } REQ_NOTIFY_CHANGE; typedef REQ_NOTIFY_CHANGE SMB_UNALIGNED *PREQ_NOTIFY_CHANGE;
// // Request parameter bytes: None // Request data bytes: None //
// // NT Notify directory change response // // Setup words: None. // Parameter bytes: The change data buffer. // Data bytes: None. //
// // NT Set Security Descriptor request // // Setup words: REQ_SET_SECURITY_DESCIPTOR. // Parameter Bytes: None. // Data Bytes: The Security Descriptor data. //
typedef struct _REQ_SET_SECURITY_DESCRIPTOR { _USHORT( Fid ); // FID of target _USHORT( Reserved ); // MBZ _ULONG( SecurityInformation ); // Fields of SD that to set } REQ_SET_SECURITY_DESCRIPTOR; typedef REQ_SET_SECURITY_DESCRIPTOR SMB_UNALIGNED *PREQ_SET_SECURITY_DESCRIPTOR;
// // NT Set Security Desciptor response // // Setup words: None. // Parameter Bytes: None. // Data Bytes: None. //
// // NT Query Security Descriptor request // // Setup words: None. // Parameter Bytes: REQ_QUERY_SECURITY_DESCRIPTOR. // Data Bytes: None. //
typedef struct _REQ_QUERY_SECURITY_DESCRIPTOR { _USHORT( Fid ); // FID of target _USHORT( Reserved ); // MBZ _ULONG( SecurityInformation ); // Fields of SD that to query } REQ_QUERY_SECURITY_DESCRIPTOR; typedef REQ_QUERY_SECURITY_DESCRIPTOR SMB_UNALIGNED *PREQ_QUERY_SECURITY_DESCRIPTOR;
// // NT Query Security Desciptor response // // Parameter bytes: RESP_QUERY_SECURITY_DESCRIPTOR // Data Bytes: The Security Descriptor data. //
typedef struct _RESP_QUERY_SECURITY_DESCRIPTOR { _ULONG( LengthNeeded ); // Size of data buffer required for SD } RESP_QUERY_SECURITY_DESCRIPTOR; typedef RESP_QUERY_SECURITY_DESCRIPTOR SMB_UNALIGNED *PRESP_QUERY_SECURITY_DESCRIPTOR;
// // NT Rename file // // Setup words: None // Parameters bytes: REQ_NT_RENAME // Data bytes: None //
typedef struct _REQ_NT_RENAME { _USHORT( Fid ); // FID of file to rename _USHORT( RenameFlags ); // defined below UCHAR NewName[]; // New file name. } REQ_NT_RENAME; typedef REQ_NT_RENAME SMB_UNALIGNED *PREQ_NT_RENAME;
// // Rename flags defined //
#define SMB_RENAME_REPLACE_IF_EXISTS 1
// // Turn structure packing back off //
#ifndef NO_PACKING #include <packoff.h> #endif // ndef NO_PACKING
#endif // ndef _SMBTRANS_
|