windows-nt/Source/XPSP1/NT/public/internal/base/inc/smbtrans.h
2020-09-26 16:20:57 +08:00

1105 lines
40 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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_