summaryrefslogtreecommitdiffstats
path: root/private/inc/smb.h
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/inc/smb.h
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/inc/smb.h')
-rw-r--r--private/inc/smb.h3711
1 files changed, 3711 insertions, 0 deletions
diff --git a/private/inc/smb.h b/private/inc/smb.h
new file mode 100644
index 000000000..b909dcb38
--- /dev/null
+++ b/private/inc/smb.h
@@ -0,0 +1,3711 @@
+/*++
+
+Copyright (c) 1989-1993 Microsoft Corporation
+
+Module Name:
+
+ smb.h
+
+Abstract:
+
+ This file contains request and response structure definitions
+ for the specific parameters of each SMB command, as well as codes
+ for SMB commands and errors.
+
+Author:
+
+ David R. Treadwell (davidtr) 27-Sept-1989 (from LanMan 1.2 code)
+
+Revision History:
+
+--*/
+
+#ifndef _SMB_
+#define _SMB_
+
+//#include <nt.h>
+
+//#include <smbtypes.h>
+
+
+/*
+
+Inclusion of SMB request/response structures in this file is
+conditionalized in the following way:
+
+ If INCLUDE_SMB_ALL is defined, all of the structures are defined.
+
+ Otherwise, the following names, if defined, cause inclusion of the
+ corresponding SMB categories:
+
+ INCLUDE_SMB_ADMIN Administrative requests:
+ PROCESS_EXIT
+ NEGOTIATE
+ SESSION_SETUP_ANDX
+ LOGOFF_ANDX
+
+ INCLUDE_SMB_TREE Tree connect requests:
+ TREE_CONNECT
+ TREE_DISCONNECT
+ TREE_CONNECT_ANDX
+
+ INCLUDE_SMB_DIRECTORY Directory-related requests:
+ CREATE_DIRECTORY
+ DELETE_DIRECTORY
+ CHECK_DIRECTORY
+
+ INCLUDE_SMB_OPEN_CLOSE File open and close requests:
+ OPEN
+ CREATE
+ CLOSE
+ CREATE_TEMPORARY
+ CREATE_NEW
+ OPEN_ANDX
+ CLOSE_AND_TREE_DISC
+
+ INCLUDE_SMB_READ_WRITE Read and write requests:
+ READ
+ WRITE
+ SEEK
+ LOCK_AND_READ
+ WRITE_AND_UNLOCK
+ WRITE_AND_CLOSE
+ READ_ANDX
+ WRITE_ANDX
+
+
+ INCLUDE_SMB_FILE_CONTROL File control requests:
+ FLUSH
+ DELETE
+ RENAME
+ COPY
+ MOVE
+
+ INCLUDE_SMB_QUERY_SET File query/set requests:
+ QUERY_INFORMATION
+ SET_INFORMATION
+ QUERY_INFORMATION2
+ SET_INFORMATION2
+ QUERY_PATH_INFORMATION
+ SET_PATH_INFORMATION
+ QUERY_FILE_INFORMATION
+ SET_FILE_INFORMATION
+
+ INCLUDE_SMB_LOCK Lock requests (not LOCK_AND_READ)
+ LOCK_BYTE_RANGE
+ UNLOCK_BYTE_RANGE
+ LOCKING_ANDX
+
+ INCLUDE_SMB_RAW Raw read/write requests:
+ READ_RAW
+ WRITE_RAW
+
+ INCLUDE_SMB_MPX Multiplexed requests:
+ READ_MPX
+ WRITE_MPX
+
+ INCLUDE_SMB_SEARCH Search requests:
+ FIND_CLOSE2
+ FIND_NOTIFY_CLOSE
+ SEARCH
+ FIND
+ FIND_UNIQUE
+ FIND_CLOSE
+
+ INCLUDE_SMB_TRANSACTION Transaction and IOCTL requests:
+ TRANSACTION
+ IOCTL
+ TRANSACTION2
+ NTTRANSACTION
+
+ INCLUDE_SMB_PRINT Printer requests:
+ OPEN_PRINT_FILE
+ WRITE_PRINT_FILE
+ CLOSE_PRINT_FILE
+ GET_PRINT_QUEUE
+
+ INCLUDE_SMB_MESSAGE Message requests:
+ SEND_MESSAGE
+ SEND_BROADCAST_MESSAGE
+ FORWARD_USER_NAME
+ CANCEL_FORWARD
+ GET_MACHINE_NAME
+ SEND_START_MB_MESSAGE
+ SEND_END_MB_MESSAGE
+ SEND_TEXT_MB_MESSAGE
+
+ INCLUDE_SMB_MISC Miscellaneous requests:
+ QUERY_INFORMATION_SRV
+ ECHO
+ QUERY_INFORMATION_DISK
+
+ INCLUDE_SMB_BULK
+ READ_BULK
+ WRITE_BULK
+
+*/
+
+#ifdef INCLUDE_SMB_ALL
+
+#define INCLUDE_SMB_ADMIN
+#define INCLUDE_SMB_TREE
+#define INCLUDE_SMB_DIRECTORY
+#define INCLUDE_SMB_OPEN_CLOSE
+#define INCLUDE_SMB_FILE_CONTROL
+#define INCLUDE_SMB_READ_WRITE
+#define INCLUDE_SMB_LOCK
+#define INCLUDE_SMB_RAW
+#define INCLUDE_SMB_MPX
+#define INCLUDE_SMB_QUERY_SET
+#define INCLUDE_SMB_SEARCH
+#define INCLUDE_SMB_TRANSACTION
+#define INCLUDE_SMB_PRINT
+#define INCLUDE_SMB_MESSAGE
+#define INCLUDE_SMB_MISC
+#define INCLUDE_SMB_BULK
+
+#endif // def INCLUDE_SMB_ALL
+
+
+//
+// Force misalignment of the following structures
+//
+
+#ifndef NO_PACKING
+#include <packon.h>
+#endif // ndef NO_PACKING
+
+//
+// SMB servers listen on two NETBIOS addresses to facilitate connections. The
+// first one is a name formulated from the computer name by padding it with
+// a number of blanks ( upto NETBIOS_NAME_LEN ). This name is registered and
+// resolved using the NETBIOS name registration/resolution mechanism. They also
+// register under a second name *SMBSERVER which is not a valuid netbios name
+// but provides a name which can be used in NETBT session setup. This eliminates
+// the need for querying the remote adapter status to obtain the name.
+//
+
+#define SMBSERVER_LOCAL_ENDPOINT_NAME "*SMBSERVER "
+
+//
+// SMB Command code definitions:
+//
+
+// *** Start of SMB commands
+#define SMB_COM_CREATE_DIRECTORY (UCHAR)0x00
+#define SMB_COM_DELETE_DIRECTORY (UCHAR)0x01
+#define SMB_COM_OPEN (UCHAR)0x02
+#define SMB_COM_CREATE (UCHAR)0x03
+#define SMB_COM_CLOSE (UCHAR)0x04
+#define SMB_COM_FLUSH (UCHAR)0x05
+#define SMB_COM_DELETE (UCHAR)0x06
+#define SMB_COM_RENAME (UCHAR)0x07
+#define SMB_COM_QUERY_INFORMATION (UCHAR)0x08
+#define SMB_COM_SET_INFORMATION (UCHAR)0x09
+#define SMB_COM_READ (UCHAR)0x0A
+#define SMB_COM_WRITE (UCHAR)0x0B
+#define SMB_COM_LOCK_BYTE_RANGE (UCHAR)0x0C
+#define SMB_COM_UNLOCK_BYTE_RANGE (UCHAR)0x0D
+#define SMB_COM_CREATE_TEMPORARY (UCHAR)0x0E
+#define SMB_COM_CREATE_NEW (UCHAR)0x0F
+#define SMB_COM_CHECK_DIRECTORY (UCHAR)0x10
+#define SMB_COM_PROCESS_EXIT (UCHAR)0x11
+#define SMB_COM_SEEK (UCHAR)0x12
+#define SMB_COM_LOCK_AND_READ (UCHAR)0x13
+#define SMB_COM_WRITE_AND_UNLOCK (UCHAR)0x14
+#define SMB_COM_READ_RAW (UCHAR)0x1A
+#define SMB_COM_READ_MPX (UCHAR)0x1B
+#define SMB_COM_READ_MPX_SECONDARY (UCHAR)0x1C // server to redir only
+#define SMB_COM_WRITE_RAW (UCHAR)0x1D
+#define SMB_COM_WRITE_MPX (UCHAR)0x1E
+#define SMB_COM_WRITE_MPX_SECONDARY (UCHAR)0x1F
+#define SMB_COM_WRITE_COMPLETE (UCHAR)0x20 // server to redir only
+#define SMB_COM_QUERY_INFORMATION_SRV (UCHAR)0x21
+#define SMB_COM_SET_INFORMATION2 (UCHAR)0x22
+#define SMB_COM_QUERY_INFORMATION2 (UCHAR)0x23
+#define SMB_COM_LOCKING_ANDX (UCHAR)0x24
+#define SMB_COM_TRANSACTION (UCHAR)0x25
+#define SMB_COM_TRANSACTION_SECONDARY (UCHAR)0x26
+#define SMB_COM_IOCTL (UCHAR)0x27
+#define SMB_COM_IOCTL_SECONDARY (UCHAR)0x28
+#define SMB_COM_COPY (UCHAR)0x29
+#define SMB_COM_MOVE (UCHAR)0x2A
+#define SMB_COM_ECHO (UCHAR)0x2B
+#define SMB_COM_WRITE_AND_CLOSE (UCHAR)0x2C
+#define SMB_COM_OPEN_ANDX (UCHAR)0x2D
+#define SMB_COM_READ_ANDX (UCHAR)0x2E
+#define SMB_COM_WRITE_ANDX (UCHAR)0x2F
+#define SMB_COM_CLOSE_AND_TREE_DISC (UCHAR)0x31
+#define SMB_COM_TRANSACTION2 (UCHAR)0x32
+#define SMB_COM_TRANSACTION2_SECONDARY (UCHAR)0x33
+#define SMB_COM_FIND_CLOSE2 (UCHAR)0x34
+#define SMB_COM_FIND_NOTIFY_CLOSE (UCHAR)0x35
+#define SMB_COM_TREE_CONNECT (UCHAR)0x70
+#define SMB_COM_TREE_DISCONNECT (UCHAR)0x71
+#define SMB_COM_NEGOTIATE (UCHAR)0x72
+#define SMB_COM_SESSION_SETUP_ANDX (UCHAR)0x73
+#define SMB_COM_LOGOFF_ANDX (UCHAR)0x74
+#define SMB_COM_TREE_CONNECT_ANDX (UCHAR)0x75
+#define SMB_COM_QUERY_INFORMATION_DISK (UCHAR)0x80
+#define SMB_COM_SEARCH (UCHAR)0x81
+#define SMB_COM_FIND (UCHAR)0x82
+#define SMB_COM_FIND_UNIQUE (UCHAR)0x83
+#define SMB_COM_FIND_CLOSE (UCHAR)0x84
+#define SMB_COM_NT_TRANSACT (UCHAR)0xA0
+#define SMB_COM_NT_TRANSACT_SECONDARY (UCHAR)0xA1
+#define SMB_COM_NT_CREATE_ANDX (UCHAR)0xA2
+#define SMB_COM_NT_CANCEL (UCHAR)0xA4
+#define SMB_COM_NT_RENAME (UCHAR)0xA5
+#define SMB_COM_OPEN_PRINT_FILE (UCHAR)0xC0
+#define SMB_COM_WRITE_PRINT_FILE (UCHAR)0xC1
+#define SMB_COM_CLOSE_PRINT_FILE (UCHAR)0xC2
+#define SMB_COM_GET_PRINT_QUEUE (UCHAR)0xC3
+#define SMB_COM_SEND_MESSAGE (UCHAR)0xD0
+#define SMB_COM_SEND_BROADCAST_MESSAGE (UCHAR)0xD1
+#define SMB_COM_FORWARD_USER_NAME (UCHAR)0xD2
+#define SMB_COM_CANCEL_FORWARD (UCHAR)0xD3
+#define SMB_COM_GET_MACHINE_NAME (UCHAR)0xD4
+#define SMB_COM_SEND_START_MB_MESSAGE (UCHAR)0xD5
+#define SMB_COM_SEND_END_MB_MESSAGE (UCHAR)0xD6
+#define SMB_COM_SEND_TEXT_MB_MESSAGE (UCHAR)0xD7
+#define SMB_COM_READ_BULK (UCHAR)0xD8
+#define SMB_COM_WRITE_BULK (UCHAR)0xD9
+#define SMB_COM_WRITE_BULK_DATA (UCHAR)0xDA
+// *** End of SMB commands
+
+#define SMB_COM_NO_ANDX_COMMAND (UCHAR)0xFF
+
+
+//
+// Header for SMBs, see #4 page 10
+//
+// *** Note that we do NOT define PSMB_HEADER as SMB_UNALIGNED! This is
+// done on the assumption that the SMB header, at least, will always
+// be properly aligned. If you need to access an unaligned header,
+// declare the pointer as SMB_UNALIGNED *SMB_HEADER.
+//
+
+typedef struct _SMB_HEADER {
+ UCHAR Protocol[4]; // Contains 0xFF,'SMB'
+ UCHAR Command; // Command code
+ UCHAR ErrorClass; // Error class
+ UCHAR Reserved; // Reserved for future use
+ _USHORT( Error ); // Error code
+ UCHAR Flags; // Flags
+ _USHORT( Flags2 ); // More flags
+ union {
+ _USHORT( Reserved2 )[6]; // Reserved for future use
+ struct {
+ _USHORT( PidHigh ); // High part of PID (NT Create And X)
+ _ULONG( Key ); // Encryption key (IPX)
+ _USHORT( Sid ); // Session ID (IPX)
+ _USHORT( SequenceNumber ); // Sequence number (IPX)
+ _USHORT( Gid ); // Group ID (unused?)
+ } ;
+ } ;
+ _USHORT( Tid ); // Authenticated user/group
+ _USHORT( Pid ); // Caller's process id
+ _USHORT( Uid ); // Unauthenticated user id
+ _USHORT( Mid ); // multiplex id
+#ifdef NO_PACKING // ***
+ _USHORT( Kludge ); // *** make sure parameter structs
+#endif // *** are longword aligned
+} SMB_HEADER;
+typedef SMB_HEADER *PSMB_HEADER;
+
+typedef struct _NT_SMB_HEADER {
+ UCHAR Protocol[4]; // Contains 0xFF,'SMB'
+ UCHAR Command; // Command code
+ union {
+ struct {
+ UCHAR ErrorClass; // Error class
+ UCHAR Reserved; // Reserved for future use
+ _USHORT( Error ); // Error code
+ } DosError;
+ ULONG NtStatus; // NT-style 32-bit error code
+ } Status;
+ UCHAR Flags; // Flags
+ _USHORT( Flags2 ); // More flags
+ union {
+ _USHORT( Reserved2 )[6]; // Reserved for future use
+ struct {
+ _USHORT( PidHigh ); // High part of PID (NT Create And X)
+ _ULONG( Key ); // Encryption key (IPX)
+ _USHORT( Sid ); // Session ID (IPX)
+ _USHORT( SequenceNumber ); // Sequence number (IPX)
+ _USHORT( Gid ); // Group ID (unused?)
+ } ;
+ } ;
+ _USHORT( Tid ); // Authenticated user/group
+ _USHORT( Pid ); // Caller's process id
+ _USHORT( Uid ); // Unauthenticated user id
+ _USHORT( Mid ); // multiplex id
+#ifdef NO_PACKING // ***
+ _USHORT( Kludge ); // *** make sure parameter structs
+#endif // *** are longword aligned
+} NT_SMB_HEADER;
+typedef NT_SMB_HEADER *PNT_SMB_HEADER;
+
+//
+// The SMB header, protocol field, as a long.
+//
+
+#define SMB_HEADER_PROTOCOL (0xFF + ('S' << 8) + ('M' << 16) + ('B' << 24))
+
+//
+// Minimum parameter structure that can be returned. Used in returning
+// error SMBs.
+//
+// *** Note that this structure does NOT have a Buffer field!
+//
+
+typedef struct _SMB_PARAMS {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of bytes that follow; min = 0
+} SMB_PARAMS;
+typedef SMB_PARAMS SMB_UNALIGNED *PSMB_PARAMS;
+
+//
+// Generic header for AndX commands.
+//
+
+typedef struct _GENERIC_ANDX {
+ UCHAR WordCount; // Count of parameter words
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved
+ _USHORT( AndXOffset ); // Offset (from SMB header start)
+} GENERIC_ANDX;
+typedef GENERIC_ANDX SMB_UNALIGNED *PGENERIC_ANDX;
+
+//
+// Structure used for bulk data messages.
+//
+
+typedef struct _BULK_DATA_MESSAGE {
+ _ULONG( Bid );
+ _ULONG( Data1Length );
+ _ULONG( Data1MessageOffset );
+ _ULONG( Data1BlockOffset );
+ _ULONG( Data2Length );
+ _ULONG( Data2MessageOffset );
+ _ULONG( Data2BlockOffset );
+} BULK_DATA_MESSAGE;
+typedef BULK_DATA_MESSAGE *PBULK_DATA_MESSAGE;
+
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Cancel Forward SMB, see #1 page 35
+// Function is SrvSmbCancelForward()
+// SMB_COM_CANCEL_FORWARD 0xD3
+//
+
+typedef struct _REQ_CANCEL_FORWARD {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR ForwardedName[]; // Forwarded name
+} REQ_CANCEL_FORWARD;
+typedef REQ_CANCEL_FORWARD SMB_UNALIGNED *PREQ_CANCEL_FORWARD;
+
+typedef struct _RESP_CANCEL_FORWARD {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_CANCEL_FORWARD;
+typedef RESP_CANCEL_FORWARD SMB_UNALIGNED *PRESP_CANCEL_FORWARD;
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_DIRECTORY
+
+//
+// Check Directory SMB, see #1 page 23
+// Function is SrvSmbCheckDirectory()
+// SMB_COM_CHECK_DIRECTORY 0x10
+//
+
+typedef struct _REQ_CHECK_DIRECTORY {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR DirectoryPath[]; // Directory path
+} REQ_CHECK_DIRECTORY;
+typedef REQ_CHECK_DIRECTORY SMB_UNALIGNED *PREQ_CHECK_DIRECTORY;
+
+typedef struct _RESP_CHECK_DIRECTORY {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_CHECK_DIRECTORY;
+typedef RESP_CHECK_DIRECTORY SMB_UNALIGNED *PRESP_CHECK_DIRECTORY;
+
+#endif // def INCLUDE_SMB_DIRECTORY
+
+#ifdef INCLUDE_SMB_OPEN_CLOSE
+
+//
+// Close SMB, see #1 page 10
+// Function is SrvSmbClose()
+// SMB_COM_CLOSE 0x04
+//
+
+typedef struct _REQ_CLOSE {
+ UCHAR WordCount; // Count of parameter words = 3
+ _USHORT( Fid ); // File handle
+ _ULONG( LastWriteTimeInSeconds ); // Time of last write, low and high
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_CLOSE;
+typedef REQ_CLOSE SMB_UNALIGNED *PREQ_CLOSE;
+
+typedef struct _RESP_CLOSE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_CLOSE;
+typedef RESP_CLOSE SMB_UNALIGNED *PRESP_CLOSE;
+
+#endif // def INCLUDE_SMB_OPEN_CLOSE
+
+#ifdef INCLUDE_SMB_OPEN_CLOSE
+
+//
+// Close and Tree Disconnect SMB, see #? page ??
+// Function is SrvSmbCloseAndTreeDisc
+// SMB_COM_CLOSE_AND_TREE_DISC 0x31
+//
+
+typedef struct _REQ_CLOSE_AND_TREE_DISC {
+ UCHAR WordCount; // Count of parameter words
+ _USHORT( Fid ); // File handle
+ _ULONG( LastWriteTimeInSeconds );
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_CLOSE_AND_TREE_DISC;
+typedef REQ_CLOSE_AND_TREE_DISC SMB_UNALIGNED *PREQ_CLOSE_AND_TREE_DISC;
+
+typedef struct _RESP_CLOSE_AND_TREE_DISC {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_CLOSE_AND_TREE_DISC;
+typedef RESP_CLOSE_AND_TREE_DISC SMB_UNALIGNED *PRESP_CLOSE_AND_TREE_DISC;
+
+#endif // def INCLUDE_SMB_OPEN_CLOSE
+
+#ifdef INCLUDE_SMB_PRINT
+
+//
+// Close Print Spool File SMB, see #1 page 29
+// Function is SrvSmbClosePrintSpoolFile()
+// SMB_COM_CLOSE_PRINT_FILE 0xC2
+//
+
+typedef struct _REQ_CLOSE_PRINT_FILE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Fid ); // File handle
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_CLOSE_PRINT_FILE;
+typedef REQ_CLOSE_PRINT_FILE SMB_UNALIGNED *PREQ_CLOSE_PRINT_FILE;
+
+typedef struct _RESP_CLOSE_PRINT_FILE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_CLOSE_PRINT_FILE;
+typedef RESP_CLOSE_PRINT_FILE SMB_UNALIGNED *PRESP_CLOSE_PRINT_FILE;
+
+#endif // def INCLUDE_SMB_PRINT
+
+#ifdef INCLUDE_SMB_FILE_CONTROL
+
+//
+// Copy SMB, see #2 page 23
+// Function is SrvSmbCopy()
+// SMB_COM_COPY 0x29
+//
+
+typedef struct _REQ_COPY {
+ UCHAR WordCount; // Count of parameter words = 3
+ _USHORT( Tid2 ); // Second (target) path TID
+ _USHORT( OpenFunction ); // What to do if target file exists
+ _USHORT( Flags ); // Flags to control copy operation:
+ // bit 0 - target must be a file
+ // bit 1 - target must ba a dir.
+ // bit 2 - copy target mode:
+ // 0 = binary, 1 = ASCII
+ // bit 3 - copy source mode:
+ // 0 = binary, 1 = ASCII
+ // bit 4 - verify all writes
+ // bit 5 - tree copy
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR SourceFileName[]; // pathname of source file
+ //UCHAR TargetFileName[]; // pathname of target file
+} REQ_COPY;
+typedef REQ_COPY SMB_UNALIGNED *PREQ_COPY;
+
+typedef struct _RESP_COPY {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Count ); // Number of files copied
+ _USHORT( ByteCount ); // Count of data bytes; min = 0
+ UCHAR Buffer[1]; // ASCIIZ pathname of file with error
+} RESP_COPY;
+typedef RESP_COPY SMB_UNALIGNED *PRESP_COPY;
+
+#endif // def INCLUDE_SMB_FILE_CONTROL
+
+#ifdef INCLUDE_SMB_OPEN_CLOSE
+
+//
+// Create SMB, see #1 page 9
+// Create New SMB, see #1 page 23
+// Function is SrvSmbCreate()
+// SMB_COM_CREATE 0x03
+// SMB_COM_CREATE_NEW 0x0F
+//
+
+typedef struct _REQ_CREATE {
+ UCHAR WordCount; // Count of parameter words = 3
+ _USHORT( FileAttributes ); // New file attributes
+ _ULONG( CreationTimeInSeconds ); // Creation time
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR FileName[]; // File name
+} REQ_CREATE;
+typedef REQ_CREATE SMB_UNALIGNED *PREQ_CREATE;
+
+typedef struct _RESP_CREATE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Fid ); // File handle
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_CREATE;
+typedef RESP_CREATE SMB_UNALIGNED *PRESP_CREATE;
+
+#endif // def INCLUDE_SMB_OPEN_CLOSE
+
+#ifdef INCLUDE_SMB_DIRECTORY
+
+//
+// Create Directory SMB, see #1 page 14
+// Function is SrvSmbCreateDirectory
+// SMB_COM_CREATE_DIRECTORY 0x00
+//
+
+typedef struct _REQ_CREATE_DIRECTORY {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR DirectoryName[]; // Directory name
+} REQ_CREATE_DIRECTORY;
+typedef REQ_CREATE_DIRECTORY SMB_UNALIGNED *PREQ_CREATE_DIRECTORY;
+
+typedef struct _RESP_CREATE_DIRECTORY {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_CREATE_DIRECTORY;
+typedef RESP_CREATE_DIRECTORY SMB_UNALIGNED *PRESP_CREATE_DIRECTORY;
+
+#endif // def INCLUDE_SMB_DIRECTORY
+
+#ifdef INCLUDE_SMB_OPEN_CLOSE
+
+//
+// Create Temporary SMB, see #1 page 21
+// Function is SrvSmbCreateTemporary()
+// SMB_COM_CREATE_TEMPORARY 0x0E
+//
+
+typedef struct _REQ_CREATE_TEMPORARY {
+ UCHAR WordCount; // Count of parameter words = 3
+ _USHORT( FileAttributes );
+ _ULONG( CreationTimeInSeconds );
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR DirectoryName[]; // Directory name
+} REQ_CREATE_TEMPORARY;
+typedef REQ_CREATE_TEMPORARY SMB_UNALIGNED *PREQ_CREATE_TEMPORARY;
+
+typedef struct _RESP_CREATE_TEMPORARY {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Fid ); // File handle
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR FileName[]; // File name
+} RESP_CREATE_TEMPORARY;
+typedef RESP_CREATE_TEMPORARY SMB_UNALIGNED *PRESP_CREATE_TEMPORARY;
+
+#endif // def INCLUDE_SMB_OPEN_CLOSE
+
+#ifdef INCLUDE_SMB_FILE_CONTROL
+
+//
+// Delete SMB, see #1 page 16
+// Function is SrvSmbDelete()
+// SMB_COM_DELETE 0x06
+//
+
+typedef struct _REQ_DELETE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( SearchAttributes );
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR FileName[]; // File name
+} REQ_DELETE;
+typedef REQ_DELETE SMB_UNALIGNED *PREQ_DELETE;
+
+typedef struct _RESP_DELETE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_DELETE;
+typedef RESP_DELETE SMB_UNALIGNED *PRESP_DELETE;
+
+#endif // def INCLUDE_SMB_FILE_CONTROL
+
+#ifdef INCLUDE_SMB_DIRECTORY
+
+//
+// Delete Directory SMB, see #1 page 15
+// Function is SrvSmbDeleteDirectory()
+// SMB_COM_DELETE_DIRECTORY 0x01
+//
+
+typedef struct _REQ_DELETE_DIRECTORY {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR DirectoryName[]; // Directory name
+} REQ_DELETE_DIRECTORY;
+typedef REQ_DELETE_DIRECTORY SMB_UNALIGNED *PREQ_DELETE_DIRECTORY;
+
+typedef struct _RESP_DELETE_DIRECTORY {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_DELETE_DIRECTORY;
+typedef RESP_DELETE_DIRECTORY SMB_UNALIGNED *PRESP_DELETE_DIRECTORY;
+
+#endif // def INCLUDE_SMB_DIRECTORY
+
+#ifdef INCLUDE_SMB_MISC
+
+//
+// Echo SMB, see #2 page 25
+// Function is SrvSmbEcho()
+// SMB_COM_ECHO 0x2B
+//
+
+typedef struct _REQ_ECHO {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( EchoCount ); // Number of times to echo data back
+ _USHORT( ByteCount ); // Count of data bytes; min = 4
+ UCHAR Buffer[1]; // Data to echo
+} REQ_ECHO;
+typedef REQ_ECHO SMB_UNALIGNED *PREQ_ECHO;
+
+typedef struct _RESP_ECHO {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( SequenceNumber ); // Sequence number of this echo
+ _USHORT( ByteCount ); // Count of data bytes; min = 4
+ UCHAR Buffer[1]; // Echoed data
+} RESP_ECHO;
+typedef RESP_ECHO SMB_UNALIGNED *PRESP_ECHO;
+
+#endif // def INCLUDE_SMB_MISC
+
+#ifdef INCLUDE_SMB_SEARCH
+
+//
+// Find Close2 SMB, see #3 page 54
+// Function is SrvFindClose2()
+// SMB_COM_FIND_CLOSE2 0x34
+//
+
+typedef struct _REQ_FIND_CLOSE2 {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Sid ); // Find handle
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_FIND_CLOSE2;
+typedef REQ_FIND_CLOSE2 SMB_UNALIGNED *PREQ_FIND_CLOSE2;
+
+typedef struct _RESP_FIND_CLOSE2 {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_FIND_CLOSE2;
+typedef RESP_FIND_CLOSE2 SMB_UNALIGNED *PRESP_FIND_CLOSE2;
+
+#endif // def INCLUDE_SMB_SEARCH
+
+#ifdef INCLUDE_SMB_SEARCH
+
+//
+// Find Notify Close SMB, see #3 page 53
+// Function is SrvSmbFindNotifyClose()
+// SMB_COM_FIND_NOTIFY_CLOSE 0x35
+//
+
+typedef struct _REQ_FIND_NOTIFY_CLOSE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Handle ); // Find notify handle
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_FIND_NOTIFY_CLOSE;
+typedef REQ_FIND_NOTIFY_CLOSE SMB_UNALIGNED *PREQ_FIND_NOTIFY_CLOSE;
+
+typedef struct _RESP_FIND_NOTIFY_CLOSE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_FIND_NOTIFY_CLOSE;
+typedef RESP_FIND_NOTIFY_CLOSE SMB_UNALIGNED *PRESP_FIND_NOTIFY_CLOSE;
+
+#endif // def INCLUDE_SMB_SEARCH
+
+#ifdef INCLUDE_SMB_FILE_CONTROL
+
+//
+// Flush SMB, see #1 page 11
+// Function is SrvSmbFlush()
+// SMB_COM_FLUSH 0x05
+//
+
+typedef struct _REQ_FLUSH {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Fid ); // File handle
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_FLUSH;
+typedef REQ_FLUSH SMB_UNALIGNED *PREQ_FLUSH;
+
+typedef struct _RESP_FLUSH {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_FLUSH;
+typedef RESP_FLUSH SMB_UNALIGNED *PRESP_FLUSH;
+
+#endif // def INCLUDE_SMB_FILE_CONTROL
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Forward User Name SMB, see #1 page 34
+// Function is SrvSmbForwardUserName()
+// SMB_COM_FORWARD_USER_NAME 0xD2
+//
+
+typedef struct _REQ_FORWARD_USER_NAME {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR ForwardedName[]; // Forwarded name
+} REQ_FORWARD_USER_NAME;
+typedef REQ_FORWARD_USER_NAME SMB_UNALIGNED *PREQ_FORWARD_USER_NAME;
+
+typedef struct _RESP_FORWARD_USER_NAME {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_FORWARD_USER_NAME;
+typedef RESP_FORWARD_USER_NAME SMB_UNALIGNED *PRESP_FORWARD_USER_NAME;
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Get Machine Name SMB, see #1 page 35
+// Function is SrvSmbGetMachineName()
+// SMB_COM_GET_MACHINE_NAME 0xD4
+//
+
+typedef struct _REQ_GET_MACHINE_NAME {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_GET_MACHINE_NAME;
+typedef REQ_GET_MACHINE_NAME SMB_UNALIGNED *PREQ_GET_MACHINE_NAME;
+
+typedef struct _RESP_GET_MACHINE_NAME {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR MachineName[]; // Machine name
+} RESP_GET_MACHINE_NAME;
+typedef RESP_GET_MACHINE_NAME SMB_UNALIGNED *PRESP_GET_MACHINE_NAME;
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_PRINT
+
+//
+// Get Print Queue SMB, see #1 page 29
+// Function is SrvSmbGetPrintQueue()
+// SMB_COM_GET_PRINT_QUEUE 0xC3
+//
+
+typedef struct _REQ_GET_PRINT_QUEUE {
+ UCHAR WordCount; // Count of parameter words = 2
+ _USHORT( MaxCount ); // Max number of entries to return
+ _USHORT( StartIndex ); // First queue entry to return
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_GET_PRINT_QUEUE;
+typedef REQ_GET_PRINT_QUEUE SMB_UNALIGNED *PREQ_GET_PRINT_QUEUE;
+
+typedef struct _RESP_GET_PRINT_QUEUE {
+ UCHAR WordCount; // Count of parameter words = 2
+ _USHORT( Count ); // Number of entries returned
+ _USHORT( RestartIndex ); // Index of entry after last returned
+ _USHORT( ByteCount ); // Count of data bytes; min = 3
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x01 -- Data block
+ //USHORT DataLength; // Length of data
+ //UCHAR Data[]; // Queue elements
+} RESP_GET_PRINT_QUEUE;
+typedef RESP_GET_PRINT_QUEUE SMB_UNALIGNED *PRESP_GET_PRINT_QUEUE;
+
+#endif // def INCLUDE_SMB_PRINT
+
+#ifdef INCLUDE_SMB_TRANSACTION
+
+//
+// Ioctl SMB, see #2 page 39
+// Function is SrvSmbIoctl()
+// SMB_COM_IOCTL 0x27
+// SMB_COM_IOCTL_SECONDARY 0x28
+//
+
+typedef struct _REQ_IOCTL {
+ UCHAR WordCount; // Count of parameter words = 14
+ _USHORT( Fid ); // File handle
+ _USHORT( Category ); // Device category
+ _USHORT( Function ); // Device function
+ _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
+ _ULONG( Timeout );
+ _USHORT( Reserved );
+ _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
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad1[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} REQ_IOCTL;
+typedef REQ_IOCTL SMB_UNALIGNED *PREQ_IOCTL;
+
+typedef struct _RESP_IOCTL_INTERIM {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_IOCTL_INTERIM;
+typedef RESP_IOCTL_INTERIM SMB_UNALIGNED *PRESP_IOCTL_INTERIM;
+
+typedef struct _REQ_IOCTL_SECONDARY {
+ UCHAR WordCount; // Count of parameter words = 8
+ _USHORT( TotalParameterCount ); // Total parameter bytes being sent
+ _USHORT( TotalDataCount ); // Total data bytes being sent
+ _USHORT( ParameterCount ); // Parameter bytes sent this buffer
+ _USHORT( ParameterOffset ); // Offset (from header start) to params
+ _USHORT( ParameterDisplacement ); // Displacement of these param bytes
+ _USHORT( DataCount ); // Data bytes sent this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( DataDisplacement ); // Displacement of these data bytes
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad1[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} REQ_IOCTL_SECONDARY;
+typedef REQ_IOCTL_SECONDARY SMB_UNALIGNED *PREQ_IOCTL_SECONDARY;
+
+typedef struct _RESP_IOCTL {
+ UCHAR WordCount; // Count of parameter words = 8
+ _USHORT( TotalParameterCount ); // Total parameter bytes being sent
+ _USHORT( TotalDataCount ); // Total data bytes being sent
+ _USHORT( ParameterCount ); // Parameter bytes sent this buffer
+ _USHORT( ParameterOffset ); // Offset (from header start) to params
+ _USHORT( ParameterDisplacement ); // Displacement of these param bytes
+ _USHORT( DataCount ); // Data bytes sent this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( DataDisplacement ); // Displacement of these data bytes
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad1[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} RESP_IOCTL;
+typedef RESP_IOCTL SMB_UNALIGNED *PRESP_IOCTL;
+
+#endif // def INCLUDE_SMB_TRANSACTION
+
+#ifdef INCLUDE_SMB_LOCK
+
+//
+// Lock Byte Range SMB, see #1 page 20
+// Function is SrvSmbLockByteRange()
+// SMB_COM_LOCK_BYTE_RANGE 0x0C
+//
+
+typedef struct _REQ_LOCK_BYTE_RANGE {
+ UCHAR WordCount; // Count of parameter words = 5
+ _USHORT( Fid ); // File handle
+ _ULONG( Count ); // Count of bytes to lock
+ _ULONG( Offset ); // Offset from start of file
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_LOCK_BYTE_RANGE;
+typedef REQ_LOCK_BYTE_RANGE SMB_UNALIGNED *PREQ_LOCK_BYTE_RANGE;
+
+typedef struct _RESP_LOCK_BYTE_RANGE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_LOCK_BYTE_RANGE;
+typedef RESP_LOCK_BYTE_RANGE SMB_UNALIGNED *PRESP_LOCK_BYTE_RANGE;
+
+#endif // def INCLUDE_SMB_LOCK
+
+#ifdef INCLUDE_SMB_LOCK
+
+//
+// Locking and X SMB, see #2 page 46
+// Function is SrvLockingAndX()
+// SMB_COM_LOCKING_ANDX 0x24
+//
+
+typedef struct _REQ_LOCKING_ANDX {
+ UCHAR WordCount; // Count of parameter words = 8
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Fid ); // File handle
+
+ //
+ // When NT protocol is not negotiated the OplockLevel field is
+ // omitted, and LockType field is a full word. Since the upper
+ // bits of LockType are never used, this definition works for
+ // all protocols.
+ //
+
+ UCHAR( LockType ); // Locking mode:
+ // bit 0: 0 = lock out all access
+ // 1 = read OK while locked
+ // bit 1: 1 = 1 user total file unlock
+ UCHAR( OplockLevel ); // The new oplock level
+ _ULONG( Timeout );
+ _USHORT( NumberOfUnlocks ); // Num. unlock range structs following
+ _USHORT( NumberOfLocks ); // Num. lock range structs following
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //LOCKING_ANDX_RANGE Unlocks[]; // Unlock ranges
+ //LOCKING_ANDX_RANGE Locks[]; // Lock ranges
+} REQ_LOCKING_ANDX;
+typedef REQ_LOCKING_ANDX SMB_UNALIGNED *PREQ_LOCKING_ANDX;
+
+#define LOCKING_ANDX_SHARED_LOCK 0x01
+#define LOCKING_ANDX_OPLOCK_RELEASE 0x02
+#define LOCKING_ANDX_CHANGE_LOCKTYPE 0x04
+#define LOCKING_ANDX_CANCEL_LOCK 0x08
+#define LOCKING_ANDX_LARGE_FILES 0x10
+
+#define OPLOCK_BROKEN_TO_NONE 0
+#define OPLOCK_BROKEN_TO_II 1
+
+typedef struct _LOCKING_ANDX_RANGE {
+ _USHORT( Pid ); // PID of process "owning" lock
+ _ULONG( Offset ); // Ofset to bytes to [un]lock
+ _ULONG( Length ); // Number of bytes to [un]lock
+} LOCKING_ANDX_RANGE;
+typedef LOCKING_ANDX_RANGE SMB_UNALIGNED *PLOCKING_ANDX_RANGE;
+
+typedef struct _NT_LOCKING_ANDX_RANGE {
+ _USHORT( Pid ); // PID of process "owning" lock
+ _USHORT( Pad ); // Pad to DWORD align (mbz)
+ _ULONG( OffsetHigh ); // Ofset to bytes to [un]lock (high)
+ _ULONG( OffsetLow ); // Ofset to bytes to [un]lock (low)
+ _ULONG( LengthHigh ); // Number of bytes to [un]lock (high)
+ _ULONG( LengthLow ); // Number of bytes to [un]lock (low)
+} NTLOCKING_ANDX_RANGE;
+typedef NTLOCKING_ANDX_RANGE SMB_UNALIGNED *PNTLOCKING_ANDX_RANGE;
+ //
+typedef struct _RESP_LOCKING_ANDX {
+ UCHAR WordCount; // Count of parameter words = 2
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_LOCKING_ANDX;
+typedef RESP_LOCKING_ANDX SMB_UNALIGNED *PRESP_LOCKING_ANDX;
+
+#define LOCK_BROKEN_SIZE 51 // # of bytes in lock broken notify
+
+#endif // def INCLUDE_SMB_LOCK
+
+#ifdef INCLUDE_SMB_ADMIN
+
+//
+// Logoff and X SMB, see #3, page 55
+// SMB_COM_LOGOFF_ANDX 0x74
+//
+
+typedef struct _REQ_LOGOFF_ANDX {
+ UCHAR WordCount; // Count of parameter words = 2
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_LOGOFF_ANDX;
+typedef REQ_LOGOFF_ANDX SMB_UNALIGNED *PREQ_LOGOFF_ANDX;
+
+typedef struct _RESP_LOGOFF_ANDX {
+ UCHAR WordCount; // Count of parameter words = 2
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_LOGOFF_ANDX;
+typedef RESP_LOGOFF_ANDX SMB_UNALIGNED *PRESP_LOGOFF_ANDX;
+
+#endif // def INCLUDE_SMB_ADMIN
+
+#ifdef INCLUDE_SMB_FILE_CONTROL
+
+//
+// Move SMB, see #2 page 49
+// Funcion is SrvSmbMove()
+// SMB_COM_MOVE 0x2A
+//
+
+typedef struct _REQ_MOVE {
+ UCHAR WordCount; // Count of parameter words = 3
+ _USHORT( Tid2 ); // Second (target) file id
+ _USHORT( OpenFunction ); // what to do if target file exists
+ _USHORT( Flags ); // Flags to control move operations:
+ // 0 - target must be a file
+ // 1 - target must be a directory
+ // 2 - reserved (must be 0)
+ // 3 - reserved (must be 0)
+ // 4 - verify all writes
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR OldFileName[]; // Old file name
+ //UCHAR NewFileName[]; // New file name
+} REQ_MOVE;
+typedef REQ_MOVE SMB_UNALIGNED *PREQ_MOVE;
+
+typedef struct _RESP_MOVE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Count ); // Number of files moved
+ _USHORT( ByteCount ); // Count of data bytes; min = 0
+ UCHAR Buffer[1]; // Pathname of file where error occurred
+} RESP_MOVE;
+typedef RESP_MOVE SMB_UNALIGNED *PRESP_MOVE;
+
+#endif // def INCLUDE_SMB_FILE_CONTROL
+
+#ifdef INCLUDE_SMB_ADMIN
+
+//
+// Negotiate SMB's for Net 1 and Net 3, see #1 page 25 and #2 page 20
+// Function is SrvSmbNegotiate()
+// SMB_COM_NEGOTIATE 0x72
+//
+
+typedef struct _REQ_NEGOTIATE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //struct {
+ // UCHAR BufferFormat; // 0x02 -- Dialect
+ // UCHAR DialectName[]; // ASCIIZ
+ //} Dialects[];
+} REQ_NEGOTIATE;
+typedef REQ_NEGOTIATE *PREQ_NEGOTIATE; // *** NOT SMB_UNALIGNED!
+
+typedef struct _RESP_NEGOTIATE {
+ UCHAR WordCount; // Count of parameter words = 13
+ _USHORT( DialectIndex ); // Index of selected dialect
+ _USHORT( SecurityMode ); // Security mode:
+ // bit 0: 0 = share, 1 = user
+ // bit 1: 1 = encrypt passwords
+ _USHORT( MaxBufferSize ); // Max transmit buffer size
+ _USHORT( MaxMpxCount ); // Max pending multiplexed requests
+ _USHORT( MaxNumberVcs ); // Max VCs between client and server
+ _USHORT( RawMode ); // Raw modes supported:
+ // bit 0: 1 = Read Raw supported
+ // bit 1: 1 = Write Raw supported
+ _ULONG( SessionKey );
+ SMB_TIME ServerTime; // Current time at server
+ SMB_DATE ServerDate; // Current date at server
+ _USHORT( ServerTimeZone ); // Current time zone at server
+ _USHORT( EncryptionKeyLength ); // MBZ if this is not LM2.1
+ _USHORT( Reserved ); // MBZ
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Password encryption key
+ //UCHAR EncryptionKey[]; // The challenge encryption key
+ //UCHAR PrimaryDomain[]; // The server's primary domain (2.1 only)
+} RESP_NEGOTIATE;
+typedef RESP_NEGOTIATE *PRESP_NEGOTIATE; // *** NOT SMB_UNALIGNED!
+
+// Macros for SecurityMode field, above
+#define NEGOTIATE_USER_SECURITY 1
+#define NEGOTIATE_ENCRYPT_PASSWORDS 2
+
+// Macros for RawMode field, above
+#define NEGOTIATE_READ_RAW_SUPPORTED 1
+#define NEGOTIATE_WRITE_RAW_SUPPORTED 2
+
+typedef struct _RESP_OLD_NEGOTIATE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( DialectIndex ); // Index of selected dialect
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_OLD_NEGOTIATE;
+typedef RESP_OLD_NEGOTIATE *PRESP_OLD_NEGOTIATE; // *** NOT SMB_UNALIGNED!
+
+typedef struct _RESP_NT_NEGOTIATE {
+ UCHAR WordCount; // Count of parameter words = 17
+ _USHORT( DialectIndex ); // Index of selected dialect
+ UCHAR( SecurityMode ); // Security mode:
+ // bit 0: 0 = share, 1 = user
+ // bit 1: 1 = encrypt passwords
+ _USHORT( MaxMpxCount ); // Max pending multiplexed requests
+ _USHORT( MaxNumberVcs ); // Max VCs between client and server
+ _ULONG( MaxBufferSize ); // Max transmit buffer size
+ _ULONG( MaxRawSize ); // Maximum raw buffer size
+ _ULONG( SessionKey );
+ _ULONG( Capabilities ); // Server capabilities
+ _ULONG( SystemTimeLow ); // System (UTC) time of the server (low).
+ _ULONG( SystemTimeHigh ); // System (UTC) time of the server (high).
+ _USHORT( ServerTimeZone ); // Time zone of server (min from UTC)
+ UCHAR( EncryptionKeyLength ); // Length of encryption key.
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Password encryption key
+ //UCHAR EncryptionKey[]; // The challenge encryption key
+ //UCHAR OemDomainName[]; // The name of the domain (in OEM chars)
+} RESP_NT_NEGOTIATE;
+typedef RESP_NT_NEGOTIATE *PRESP_NT_NEGOTIATE; // *** NOT SMB_UNALIGNED!
+
+#endif // def INCLUDE_SMB_ADMIN
+
+//
+// Server / workstation capabilities
+// N.B. Most messages use a ULONG for this, so there are many more
+// bits available.
+//
+
+#define CAP_RAW_MODE 0x0001
+#define CAP_MPX_MODE 0x0002
+#define CAP_UNICODE 0x0004
+#define CAP_LARGE_FILES 0x0008
+#define CAP_NT_SMBS 0x0010
+#define CAP_RPC_REMOTE_APIS 0x0020
+#define CAP_NT_STATUS 0x0040
+#define CAP_LEVEL_II_OPLOCKS 0x0080
+#define CAP_LOCK_AND_READ 0x0100
+#define CAP_NT_FIND 0x0200
+#define CAP_BULK_TRANSFER 0x0400
+#define CAP_COMPRESSED_DATA 0x0800
+#define CAP_DFS 0x1000 // This server is DFS aware
+#define CAP_QUADWORD_ALIGNED 0x2000 // NT dir info level responses are quad aligned
+#define CAP_LARGE_READX 0x4000 // Server supports oversized READ&X on files
+
+#ifdef INCLUDE_SMB_OPEN_CLOSE
+
+//
+// Open SMB, see #1, page 7
+// Function is SrvSmbOpen()
+// SMB_COM_OPEN 0x02
+//
+
+typedef struct _REQ_OPEN {
+ UCHAR WordCount; // Count of parameter words = 2
+ _USHORT( DesiredAccess ); // Mode - read/write/share
+ _USHORT( SearchAttributes );
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR FileName[]; // File name
+} REQ_OPEN;
+typedef REQ_OPEN SMB_UNALIGNED *PREQ_OPEN;
+
+typedef struct _RESP_OPEN {
+ UCHAR WordCount; // Count of parameter words = 7
+ _USHORT( Fid ); // File handle
+ _USHORT( FileAttributes );
+ _ULONG( LastWriteTimeInSeconds );
+ _ULONG( DataSize ); // File size
+ _USHORT( GrantedAccess ); // Access allowed
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_OPEN;
+typedef RESP_OPEN SMB_UNALIGNED *PRESP_OPEN;
+
+#endif // def INCLUDE_SMB_OPEN_CLOSE
+
+#ifdef INCLUDE_SMB_OPEN_CLOSE
+
+//
+// Open and X SMB, see #2 page 51
+// Function is SrvOpenAndX()
+// SMB_COM_OPEN_ANDX 0x2D
+//
+
+typedef struct _REQ_OPEN_ANDX {
+ UCHAR WordCount; // Count of parameter words = 15
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _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
+ _USHORT( DesiredAccess ); // File open mode
+ _USHORT( SearchAttributes );
+ _USHORT( FileAttributes );
+ _ULONG( CreationTimeInSeconds );
+ _USHORT( OpenFunction );
+ _ULONG( AllocationSize ); // Bytes to reserve on create or truncate
+ _ULONG( Timeout ); // Max milliseconds to wait for resource
+ _ULONG( Reserved ); // Reserved (must be 0)
+ _USHORT( ByteCount ); // Count of data bytes; min = 1
+ UCHAR Buffer[1]; // File name
+} REQ_OPEN_ANDX;
+typedef REQ_OPEN_ANDX SMB_UNALIGNED *PREQ_OPEN_ANDX;
+
+typedef struct _RESP_OPEN_ANDX {
+ UCHAR WordCount; // Count of parameter words = 15
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Fid ); // File handle
+ _USHORT( FileAttributes );
+ _ULONG( LastWriteTimeInSeconds );
+ _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( Reserved ); // Reserved (must be 0)
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_OPEN_ANDX;
+typedef RESP_OPEN_ANDX SMB_UNALIGNED *PRESP_OPEN_ANDX;
+
+typedef struct _REQ_NT_CREATE_ANDX {
+ UCHAR WordCount; // Count of parameter words = 24
+ UCHAR AndXCommand; // Secondary command; 0xFF = None
+ UCHAR AndXReserved; // MBZ
+ _USHORT( AndXOffset ); // Offset to next command wordcount
+ UCHAR Reserved; // MBZ
+ _USHORT( NameLength ); // Length of Name[] in bytes
+ _ULONG( Flags ); // Create flags
+ _ULONG( RootDirectoryFid ); // If non-zero, open is relative to this directory
+ ACCESS_MASK DesiredAccess; // NT access desired
+ LARGE_INTEGER AllocationSize; // Initial allocation size
+ _ULONG( FileAttributes ); // File attributes for creation
+ _ULONG( ShareAccess ); // Type of share access
+ _ULONG( CreateDisposition ); // Action to take if file exists or not
+ _ULONG( CreateOptions ); // Options to use if creating a file
+ _ULONG( ImpersonationLevel ); // Security QOS information
+ UCHAR SecurityFlags; // Security QOS information
+ _USHORT( ByteCount ); // Length of byte parameters
+ UCHAR Buffer[1];
+ //UCHAR Name[]; // File to open or create
+} REQ_NT_CREATE_ANDX;
+typedef REQ_NT_CREATE_ANDX SMB_UNALIGNED *PREQ_NT_CREATE_ANDX;
+
+// Flag bit for Security flags
+
+#define SMB_SECURITY_DYNAMIC_TRACKING 0x01
+#define SMB_SECURITY_EFFECTIVE_ONLY 0x02
+
+typedef struct _RESP_NT_CREATE_ANDX {
+ UCHAR WordCount; // Count of parameter words = 26
+ UCHAR AndXCommand; // Secondary command; 0xFF = None
+ UCHAR AndXReserved; // MBZ
+ _USHORT( AndXOffset ); // Offset to next command wordcount
+ UCHAR OplockLevel; // The oplock level granted
+ _USHORT( Fid ); // The file ID
+ _ULONG( CreateAction ); // The action taken
+ 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
+ _USHORT( ByteCount ); // = 0
+ UCHAR Buffer[1];
+} RESP_NT_CREATE_ANDX;
+typedef RESP_NT_CREATE_ANDX SMB_UNALIGNED *PRESP_NT_CREATE_ANDX;
+
+#define SMB_OPLOCK_LEVEL_NONE 0
+#define SMB_OPLOCK_LEVEL_EXCLUSIVE 1
+#define SMB_OPLOCK_LEVEL_BATCH 2
+#define SMB_OPLOCK_LEVEL_II 3
+
+#endif // def INCLUDE_SMB_OPEN_CLOSE
+
+#ifdef INCLUDE_SMB_PRINT
+
+//
+// Open Print File SMB, see #1 page 27
+// Function is SrvSmbOpenPrintFile()
+// SMB_COM_OPEN_PRINT_FILE 0xC0
+//
+
+typedef struct _REQ_OPEN_PRINT_FILE {
+ UCHAR WordCount; // Count of parameter words = 2
+ _USHORT( SetupLength ); // Length of printer setup data
+ _USHORT( Mode ); // 0 = Text mode (DOS expands TABs)
+ // 1 = Graphics mode
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR IdentifierString[]; // Identifier string
+} REQ_OPEN_PRINT_FILE;
+typedef REQ_OPEN_PRINT_FILE SMB_UNALIGNED *PREQ_OPEN_PRINT_FILE;
+
+typedef struct _RESP_OPEN_PRINT_FILE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Fid ); // File handle
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_OPEN_PRINT_FILE;
+typedef RESP_OPEN_PRINT_FILE SMB_UNALIGNED *PRESP_OPEN_PRINT_FILE;
+
+#endif // def INCLUDE_SMB_PRINT
+
+#ifdef INCLUDE_SMB_ADMIN
+
+//
+// Process Exit SMB, see #1 page 22
+// Function is SrvSmbProcessExit()
+// SMB_COM_PROCESS_EXIT 0x11
+//
+
+typedef struct _REQ_PROCESS_EXIT {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_PROCESS_EXIT;
+typedef REQ_PROCESS_EXIT SMB_UNALIGNED *PREQ_PROCESS_EXIT;
+
+typedef struct _RESP_PROCESS_EXIT {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_PROCESS_EXIT;
+typedef RESP_PROCESS_EXIT SMB_UNALIGNED *PRESP_PROCESS_EXIT;
+
+#endif // def INCLUDE_SMB_ADMIN
+
+#ifdef INCLUDE_SMB_QUERY_SET
+
+//
+// Query Information SMB, see #1 page 18
+// Function is SrvSmbQueryInformation()
+// SMB_COM_QUERY_INFORMATION 0x08
+//
+
+typedef struct _REQ_QUERY_INFORMATION {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR FileName[]; // File name
+} REQ_QUERY_INFORMATION;
+typedef REQ_QUERY_INFORMATION SMB_UNALIGNED *PREQ_QUERY_INFORMATION;
+
+typedef struct _RESP_QUERY_INFORMATION {
+ UCHAR WordCount; // Count of parameter words = 10
+ _USHORT( FileAttributes );
+ _ULONG( LastWriteTimeInSeconds );
+ _ULONG( FileSize ); // File size
+ _USHORT( Reserved )[5]; // Reserved (must be 0)
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_QUERY_INFORMATION;
+typedef RESP_QUERY_INFORMATION SMB_UNALIGNED *PRESP_QUERY_INFORMATION;
+
+#endif // def INCLUDE_SMB_QUERY_SET
+
+#ifdef INCLUDE_SMB_QUERY_SET
+
+//
+// Query Information2 SMB, see #2 page 37
+// Function is SrvSmbQueryInformation2()
+// SMB_COM_QUERY_INFORMATION2 0x23
+//
+
+typedef struct _REQ_QUERY_INFORMATION2 {
+ UCHAR WordCount; // Count of parameter words = 2
+ _USHORT( Fid ); // File handle
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_QUERY_INFORMATION2;
+typedef REQ_QUERY_INFORMATION2 SMB_UNALIGNED *PREQ_QUERY_INFORMATION2;
+
+typedef struct _RESP_QUERY_INFORMATION2 {
+ UCHAR WordCount; // Count of parameter words = 11
+ SMB_DATE CreationDate;
+ SMB_TIME CreationTime;
+ SMB_DATE LastAccessDate;
+ SMB_TIME LastAccessTime;
+ SMB_DATE LastWriteDate;
+ SMB_TIME LastWriteTime;
+ _ULONG( FileDataSize ); // File end of data
+ _ULONG( FileAllocationSize ); // File allocation size
+ _USHORT( FileAttributes );
+ _USHORT( ByteCount ); // Count of data bytes; min = 0
+ UCHAR Buffer[1]; // Reserved buffer
+} RESP_QUERY_INFORMATION2;
+typedef RESP_QUERY_INFORMATION2 SMB_UNALIGNED *PRESP_QUERY_INFORMATION2;
+
+#endif // def INCLUDE_SMB_QUERY_SET
+
+#ifdef INCLUDE_SMB_MISC
+
+//
+// Query Information Disk SMB, see #1 page 24
+// Function is SrvSmbQueryInformationDisk()
+// SMB_COM_QUERY_INFORMATION_DISK 0x80
+//
+
+typedef struct _REQ_QUERY_INFORMATION_DISK {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_QUERY_INFORMATION_DISK;
+typedef REQ_QUERY_INFORMATION_DISK SMB_UNALIGNED *PREQ_QUERY_INFORMATION_DISK;
+
+typedef struct _RESP_QUERY_INFORMATION_DISK {
+ UCHAR WordCount; // Count of parameter words = 5
+ _USHORT( TotalUnits ); // Total allocation units per server
+ _USHORT( BlocksPerUnit ); // Blocks per allocation unit
+ _USHORT( BlockSize ); // Block size (in bytes)
+ _USHORT( FreeUnits ); // Number of free units
+ _USHORT( Reserved ); // Reserved (media identification code)
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_QUERY_INFORMATION_DISK;
+typedef RESP_QUERY_INFORMATION_DISK SMB_UNALIGNED *PRESP_QUERY_INFORMATION_DISK;
+
+#endif // def INCLUDE_SMB_MISC
+
+#ifdef INCLUDE_SMB_MISC
+
+//
+// Query Server Information SMB, see #? page ??
+// Function is SrvSmbQueryInformationServer
+// SMB_COM_QUERY_INFORMATION_SRV 0x21
+//
+
+typedef struct _REQ_QUERY_INFORMATION_SRV {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Mode );
+ _USHORT( ByteCount ); // Count of data bytes; min =
+ UCHAR Buffer[1]; //
+} REQ_QUERY_INFORMATION_SRV;
+typedef REQ_QUERY_INFORMATION_SRV SMB_UNALIGNED *PREQ_QUERY_INFORMATION_SRV;
+
+typedef struct _RESP_QUERY_INFORMATION_SRV {
+ UCHAR WordCount; // Count of parameter words = 20
+ _ULONG( smb_fsid );
+ _ULONG( BlocksPerUnit );
+ _ULONG( smb_aunits );
+ _ULONG( smb_fau );
+ _USHORT( BlockSize );
+ SMB_DATE smb_vldate;
+ SMB_TIME smb_vltime;
+ UCHAR smb_vllen;
+ UCHAR Reserved; // Reserved (must be 0)
+ _USHORT( SecurityMode );
+ _USHORT( BlockMode );
+ _ULONG( Services );
+ _USHORT( MaxTransmitSize );
+ _USHORT( MaxMpxCount );
+ _USHORT( MaxNumberVcs );
+ SMB_TIME ServerTime;
+ SMB_DATE ServerDate;
+ _USHORT( ServerTimeZone );
+ _ULONG( Reserved2 );
+ _USHORT( ByteCount ); // Count of data bytes; min =
+ UCHAR Buffer[1]; //
+} RESP_QUERY_INFORMATION_SRV;
+typedef RESP_QUERY_INFORMATION_SRV SMB_UNALIGNED *PRESP_QUERY_INFORMATION_SRV;
+
+#endif // def INCLUDE_SMB_MISC
+
+#ifdef INCLUDE_SMB_READ_WRITE
+
+//
+// Read SMB, see #1 page 12
+// Lock and Read SMB, see #2 page 44
+// SMB_COM_READ 0x0A, Function is SrvSmbRead
+// SMB_COM_LOCK_AND_READ 0x13, Function is SrvSmbLockAndRead
+//
+
+typedef struct _REQ_READ {
+ UCHAR WordCount; // Count of parameter words = 5
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Count of bytes being requested
+ _ULONG( Offset ); // Offset in file of first byte to read
+ _USHORT( Remaining ); // Estimate of bytes to read if nonzero
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_READ;
+typedef REQ_READ SMB_UNALIGNED *PREQ_READ;
+
+//
+// *** Warning: the following structure is defined the way it is to
+// ensure longword alignment of the data buffer. (This only matters
+// when packing is disabled; when packing is turned on, the right
+// thing happens no matter what.)
+//
+
+typedef struct _RESP_READ {
+ UCHAR WordCount; // Count of parameter words = 5
+ _USHORT( Count ); // Count of bytes actually returned
+ _USHORT( Reserved )[4]; // Reserved (must be 0)
+ _USHORT( ByteCount ); // Count of data bytes
+ //UCHAR Buffer[1]; // Buffer containing:
+ UCHAR BufferFormat; // 0x01 -- Data block
+ _USHORT( DataLength ); // Length of data
+ ULONG Buffer[1]; // Data
+} RESP_READ;
+typedef RESP_READ SMB_UNALIGNED *PRESP_READ;
+
+#endif // def INCLUDE_SMB_READ_WRITE
+
+#ifdef INCLUDE_SMB_READ_WRITE
+
+//
+// Read and X SMB, see #2 page 56
+// Function is SrvSmbReadAndX()
+// SMB_COM_READ_ANDX 0x2E
+//
+
+typedef struct _REQ_READ_ANDX {
+ UCHAR WordCount; // Count of parameter words = 10
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Fid ); // File handle
+ _ULONG( Offset ); // Offset in file to begin read
+ _USHORT( MaxCount ); // Max number of bytes to return
+ _USHORT( MinCount ); // Min number of bytes to return
+ _ULONG( Timeout );
+ _USHORT( Remaining ); // Bytes remaining to satisfy request
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_READ_ANDX;
+typedef REQ_READ_ANDX SMB_UNALIGNED *PREQ_READ_ANDX;
+
+typedef struct _REQ_NT_READ_ANDX {
+ UCHAR WordCount; // Count of parameter words = 12
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Fid ); // File handle
+ _ULONG( Offset ); // Offset in file to begin read
+ _USHORT( MaxCount ); // Max number of bytes to return
+ _USHORT( MinCount ); // Min number of bytes to return
+ _ULONG( Timeout );
+ _USHORT( Remaining ); // Bytes remaining to satisfy request
+ _ULONG( OffsetHigh ); // Used for NT Protocol only
+ // Upper 32 bits of offset
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_NT_READ_ANDX;
+typedef REQ_NT_READ_ANDX SMB_UNALIGNED *PREQ_NT_READ_ANDX;
+
+typedef struct _RESP_READ_ANDX {
+ UCHAR WordCount; // Count of parameter words = 12
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Remaining ); // Bytes remaining to be read
+ _USHORT( DataCompactionMode );
+ _USHORT( Reserved ); // Reserved (must be 0)
+ _USHORT( DataLength ); // Number of data bytes (min = 0)
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( Reserved2 ); // Reserved (must be 0)
+ _ULONG( Reserved3 )[2]; // Reserved (must be 0)
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (size = DataLength)
+} RESP_READ_ANDX;
+typedef RESP_READ_ANDX SMB_UNALIGNED *PRESP_READ_ANDX;
+
+#endif // def INCLUDE_SMB_READ_WRITE
+
+#ifdef INCLUDE_SMB_MPX
+
+//
+// Read Block Multiplexed SMB, see #2 page 58
+// Function is SrvSmbReadMpx()
+// SMB_COM_READ_MPX 0x1B
+// SMB_COM_READ_MPX_SECONDARY 0x1C
+//
+
+typedef struct _REQ_READ_MPX {
+ UCHAR WordCount; // Count of parameter words = 8
+ _USHORT( Fid ); // File handle
+ _ULONG( Offset ); // Offset in file to begin read
+ _USHORT( MaxCount ); // Max bytes to return (max 65535)
+ _USHORT( MinCount ); // Min bytes to return (normally 0)
+ _ULONG( Timeout );
+ _USHORT( Reserved );
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_READ_MPX;
+typedef REQ_READ_MPX SMB_UNALIGNED *PREQ_READ_MPX;
+
+typedef struct _RESP_READ_MPX {
+ UCHAR WordCount; // Count of parameter words = 8
+ _ULONG( Offset ); // Offset in file where data read
+ _USHORT( Count ); // Total bytes being returned
+ _USHORT( Remaining ); // Bytes remaining to be read (pipe/dev)
+ _USHORT( DataCompactionMode );
+ _USHORT( Reserved );
+ _USHORT( DataLength ); // Number of data bytes this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (size = DataLength)
+} RESP_READ_MPX;
+typedef RESP_READ_MPX SMB_UNALIGNED *PRESP_READ_MPX;
+
+#endif // def INCLUDE_SMB_MPX
+
+#ifdef INCLUDE_SMB_RAW
+
+//
+// Read Block Raw SMB, see #2 page 61
+// Function is SrvSmbReadRaw()
+// SMB_COM_READ_RAW 0x1A
+//
+
+typedef struct _REQ_READ_RAW {
+ UCHAR WordCount; // Count of parameter words = 8
+ _USHORT( Fid ); // File handle
+ _ULONG( Offset ); // Offset in file to begin read
+ _USHORT( MaxCount ); // Max bytes to return (max 65535)
+ _USHORT( MinCount ); // Min bytes to return (normally 0)
+ _ULONG( Timeout );
+ _USHORT( Reserved );
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_READ_RAW;
+typedef REQ_READ_RAW SMB_UNALIGNED *PREQ_READ_RAW;
+
+typedef struct _REQ_NT_READ_RAW {
+ UCHAR WordCount; // Count of parameter words = 10
+ _USHORT( Fid ); // File handle
+ _ULONG( Offset ); // Offset in file to begin read
+ _USHORT( MaxCount ); // Max bytes to return (max 65535)
+ _USHORT( MinCount ); // Min bytes to return (normally 0)
+ _ULONG( Timeout );
+ _USHORT( Reserved );
+ _ULONG( OffsetHigh ); // Used for NT Protocol only
+ // Upper 32 bits of offset
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_NT_READ_RAW;
+typedef REQ_NT_READ_RAW SMB_UNALIGNED *PREQ_NT_READ_RAW;
+
+// No response params for raw read--the response is the raw data.
+
+#endif // def INCLUDE_SMB_RAW
+
+#ifdef INCLUDE_SMB_BULK
+
+typedef enum {
+ CompressionTechnologyNone,
+ CompressionTechnologyOne
+} COMPRESSION_TECHNOLOGY_TYPE;
+
+#define READ_BULK_COMPRESSED_DATA_INFO 0x01
+
+typedef struct _REQ_READ_BULK {
+ UCHAR WordCount; // Count of parameter words = 12
+ _USHORT( Fid ); // File handle
+ UCHAR CompressionTechnology; // Compression Technology or zero
+ UCHAR Reserved; // Not used, MBZ
+ LARGE_INTEGER Offset; // Offset in file to begin read
+ _ULONG( MaxCount ); // Max bytes to return
+ _ULONG( MinCount ); // Min bytes to return (normally 0)
+ _ULONG( MessageSize ); // Max bytes to return per message
+ UCHAR Buffer[1]; // empty
+} REQ_READ_BULK;
+typedef REQ_READ_BULK SMB_UNALIGNED *PREQ_READ_BULK;
+
+typedef struct _COMPRESSION_TECHNOLOGY_1 {
+ _USHORT( CompressionFormatAndEngine ); // Compression Format
+ UCHAR CompressionUnitShift; // log2 of compression unit size
+ UCHAR ChunkShift; // log 2 of chunk size
+ _ULONG( NumberOfChunks ); // number of chunks in next field
+ _ULONG( CompressedChunkSizes )[1]; // Chunk sizes
+} COMPRESSION_TECHNOLOGY_1;
+
+typedef struct _RESP_READ_BULK {
+ UCHAR WordCount; // Count of parameter words = 12
+ UCHAR Flags; // bit 0: 1 if Compressed Data Info sent
+ UCHAR CompressionTechnology; // Compression Technology
+ _ULONG( Count ); // Bytes 'covered' by this message,
+ // since data could be compressed
+ LARGE_INTEGER( Offset ); // Offset in file for this data
+ _ULONG( DataCount ); // Data bytes, replaces ByteCount
+ _ULONG( Remaining ); // Bytes remaining to be sent
+ _USHORT( DataOffset ); // Offset from Buffer to data
+ union {
+ UCHAR Buffer[1]; // Start of data if not compressed
+ COMPRESSION_TECHNOLOGY_1 CompressedInfo1; // Compression Info
+ };
+} RESP_READ_BULK;
+typedef RESP_READ_BULK SMB_UNALIGNED *PRESP_READ_BULK;
+
+//
+// Define RESP_READ_BULK Flags
+//
+
+#define READ_BULK_COMPRESSED_DATA_INFO 0x01
+
+typedef struct _REQ_WRITE_BULK {
+ UCHAR WordCount; // Count of parameter words = 12
+ UCHAR Flags; // bit 0: 1 if write through mode
+ UCHAR CompressionTechnology; // The Compression Technology used
+ _USHORT( Fid ); // File handle
+ LARGE_INTEGER Offset; // Offset in file to begin write
+ _ULONG( TotalCount ); // Amount of data in next write message
+ _ULONG( DataCount ); // Data bytes, replaces ByteCount
+ _ULONG( MessageSize ); // Max bytes sent per message
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ union {
+ UCHAR Buffer[1]; // Empty if data is not compressed
+ COMPRESSION_TECHNOLOGY_1 CompressedInfo1; // Chunk descriptor if compressed
+ };
+} REQ_WRITE_BULK;
+typedef REQ_WRITE_BULK SMB_UNALIGNED *PREQ_WRITE_BULK;
+
+//
+// Define REQ_WRITE_BULK Flags
+//
+
+typedef struct _RESP_WRITE_BULK {
+ UCHAR WordCount; // Count of parameter words = 5
+ UCHAR Sequence; // Handle for this exchange sequence
+ UCHAR CompressionTechnology; // Send data according to this format
+ _ULONG( Length ); // Length of data client may send
+ _ULONG( MessageSize ); // Max bytes allowed per message
+ UCHAR Buffer[1]; // Empty
+} RESP_WRITE_BULK;
+typedef RESP_WRITE_BULK SMB_UNALIGNED *PRESP_WRITE_BULK;
+
+typedef struct _REQ_WRITE_BULK_DATA {
+ UCHAR WordCount; // Count of parameter words = 10
+ UCHAR Sequence; // Handle for this exchange sequence
+ UCHAR Reserved; // Not used, MBZ
+ _USHORT( Fid ); // File handle
+ _ULONG( DataCount ); // Count data bytes, replaces ByteCount
+ LARGE_INTEGER Offset; // Offset in file for this write
+ _ULONG( Remaining ); // bytes remaining to be written
+ _USHORT( ByteCount ); // Not used, not big enough = 0
+ UCHAR Buffer[1]; // Start of data/chunks
+} REQ_WRITE_BULK_DATA;
+typedef REQ_WRITE_BULK_DATA SMB_UNALIGNED *PREQ_WRITE_BULK_DATA;
+
+// There is no response to a REQ_WRITE_BULK_DATA, except on error.
+
+#endif // def INCLUDE_SMB_BULK
+
+#ifdef INCLUDE_SMB_FILE_CONTROL
+
+//
+// Rename SMB, see #1 page 17
+// Function is SrvSmbRename()
+// SMB_COM_RENAME 0x07
+//
+
+typedef struct _REQ_RENAME {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( SearchAttributes );
+ _USHORT( ByteCount ); // Count of data bytes; min = 4
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat1; // 0x04 -- ASCII
+ //UCHAR OldFileName[]; // Old file name
+ //UCHAR BufferFormat2; // 0x04 -- ASCII
+ //UCHAR NewFileName[]; // New file name
+} REQ_RENAME;
+typedef REQ_RENAME SMB_UNALIGNED *PREQ_RENAME;
+
+
+//
+// Extended NT rename SMB
+// Function is SrvSmbRename()
+// SMB_COM_NT_RENAME 0xA5
+//
+
+typedef struct _REQ_NTRENAME {
+ UCHAR WordCount; // Count of parameter words = 4
+ _USHORT( SearchAttributes );
+ _USHORT( InformationLevel );
+ _ULONG( ClusterCount );
+ _USHORT( ByteCount ); // Count of data bytes; min = 4
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat1; // 0x04 -- ASCII
+ //UCHAR OldFileName[]; // Old file name
+ //UCHAR BufferFormat2; // 0x04 -- ASCII
+ //UCHAR NewFileName[]; // New file name
+} REQ_NTRENAME;
+typedef REQ_NTRENAME SMB_UNALIGNED *PREQ_NTRENAME;
+
+typedef struct _RESP_RENAME {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_RENAME;
+typedef RESP_RENAME SMB_UNALIGNED *PRESP_RENAME;
+
+#endif // def INCLUDE_SMB_FILE_CONTROL
+
+#ifdef INCLUDE_SMB_SEARCH
+
+//
+// Search SMBs. One structure is common for both the core Search and the
+// LAN Manager 1.0 Find First/Next/Close.
+//
+// Function is SrvSmbSearch()
+//
+// Search, see #1 page 26
+// SMB_COM_SEARCH 0x81
+// FindFirst and FindNext, see #2 page 27
+// SMB_COM_FIND 0x82
+// FindUnique, see #2 page 33
+// SMB_COM_FIND_UNIQUE 0x83
+// FindClose, see #2 page 31
+// SMB_COM_FIND_CLOSE 0x84
+//
+
+typedef struct _REQ_SEARCH {
+ UCHAR WordCount; // Count of parameter words = 2
+ _USHORT( MaxCount ); // Number of dir. entries to return
+ _USHORT( SearchAttributes );
+ _USHORT( ByteCount ); // Count of data bytes; min = 5
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat1; // 0x04 -- ASCII
+ //UCHAR FileName[]; // File name, may be null
+ //UCHAR BufferFormat2; // 0x05 -- Variable block
+ //USHORT ResumeKeyLength; // Length of resume key, may be 0
+ //UCHAR SearchStatus[]; // Resume key
+} REQ_SEARCH;
+typedef REQ_SEARCH SMB_UNALIGNED *PREQ_SEARCH;
+
+typedef struct _RESP_SEARCH {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Count ); // Number of entries returned
+ _USHORT( ByteCount ); // Count of data bytes; min = 3
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x05 -- Variable block
+ //USHORT DataLength; // Length of data
+ //UCHAR Data[]; // Data
+} RESP_SEARCH;
+typedef RESP_SEARCH SMB_UNALIGNED *PRESP_SEARCH;
+
+//
+// These two structures are use to return information in the Search SMBs.
+// SMB_DIRECTORY_INFORMATION is used to return information about a file
+// that was found. In addition to the usual information about the file,
+// each of these structures contains an SMB_RESUME_KEY, which is used to
+// continue or rewind a search.
+//
+// These structures must be packed, so turn on packing if it isn't
+// already on.
+//
+
+#ifdef NO_PACKING
+#include <packon.h>
+#endif // def NO_PACKING
+
+typedef struct _SMB_RESUME_KEY {
+ UCHAR Reserved; // bit 7 - comsumer use
+ // bits 5,6 - system use (must preserve)
+ // bits 0-4 - server use (must preserve)
+ UCHAR FileName[11];
+ UCHAR Sid; // Uniquely identifies Find through Close
+ _ULONG( FileIndex ); // Reserved for server use
+ UCHAR Consumer[4]; // Reserved for comsumer use
+} SMB_RESUME_KEY;
+typedef SMB_RESUME_KEY SMB_UNALIGNED *PSMB_RESUME_KEY;
+
+typedef struct _SMB_DIRECTORY_INFORMATION {
+ SMB_RESUME_KEY ResumeKey;
+ UCHAR FileAttributes;
+ SMB_TIME LastWriteTime;
+ SMB_DATE LastWriteDate;
+ _ULONG( FileSize );
+ UCHAR FileName[13]; // ASCII, space-filled null terminated
+} SMB_DIRECTORY_INFORMATION;
+typedef SMB_DIRECTORY_INFORMATION SMB_UNALIGNED *PSMB_DIRECTORY_INFORMATION;
+
+#ifdef NO_PACKING
+#include <packoff.h>
+#endif // def NO_PACKING
+
+#endif // def INCLUDE_SMB_SEARCH
+
+#ifdef INCLUDE_SMB_READ_WRITE
+
+//
+// Seek SMB, see #1 page 14
+// Function is SrvSmbSeek
+// SMB_COM_SEEK 0x12
+//
+
+typedef struct _REQ_SEEK {
+ UCHAR WordCount; // Count of parameter words = 4
+ _USHORT( Fid ); // File handle
+ _USHORT( Mode ); // Seek mode:
+ // 0 = from start of file
+ // 1 = from current position
+ // 2 = from end of file
+ _ULONG( Offset ); // Relative offset
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_SEEK;
+typedef REQ_SEEK SMB_UNALIGNED *PREQ_SEEK;
+
+typedef struct _RESP_SEEK {
+ UCHAR WordCount; // Count of parameter words = 2
+ _ULONG( Offset ); // Offset from start of file
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_SEEK;
+typedef RESP_SEEK SMB_UNALIGNED *PRESP_SEEK;
+
+#endif // def INCLUDE_SMB_READ_WRITE
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Send Broadcast Message SMB, see #1 page 32
+// Function is SrvSmbSendBroadcastMessage()
+// SMB_COM_SEND_BROADCAST_MESSAGE 0xD1
+//
+
+typedef struct _REQ_SEND_BROADCAST_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 8
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat1; // 0x04 -- ASCII
+ //UCHAR OriginatorName[]; // Originator name (max = 15)
+ //UCHAR BufferFormat2; // 0x04 -- ASCII
+ //UCHAR DestinationName[]; // "*"
+ //UCHAR BufferFormat3; // 0x01 -- Data block
+ //USHORT DataLength; // Length of message; max = 128
+ //UCHAR Data[]; // Message
+} REQ_SEND_BROADCAST_MESSAGE;
+typedef REQ_SEND_BROADCAST_MESSAGE SMB_UNALIGNED *PREQ_SEND_BROADCAST_MESSAGE;
+
+// No response for Send Broadcast Message
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Send End of Multi-block Message SMB, see #1 page 33
+// Function is SrvSmbSendEndMbMessage()
+// SMB_COM_SEND_END_MB_MESSAGE 0xD6
+//
+
+typedef struct _REQ_SEND_END_MB_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( MessageGroupId );
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_SEND_END_MB_MESSAGE;
+typedef REQ_SEND_END_MB_MESSAGE SMB_UNALIGNED *PREQ_SEND_END_MB_MESSAGE;
+
+typedef struct _RESP_SEND_END_MB_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_SEND_END_MB_MESSAGE;
+typedef RESP_SEND_END_MB_MESSAGE SMB_UNALIGNED *PRESP_SEND_END_MB_MESSAGE;
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Send Single Block Message SMB, see #1 page 31
+// Function is SrvSmbSendMessage()
+// SMB_COM_SEND_MESSAGE 0xD0
+//
+
+typedef struct _REQ_SEND_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 7
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat1; // 0x04 -- ASCII
+ //UCHAR OriginatorName[]; // Originator name (max = 15)
+ //UCHAR BufferFormat2; // 0x04 -- ASCII
+ //UCHAR DestinationName[]; // Destination name (max = 15)
+ //UCHAR BufferFormat3; // 0x01 -- Data block
+ //USHORT DataLength; // Length of message; max = 128
+ //UCHAR Data[]; // Message
+} REQ_SEND_MESSAGE;
+typedef REQ_SEND_MESSAGE SMB_UNALIGNED *PREQ_SEND_MESSAGE;
+
+typedef struct _RESP_SEND_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_SEND_MESSAGE;
+typedef RESP_SEND_MESSAGE SMB_UNALIGNED *PRESP_SEND_MESSAGE;
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Send Start of Multi-block Message SMB, see #1 page 32
+// Function is SrvSmbSendStartMbMessage()
+// SMB_COM_SEND_START_MB_MESSAGE 0xD5
+//
+
+typedef struct _REQ_SEND_START_MB_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 0
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat1; // 0x04 -- ASCII
+ //UCHAR OriginatorName[]; // Originator name (max = 15)
+ //UCHAR BufferFormat2; // 0x04 -- ASCII
+ //UCHAR DestinationName[]; // Destination name (max = 15)
+} REQ_SEND_START_MB_MESSAGE;
+typedef REQ_SEND_START_MB_MESSAGE SMB_UNALIGNED *PREQ_SEND_START_MB_MESSAGE;
+
+typedef struct _RESP_SEND_START_MB_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( MessageGroupId );
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_SEND_START_MB_MESSAGE;
+typedef RESP_SEND_START_MB_MESSAGE SMB_UNALIGNED *PSEND_START_MB_MESSAGE;
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_MESSAGE
+
+//
+// Send Text of Multi-block Message SMB, see #1 page 33
+// Function is SrvSmbSendTextMbMessage()
+// SMB_COM_SEND_TEXT_MB_MESSAGE 0xD7
+//
+
+typedef struct _REQ_SEND_TEXT_MB_MESSAGE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( MessageGroupId );
+ _USHORT( ByteCount ); // Count of data bytes; min = 3
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x01 -- Data block
+ //USHORT DataLength; // Length of message; max = 128
+ //UCHAR Data[]; // Message
+} REQ_SEND_TEXT_MB_MESSAGE;
+typedef REQ_SEND_TEXT_MB_MESSAGE SMB_UNALIGNED *PREQ_SEND_TEXT_MB_MESSAGE;
+
+typedef struct _RESP_SEND_TEXT_MB_MESSAGE {
+ UCHAR WordCount; // Count of aprameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_SEND_TEXT_MB_MESSAGE;
+typedef RESP_SEND_TEXT_MB_MESSAGE SMB_UNALIGNED *PRESP_SEND_TEXT_MB_MESSAGE;
+
+#endif // def INCLUDE_SMB_MESSAGE
+
+#ifdef INCLUDE_SMB_ADMIN
+
+//
+// Session Setup and X SMB, see #2 page 63 and #3 page 10
+// Function is SrvSmbSessionSetupAndX()
+// SMB_COM_SESSION_SETUP_ANDX 0x73
+//
+
+typedef struct _REQ_SESSION_SETUP_ANDX {
+ UCHAR WordCount; // Count of parameter words = 10
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( MaxBufferSize ); // Consumer's maximum buffer size
+ _USHORT( MaxMpxCount ); // Actual maximum multiplexed pending requests
+ _USHORT( VcNumber ); // 0 = first (only), nonzero=additional VC number
+ _ULONG( SessionKey ); // Session key (valid iff VcNumber != 0)
+ _USHORT( PasswordLength ); // Account password size
+ _ULONG( Reserved );
+ _USHORT( ByteCount ); // Count of data bytes; min = 0
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR AccountPassword[]; // Account Password
+ //UCHAR AccountName[]; // Account Name
+ //UCHAR PrimaryDomain[]; // Client's primary domain
+ //UCHAR NativeOS[]; // Client's native operating system
+ //UCHAR NativeLanMan[]; // Client's native LAN Manager type
+} REQ_SESSION_SETUP_ANDX;
+typedef REQ_SESSION_SETUP_ANDX SMB_UNALIGNED *PREQ_SESSION_SETUP_ANDX;
+
+typedef struct _REQ_NT_SESSION_SETUP_ANDX {
+ UCHAR WordCount; // Count of parameter words = 13
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( MaxBufferSize ); // Consumer's maximum buffer size
+ _USHORT( MaxMpxCount ); // Actual maximum multiplexed pending requests
+ _USHORT( VcNumber ); // 0 = first (only), nonzero=additional VC number
+ _ULONG( SessionKey ); // Session key (valid iff VcNumber != 0)
+ _USHORT( CaseInsensitivePasswordLength ); // Account password size, ANSI
+ _USHORT( CaseSensitivePasswordLength ); // Account password size, Unicode
+ _ULONG( Reserved);
+ _ULONG( Capabilities ); // Client capabilities
+ _USHORT( ByteCount ); // Count of data bytes; min = 0
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR CaseInsensitivePassword[]; // Account Password, ANSI
+ //UCHAR CaseSensitivePassword[]; // Account Password, Unicode
+ //UCHAR AccountName[]; // Account Name
+ //UCHAR PrimaryDomain[]; // Client's primary domain
+ //UCHAR NativeOS[]; // Client's native operating system
+ //UCHAR NativeLanMan[]; // Client's native LAN Manager type
+} REQ_NT_SESSION_SETUP_ANDX;
+typedef REQ_NT_SESSION_SETUP_ANDX SMB_UNALIGNED *PREQ_NT_SESSION_SETUP_ANDX;
+
+#define SMB_SETUP_GUEST 0x0001 // Session setup as a guest
+#define SMB_SETUP_USE_LANMAN_KEY 0x0002 // Use the Lan Manager setup key.
+
+
+typedef struct _RESP_SESSION_SETUP_ANDX {
+ UCHAR WordCount; // Count of parameter words = 3
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Action ); // Request mode:
+ // bit0 = logged in as GUEST
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR NativeOS[]; // Server's native operating system
+ //UCHAR NativeLanMan[]; // Server's native LAN Manager type
+ //UCHAR PrimaryDomain[]; // Server's primary domain
+} RESP_SESSION_SETUP_ANDX;
+typedef RESP_SESSION_SETUP_ANDX SMB_UNALIGNED *PRESP_SESSION_SETUP_ANDX;
+
+#endif // def INCLUDE_SMB_ADMIN
+
+#ifdef INCLUDE_SMB_QUERY_SET
+
+//
+// Set Information SMB, see #1 page 19
+// Function is SrvSmbSetInformation()
+// SMB_COM_SET_INFORMATION 0x09
+//
+
+typedef struct _REQ_SET_INFORMATION {
+ UCHAR WordCount; // Count of parameter words = 8
+ _USHORT( FileAttributes );
+ _ULONG( LastWriteTimeInSeconds );
+ _USHORT( Reserved )[5]; // Reserved (must be 0)
+ _USHORT( ByteCount ); // Count of data bytes; min = 2
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x04 -- ASCII
+ //UCHAR FileName[]; // File name
+} REQ_SET_INFORMATION;
+typedef REQ_SET_INFORMATION SMB_UNALIGNED *PREQ_SET_INFORMATION;
+
+typedef struct _RESP_SET_INFORMATION {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_SET_INFORMATION;
+typedef RESP_SET_INFORMATION SMB_UNALIGNED *PRESP_SET_INFORMATION;
+
+#endif // def INCLUDE_SMB_QUERY_SET
+
+#ifdef INCLUDE_SMB_QUERY_SET
+
+//
+// Set Information2 SMB, see #2 page 66
+// Function is SrvSmbSetInformation2
+// SMB_COM_SET_INFORMATION2 0x22
+//
+
+typedef struct _REQ_SET_INFORMATION2 {
+ UCHAR WordCount; // Count of parameter words = 7
+ _USHORT( Fid ); // File handle
+ SMB_DATE CreationDate;
+ SMB_TIME CreationTime;
+ SMB_DATE LastAccessDate;
+ SMB_TIME LastAccessTime;
+ SMB_DATE LastWriteDate;
+ SMB_TIME LastWriteTime;
+ _USHORT( ByteCount ); // Count of data bytes; min = 0
+ UCHAR Buffer[1]; // Reserved buffer
+} REQ_SET_INFORMATION2;
+typedef REQ_SET_INFORMATION2 SMB_UNALIGNED *PREQ_SET_INFORMATION2;
+
+typedef struct _RESP_SET_INFORMATION2 {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_SET_INFORMATION2;
+typedef RESP_SET_INFORMATION2 SMB_UNALIGNED *PRESP_SET_INFORMATION2;
+
+#endif // def INCLUDE_SMB_QUERY_SET
+
+#ifdef INCLUDE_SMB_TRANSACTION
+
+//
+// Transaction and Transaction2 SMBs, see #2 page 68 and #3 page 13
+// Function is SrvSmbTransaction()
+// SMB_COM_TRANSACTION 0x25
+// SMB_COM_TRANSACTION_SECONDARY 0x26
+// SMB_COM_TRANSACTION2 0x32
+// SMB_COM_TRANSACTION2_SECONDARY 0x33
+//
+// Structures for specific transaction types are defined in smbtrans.h.
+//
+// *** The Transaction2 secondary request format includes a USHORT Fid
+// field that we ignore. We can do this because the Fid field
+// occurs at the end of the word parameters part of the request, and
+// because the rest of the request (parameter and data bytes) is
+// pointed by offset fields occurring prior to the Fid field. (The
+// Fid field was added to speed up dispatching in the OS/2 server,
+// in which different worker processes handle each Fid. The NT
+// server has only one process.)
+//
+
+typedef struct _REQ_TRANSACTION {
+ UCHAR WordCount; // Count of parameter words; value = (14 + SetupCount)
+ _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( Reserved2 );
+ _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 SetupCount; // Count of setup words
+ UCHAR Reserved3; // Reserved (pad above to word)
+ UCHAR Buffer[1]; // Buffer containing:
+ //USHORT Setup[]; // Setup words (# = SetupWordCount)
+ //USHORT ByteCount; // Count of data bytes
+ //UCHAR Name[]; // Name of transaction (NULL if Transact2)
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad1[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} REQ_TRANSACTION;
+typedef REQ_TRANSACTION SMB_UNALIGNED *PREQ_TRANSACTION;
+
+#define SMB_TRANSACTION_DISCONNECT 1
+#define SMB_TRANSACTION_NO_RESPONSE 2
+#define SMB_TRANSACTION_RECONNECTING 4
+#define SMB_TRANSACTION_DFSFILE 8
+
+typedef struct _RESP_TRANSACTION_INTERIM {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_TRANSACTION_INTERIM;
+typedef RESP_TRANSACTION_INTERIM SMB_UNALIGNED *PRESP_TRANSACTION_INTERIM;
+
+typedef struct _REQ_TRANSACTION_SECONDARY {
+ UCHAR WordCount; // Count of parameter words = 8
+ _USHORT( TotalParameterCount ); // Total parameter bytes being sent
+ _USHORT( TotalDataCount ); // Total data bytes being sent
+ _USHORT( ParameterCount ); // Parameter bytes sent this buffer
+ _USHORT( ParameterOffset ); // Offset (from header start) to params
+ _USHORT( ParameterDisplacement ); // Displacement of these param bytes
+ _USHORT( DataCount ); // Data bytes sent this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( DataDisplacement ); // Displacement of these data bytes
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad1[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} REQ_TRANSACTION_SECONDARY;
+typedef REQ_TRANSACTION_SECONDARY SMB_UNALIGNED *PREQ_TRANSACTION_SECONDARY;
+
+typedef struct _RESP_TRANSACTION {
+ UCHAR WordCount; // Count of data bytes; value = 10 + SetupCount
+ _USHORT( TotalParameterCount ); // Total parameter bytes being sent
+ _USHORT( TotalDataCount ); // Total data bytes being sent
+ _USHORT( Reserved );
+ _USHORT( ParameterCount ); // Parameter bytes sent this buffer
+ _USHORT( ParameterOffset ); // Offset (from header start) to params
+ _USHORT( ParameterDisplacement ); // Displacement of these param bytes
+ _USHORT( DataCount ); // Data bytes sent this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( DataDisplacement ); // Displacement of these data bytes
+ UCHAR SetupCount; // Count of setup words
+ UCHAR Reserved2; // Reserved (pad above to word)
+ UCHAR Buffer[1]; // Buffer containing:
+ //USHORT Setup[]; // Setup words (# = SetupWordCount)
+ //USHORT ByteCount; // Count of data bytes
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad1[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} RESP_TRANSACTION;
+typedef RESP_TRANSACTION SMB_UNALIGNED *PRESP_TRANSACTION;
+
+typedef struct _REQ_NT_TRANSACTION {
+ UCHAR WordCount; // Count of parameter words; value = (19 + SetupCount)
+ UCHAR MaxSetupCount; // Max setup words to return
+ _USHORT( Flags ); // Currently unused
+ _ULONG( TotalParameterCount ); // Total parameter bytes being sent
+ _ULONG( TotalDataCount ); // Total data bytes being sent
+ _ULONG( MaxParameterCount ); // Max parameter bytes to return
+ _ULONG( MaxDataCount ); // Max data bytes to return
+ _ULONG( ParameterCount ); // Parameter bytes sent this buffer
+ _ULONG( ParameterOffset ); // Offset (from header start) to params
+ _ULONG( DataCount ); // Data bytes sent this buffer
+ _ULONG( DataOffset ); // Offset (from header start) to data
+ UCHAR SetupCount; // Count of setup words
+ _USHORT( Function ); // The transaction function code
+ UCHAR Buffer[1];
+ //USHORT Setup[]; // Setup words (# = SetupWordCount)
+ //USHORT ByteCount; // Count of data bytes
+ //UCHAR Pad1[]; // Pad to LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad2[]; // Pad to LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} REQ_NT_TRANSACTION;
+typedef REQ_NT_TRANSACTION SMB_UNALIGNED *PREQ_NT_TRANSACTION;
+
+#define SMB_TRANSACTION_DISCONNECT 1
+#define SMB_TRANSACTION_NO_RESPONSE 2
+
+typedef struct _RESP_NT_TRANSACTION_INTERIM {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1];
+} RESP_NT_TRANSACTION_INTERIM;
+typedef RESP_NT_TRANSACTION_INTERIM SMB_UNALIGNED *PRESP_NT_TRANSACTION_INTERIM;
+
+typedef struct _REQ_NT_TRANSACTION_SECONDARY {
+ UCHAR WordCount; // Count of parameter words = 18
+ UCHAR Reserved1; // MBZ
+ _USHORT( Reserved2 ); // MBZ
+ _ULONG( TotalParameterCount ); // Total parameter bytes being sent
+ _ULONG( TotalDataCount ); // Total data bytes being sent
+ _ULONG( ParameterCount ); // Parameter bytes sent this buffer
+ _ULONG( ParameterOffset ); // Offset (from header start) to params
+ _ULONG( ParameterDisplacement ); // Displacement of these param bytes
+ _ULONG( DataCount ); // Data bytes sent this buffer
+ _ULONG( DataOffset ); // Offset (from header start) to data
+ _ULONG( DataDisplacement ); // Displacement of these data bytes
+ UCHAR Reserved3;
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1];
+ //UCHAR Pad1[]; // Pad to LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad2[]; // Pad to LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} REQ_NT_TRANSACTION_SECONDARY;
+typedef REQ_NT_TRANSACTION_SECONDARY SMB_UNALIGNED *PREQ_NT_TRANSACTION_SECONDARY;
+
+typedef struct _RESP_NT_TRANSACTION {
+ UCHAR WordCount; // Count of data bytes; value = 18 + SetupCount
+ UCHAR Reserved1;
+ _USHORT( Reserved2 );
+ _ULONG( TotalParameterCount ); // Total parameter bytes being sent
+ _ULONG( TotalDataCount ); // Total data bytes being sent
+ _ULONG( ParameterCount ); // Parameter bytes sent this buffer
+ _ULONG( ParameterOffset ); // Offset (from header start) to params
+ _ULONG( ParameterDisplacement ); // Displacement of these param bytes
+ _ULONG( DataCount ); // Data bytes sent this buffer
+ _ULONG( DataOffset ); // Offset (from header start) to data
+ _ULONG( DataDisplacement ); // Displacement of these data bytes
+ UCHAR SetupCount; // Count of setup words
+ UCHAR Buffer[1];
+ //USHORT Setup[]; // Setup words (# = SetupWordCount)
+ //USHORT ByteCount; // Count of data bytes
+ //UCHAR Pad1[]; // Pad to LONG
+ //UCHAR Parameters[]; // Parameter bytes (# = ParameterCount)
+ //UCHAR Pad2[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data bytes (# = DataCount)
+} RESP_NT_TRANSACTION;
+typedef RESP_NT_TRANSACTION SMB_UNALIGNED *PRESP_NT_TRANSACTION;
+
+#endif // def INCLUDE_SMB_TRANSACTION
+
+#ifdef INCLUDE_SMB_TREE
+
+//
+// Tree Connect SMB, see #1, page 6
+// Function is SrvSmbTreeConnect()
+// SMB_COM_TREE_CONNECT 0x70
+//
+
+typedef struct _REQ_TREE_CONNECT {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes; min = 4
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat1; // 0x04 -- ASCII
+ //UCHAR Path[]; // Server name and share name
+ //UCHAR BufferFormat2; // 0x04 -- ASCII
+ //UCHAR Password[]; // Password
+ //UCHAR BufferFormat3; // 0x04 -- ASCII
+ //UCHAR Service[]; // Service name
+} REQ_TREE_CONNECT;
+typedef REQ_TREE_CONNECT SMB_UNALIGNED *PREQ_TREE_CONNECT;
+
+typedef struct _RESP_TREE_CONNECT {
+ UCHAR WordCount; // Count of parameter words = 2
+ _USHORT( MaxBufferSize ); // Max size message the server handles
+ _USHORT( Tid ); // Tree ID
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_TREE_CONNECT;
+typedef RESP_TREE_CONNECT SMB_UNALIGNED *PRESP_TREE_CONNECT;
+
+#endif // def INCLUDE_SMB_TREE
+
+#ifdef INCLUDE_SMB_TREE
+
+//
+// Tree Connect and X SMB, see #2, page 88
+// Function is SrvSmbTreeConnectAndX()
+// SMB_COM_TREE_CONNECT_ANDX 0x75
+//
+
+typedef struct _REQ_TREE_CONNECT_ANDX {
+ UCHAR WordCount; // Count of parameter words = 4
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Flags ); // Additional information
+ // bit 0 set = disconnect Tid
+ _USHORT( PasswordLength ); // Length of Password[]
+ _USHORT( ByteCount ); // Count of data bytes; min = 3
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Password[]; // Password
+ //UCHAR Path[]; // Server name and share name
+ //UCHAR Service[]; // Service name
+} REQ_TREE_CONNECT_ANDX;
+typedef REQ_TREE_CONNECT_ANDX SMB_UNALIGNED *PREQ_TREE_CONNECT_ANDX;
+
+typedef struct _RESP_TREE_CONNECT_ANDX {
+ UCHAR WordCount; // Count of parameter words = 2
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( ByteCount ); // Count of data bytes; min = 3
+ UCHAR Buffer[1]; // Service type connected to
+} RESP_TREE_CONNECT_ANDX;
+typedef RESP_TREE_CONNECT_ANDX SMB_UNALIGNED *PRESP_TREE_CONNECT_ANDX;
+
+//
+// The response for clients that are LAN Manager 2.1 or better.
+//
+
+typedef struct _RESP_21_TREE_CONNECT_ANDX {
+ UCHAR WordCount; // Count of parameter words = 3
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( OptionalSupport ); // Optional support bits
+ _USHORT( ByteCount ); // Count of data bytes; min = 3
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Service[]; // Service type connected to
+ //UCHAR NativeFileSystem[]; // Native file system for this tree
+} RESP_21_TREE_CONNECT_ANDX;
+typedef RESP_21_TREE_CONNECT_ANDX SMB_UNALIGNED *PRESP_21_TREE_CONNECT_ANDX;
+
+#define SMB_SUPPORT_SEARCH_BITS 1
+#define SMB_SHARE_IS_IN_DFS 2
+
+#endif // def INCLUDE_SMB_TREE
+
+#ifdef INCLUDE_SMB_TREE
+
+//
+// Tree Disconnect SMB, see #1 page 7
+// Function is SrvSmbTreeDisconnect()
+// SMB_COM_TREE_DISCONNECT 0x71
+//
+
+typedef struct _REQ_TREE_DISCONNECT {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_TREE_DISCONNECT;
+typedef REQ_TREE_DISCONNECT SMB_UNALIGNED *PREQ_TREE_DISCONNECT;
+
+typedef struct _RESP_TREE_DISCONNECT {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_TREE_DISCONNECT;
+typedef RESP_TREE_DISCONNECT SMB_UNALIGNED *PRESP_TREE_DISCONNECT;
+
+#endif // def INCLUDE_SMB_TREE
+
+#ifdef INCLUDE_SMB_LOCK
+
+//
+// Unlock Byte Range SMB, see #1 page 20
+// Function is SrvSmbUnlockByteRange()
+// SMB_COM_UNLOCK_BYTE_RANGE 0x0D
+//
+
+typedef struct _REQ_UNLOCK_BYTE_RANGE {
+ UCHAR WordCount; // Count of parameter words = 5
+ _USHORT( Fid ); // File handle
+ _ULONG( Count ); // Count of bytes to unlock
+ _ULONG( Offset ); // Offset from start of file
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} REQ_UNLOCK_BYTE_RANGE;
+typedef REQ_UNLOCK_BYTE_RANGE SMB_UNALIGNED *PREQ_UNLOCK_BYTE_RANGE;
+
+typedef struct _RESP_UNLOCK_BYTE_RANGE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_UNLOCK_BYTE_RANGE;
+typedef RESP_UNLOCK_BYTE_RANGE SMB_UNALIGNED *PRESP_UNLOCK_BYTE_RANGE;
+
+#endif // def INCLUDE_SMB_LOCK
+
+#ifdef INCLUDE_SMB_READ_WRITE
+
+//
+// Write SMB, see #1 page 12
+// Write and Unlock SMB, see #2 page 92
+// Function is SrvSmbWrite()
+// SMB_COM_WRITE 0x0B
+// SMB_COM_WRITE_AND_UNLOCK 0x14
+//
+
+//
+// *** Warning: the following structure is defined the way it is to
+// ensure longword alignment of the data buffer. (This only matters
+// when packing is disabled; when packing is turned on, the right
+// thing happens no matter what.)
+//
+
+typedef struct _REQ_WRITE {
+ UCHAR WordCount; // Count of parameter words = 5
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Number of bytes to be written
+ _ULONG( Offset ); // Offset in file to begin write
+ _USHORT( Remaining ); // Bytes remaining to satisfy request
+ _USHORT( ByteCount ); // Count of data bytes
+ //UCHAR Buffer[1]; // Buffer containing:
+ UCHAR BufferFormat; // 0x01 -- Data block
+ _USHORT( DataLength ); // Length of data
+ ULONG Buffer[1]; // Data
+} REQ_WRITE;
+typedef REQ_WRITE SMB_UNALIGNED *PREQ_WRITE;
+
+typedef struct _RESP_WRITE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Count ); // Count of bytes actually written
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE;
+typedef RESP_WRITE SMB_UNALIGNED *PRESP_WRITE;
+
+#endif // def INCLUDE_SMB_READ_WRITE
+
+#ifdef INCLUDE_SMB_READ_WRITE
+
+//
+// Write and Close SMB, see #2 page 90
+// Function is SrvSmbWriteAndClose()
+// SMB_COM_WRITE_AND_CLOSE 0x2C
+//
+
+//
+// The Write and Close parameters can be 6 words long or 12 words long,
+// depending on whether it's supposed to look like a Write SMB or a
+// Write and X SMB. So we define two different structures here.
+//
+// *** Warning: the following structures are defined the way they are to
+// ensure longword alignment of the data buffer. (This only matters
+// when packing is disabled; when packing is turned on, the right
+// thing happens no matter what.)
+//
+
+typedef struct _REQ_WRITE_AND_CLOSE {
+ UCHAR WordCount; // Count of parameter words = 6
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Number of bytes to write
+ _ULONG( Offset ); // Offset in file of first byte to write
+ _ULONG( LastWriteTimeInSeconds ); // Time of last write
+ _USHORT( ByteCount ); // 1 (for pad) + value of Count
+ UCHAR Pad; // To force to doubleword boundary
+ ULONG Buffer[1]; // Data
+} REQ_WRITE_AND_CLOSE;
+typedef REQ_WRITE_AND_CLOSE SMB_UNALIGNED *PREQ_WRITE_AND_CLOSE;
+
+typedef struct _REQ_WRITE_AND_CLOSE_LONG {
+ UCHAR WordCount; // Count of parameter words = 12
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Number of bytes to write
+ _ULONG( Offset ); // Offset in file of first byte to write
+ _ULONG( LastWriteTimeInSeconds ); // Time of last write
+ _ULONG( Reserved )[3]; // Reserved, must be 0
+ _USHORT( ByteCount ); // 1 (for pad) + value of Count
+ UCHAR Pad; // To force to doubleword boundary
+ ULONG Buffer[1]; // Data
+} REQ_WRITE_AND_CLOSE_LONG;
+typedef REQ_WRITE_AND_CLOSE_LONG SMB_UNALIGNED *PREQ_WRITE_AND_CLOSE_LONG;
+
+typedef struct _RESP_WRITE_AND_CLOSE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Count ); // Count of bytes actually written
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_AND_CLOSE;
+typedef RESP_WRITE_AND_CLOSE SMB_UNALIGNED *PRESP_WRITE_AND_CLOSE;
+
+#endif // def INCLUDE_SMB_READ_WRITE
+
+#ifdef INCLUDE_SMB_READ_WRITE
+
+//
+// Write and X SMB, see #2 page 94
+// Function is SrvSmbWriteAndX()
+// SMB_COM_WRITE_ANDX 0x2F
+//
+
+typedef struct _REQ_WRITE_ANDX {
+ UCHAR WordCount; // Count of parameter words = 12
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Fid ); // File handle
+ _ULONG( Offset ); // Offset in file to begin write
+ _ULONG( Timeout );
+ _USHORT( WriteMode ); // Write mode:
+ // 0 - write through
+ // 1 - return Remaining
+ // 2 - use WriteRawNamedPipe (n. pipes)
+ // 3 - "this is the start of the msg"
+ _USHORT( Remaining ); // Bytes remaining to satisfy request
+ _USHORT( Reserved );
+ _USHORT( DataLength ); // Number of data bytes in buffer (>=0)
+ _USHORT( DataOffset ); // Offset to data bytes
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (# = DataLength)
+} REQ_WRITE_ANDX;
+typedef REQ_WRITE_ANDX SMB_UNALIGNED *PREQ_WRITE_ANDX;
+
+typedef struct _REQ_NT_WRITE_ANDX {
+ UCHAR WordCount; // Count of parameter words = 14
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Fid ); // File handle
+ _ULONG( Offset ); // Offset in file to begin write
+ _ULONG( Timeout );
+ _USHORT( WriteMode ); // Write mode:
+ // 0 - write through
+ // 1 - return Remaining
+ // 2 - use WriteRawNamedPipe (n. pipes)
+ // 3 - "this is the start of the msg"
+ _USHORT( Remaining ); // Bytes remaining to satisfy request
+ _USHORT( Reserved );
+ _USHORT( DataLength ); // Number of data bytes in buffer (>=0)
+ _USHORT( DataOffset ); // Offset to data bytes
+ _ULONG( OffsetHigh ); // Used for NT Protocol only
+ // Upper 32 bits of offset
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (# = DataLength)
+} REQ_NT_WRITE_ANDX;
+typedef REQ_NT_WRITE_ANDX SMB_UNALIGNED *PREQ_NT_WRITE_ANDX;
+
+typedef struct _RESP_WRITE_ANDX {
+ UCHAR WordCount; // Count of parameter words = 6
+ UCHAR AndXCommand; // Secondary (X) command; 0xFF = none
+ UCHAR AndXReserved; // Reserved (must be 0)
+ _USHORT( AndXOffset ); // Offset to next command WordCount
+ _USHORT( Count ); // Number of bytes written
+ _USHORT( Remaining ); // Bytes remaining to be read (pipe/dev)
+ _ULONG( Reserved );
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_ANDX;
+typedef RESP_WRITE_ANDX SMB_UNALIGNED *PRESP_WRITE_ANDX;
+
+#endif // def INCLUDE_SMB_READ_WRITE
+
+#ifdef INCLUDE_SMB_MPX
+
+//
+// Write Block Multiplexed SMB, see #2 page 97
+// Function is SrvSmbWriteMpx()
+// SMB_COM_WRITE_MPX 0x1E
+// SMB_COM_WRITE_MPX_SECONDARY 0x1F
+// SMB_COM_WRITE_MPX_COMPLETE 0x20
+//
+
+typedef struct _REQ_WRITE_MPX {
+ UCHAR WordCount; // Count of parameter words = 12
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Total bytes, including this buffer
+ _USHORT( Reserved );
+ _ULONG( Offset ); // Offset in file to begin write
+ _ULONG( Timeout );
+ _USHORT( WriteMode ); // Write mode:
+ // bit 0 - complete write to disk and
+ // send final result response
+ // bit 1 - return Remaining (pipe/dev)
+ // bit 7 - IPX datagram mode
+ union {
+ struct {
+ _USHORT( DataCompactionMode );
+ _USHORT( Reserved2 );
+ } ;
+ _ULONG( Mask ); // IPX datagram mode mask
+ } ;
+ _USHORT( DataLength ); // Number of data bytes this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (# = DataLength)
+} REQ_WRITE_MPX;
+typedef REQ_WRITE_MPX SMB_UNALIGNED *PREQ_WRITE_MPX;
+
+typedef struct _RESP_WRITE_MPX_INTERIM { // First response
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Remaining ); // Bytes ramaining to be read (pipe/dev)
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_MPX_INTERIM;
+typedef RESP_WRITE_MPX_INTERIM SMB_UNALIGNED *PRESP_WRITE_MPX_INTERIM;
+
+typedef struct _RESP_WRITE_MPX_DATAGRAM { // Response to sequenced request
+ UCHAR WordCount; // Count of parameter words = 2
+ _ULONG( Mask ); // OR of all masks received
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_MPX_DATAGRAM;
+typedef RESP_WRITE_MPX_DATAGRAM SMB_UNALIGNED *PRESP_WRITE_MPX_DATAGRAM;
+
+// Secondary request format, 0 to N of these.
+
+typedef struct _REQ_WRITE_MPX_SECONDARY {
+ UCHAR WordCount; // Count of parameter words = 8
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Total bytes to be sent
+ _ULONG( Offset ); // Offset in file to begin write
+ _ULONG( Reserved );
+ _USHORT( DataLength ); // Number of data bytes this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (# = DataLength)
+} REQ_WRITE_MPX_SECONDARY;
+typedef REQ_WRITE_MPX_SECONDARY SMB_UNALIGNED *PREQ_WRITE_MPX_SECONDARY;
+
+#endif // def INCLUDE_SMB_MPX
+
+#ifndef INCLUDE_SMB_WRITE_COMPLETE
+#ifdef INCLUDE_SMB_MPX
+#define INCLUDE_SMB_WRITE_COMPLETE
+#else
+#ifdef INCLUDE_SMB_RAW
+#define INCLUDE_SMB_WRITE_COMPLETE
+#endif
+#endif
+#endif
+
+#ifdef INCLUDE_SMB_WRITE_COMPLETE
+
+//
+// The following structure is used as the final response to both Write
+// Block Multiplexed and Write Block Raw.
+//
+
+typedef struct _RESP_WRITE_COMPLETE { // Final response; command is
+ // SMB_COM_WRITE_COMPLETE
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Count ); // Total number of bytes written
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_COMPLETE;
+typedef RESP_WRITE_COMPLETE SMB_UNALIGNED *PRESP_WRITE_COMPLETE;
+
+#endif // def INCLUDE_SMB_WRITE_COMPLETE
+
+#ifdef INCLUDE_SMB_READ_WRITE
+
+//
+// Write Print File SMB, see #1 page 29
+// Function is SrvSmbWritePrintFile()
+// SMB_COM_WRITE_PRINT_FILE 0xC1
+//
+
+typedef struct _REQ_WRITE_PRINT_FILE {
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Fid ); // File handle
+ _USHORT( ByteCount ); // Count of data bytes; min = 4
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR BufferFormat; // 0x01 -- Data block
+ //USHORT DataLength; // Length of data
+ //UCHAR Data[]; // Data
+} REQ_WRITE_PRINT_FILE;
+typedef REQ_WRITE_PRINT_FILE SMB_UNALIGNED *PREQ_WRITE_PRINT_FILE;
+
+typedef struct _RESP_WRITE_PRINT_FILE {
+ UCHAR WordCount; // Count of parameter words = 0
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_PRINT_FILE;
+typedef RESP_WRITE_PRINT_FILE SMB_UNALIGNED *PRESP_WRITE_PRINT_FILE;
+
+#endif // def INCLUDE_SMB_READ_WRITE
+
+#ifdef INCLUDE_SMB_RAW
+
+//
+// Write Block Raw SMB, see #2 page 100
+// Function is SrvSmbWriteRaw()
+// SMB_COM_WRITE_RAW 0x1D
+//
+
+typedef struct _REQ_WRITE_RAW {
+ UCHAR WordCount; // Count of parameter words = 12
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Total bytes, including this buffer
+ _USHORT( Reserved );
+ _ULONG( Offset ); // Offset in file to begin write
+ _ULONG( Timeout );
+ _USHORT( WriteMode ); // Write mode:
+ // bit 0 - complete write to disk and
+ // send final result response
+ // bit 1 - return Remaining (pipe/dev)
+ // (see WriteAndX for #defines)
+ _ULONG( Reserved2 );
+ _USHORT( DataLength ); // Number of data bytes this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (# = DataLength)
+} REQ_WRITE_RAW;
+typedef REQ_WRITE_RAW SMB_UNALIGNED *PREQ_WRITE_RAW;
+
+typedef struct _REQ_NT_WRITE_RAW {
+ UCHAR WordCount; // Count of parameter words = 14
+ _USHORT( Fid ); // File handle
+ _USHORT( Count ); // Total bytes, including this buffer
+ _USHORT( Reserved );
+ _ULONG( Offset ); // Offset in file to begin write
+ _ULONG( Timeout );
+ _USHORT( WriteMode ); // Write mode:
+ // bit 0 - complete write to disk and
+ // send final result response
+ // bit 1 - return Remaining (pipe/dev)
+ // (see WriteAndX for #defines)
+ _ULONG( Reserved2 );
+ _USHORT( DataLength ); // Number of data bytes this buffer
+ _USHORT( DataOffset ); // Offset (from header start) to data
+ _ULONG( OffsetHigh ); // Used for NT Protocol only
+ // Upper 32 bits of offset
+ _USHORT( ByteCount ); // Count of data bytes
+ UCHAR Buffer[1]; // Buffer containing:
+ //UCHAR Pad[]; // Pad to SHORT or LONG
+ //UCHAR Data[]; // Data (# = DataLength)
+} REQ_NT_WRITE_RAW;
+typedef REQ_NT_WRITE_RAW SMB_UNALIGNED *PREQ_NT_WRITE_RAW;
+
+typedef struct _RESP_WRITE_RAW_INTERIM { // First response
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Remaining ); // Bytes remaining to be read (pipe/dev)
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_RAW_INTERIM;
+typedef RESP_WRITE_RAW_INTERIM SMB_UNALIGNED *PRESP_WRITE_RAW_INTERIM;
+
+typedef struct _RESP_WRITE_RAW_SECONDARY { // Second (final) response
+ UCHAR WordCount; // Count of parameter words = 1
+ _USHORT( Count ); // Total number of bytes written
+ _USHORT( ByteCount ); // Count of data bytes = 0
+ UCHAR Buffer[1]; // empty
+} RESP_WRITE_RAW_SECONDARY;
+typedef RESP_WRITE_RAW_SECONDARY SMB_UNALIGNED *PRESP_WRITE_RAW_SECONDARY;
+
+typedef struct _REQ_103_WRITE_RAW {
+ UCHAR WordCount; // Count of parameter words
+ _USHORT( Fid ); // File handle
+ _USHORT( Count );
+ _USHORT( Reserved );
+ _ULONG( Offset );
+ _ULONG( Timeout );
+ _USHORT( WriteMode );
+ _ULONG( Reserved2 );
+ _USHORT( ByteCount ); // Count of data bytes; min =
+ UCHAR Buffer[1]; //
+} REQ_103_WRITE_RAW;
+typedef REQ_103_WRITE_RAW SMB_UNALIGNED *PREQ_103_WRITE_RAW;
+
+typedef struct _RESP_103_WRITE_RAW {
+ UCHAR WordCount; // Count of parameter words
+ _USHORT( ByteCount ); // Count of data bytes; min =
+ UCHAR Buffer[1]; //
+} RESP_103_WRITE_RAW;
+typedef RESP_103_WRITE_RAW SMB_UNALIGNED *PRESP_103_WRITE_RAW;
+
+#endif // def INCLUDE_SMB_RAW
+
+typedef struct _REQ_NT_CANCEL {
+ UCHAR WordCount; // = 0
+ _USHORT( ByteCount ); // = 0
+ UCHAR Buffer[1];
+} REQ_NT_CANCEL;
+typedef REQ_NT_CANCEL SMB_UNALIGNED *PREQ_NT_CANCEL;
+
+typedef struct _RESP_NT_CANCEL {
+ UCHAR WordCount; // = 0
+ _USHORT( ByteCount ); // = 0
+ UCHAR Buffer[1];
+} RESP_NT_CANCEL;
+typedef RESP_NT_CANCEL SMB_UNALIGNED *PRESP_NT_CANCEL;
+
+//
+// File open modes
+//
+
+#define SMB_ACCESS_READ_ONLY 0
+#define SMB_ACCESS_WRITE_ONLY 1
+#define SMB_ACCESS_READ_WRITE 2
+#define SMB_ACCESS_EXECUTE 3
+
+//
+// Open flags
+//
+
+#define SMB_OPEN_QUERY_INFORMATION 0x01
+#define SMB_OPEN_OPLOCK 0x02
+#define SMB_OPEN_OPBATCH 0x04
+#define SMB_OPEN_QUERY_EA_LENGTH 0x08
+
+//
+// NT open manifests
+//
+
+#define NT_CREATE_REQUEST_OPLOCK 0x02
+#define NT_CREATE_REQUEST_OPBATCH 0x04
+#define NT_CREATE_OPEN_TARGET_DIR 0x08
+
+#define Added 0
+#define Removed 1
+#define Modified 2
+#define RenamedOldName 3
+#define RenamedNewName 4
+
+//
+// Lockrange for use with OS/2 DosFileLocks call
+//
+
+// *** Where is this used?
+
+//typedef struct lockrange {
+// ULONG offset;
+// ULONG range;
+// };
+
+//#define LOCK 0x1
+//#define UNLOCK 0x2
+
+//
+// Data buffer format codes, from the core protocol.
+//
+
+#define SMB_FORMAT_DATA 1
+#define SMB_FORMAT_DIALECT 2
+#define SMB_FORMAT_PATHNAME 3
+#define SMB_FORMAT_ASCII 4
+#define SMB_FORMAT_VARIABLE 5
+
+//
+// WriteMode flags
+//
+
+#define SMB_WMODE_WRITE_THROUGH 0x0001 // complete write before responding
+#define SMB_WMODE_SET_REMAINING 0x0002 // returning amt remaining in pipe
+#define SMB_WMODE_WRITE_RAW_NAMED_PIPE 0x0004 // write named pipe in raw mode
+#define SMB_WMODE_START_OF_MESSAGE 0x0008 // start of pipe message
+#define SMB_WMODE_DATAGRAM 0x0080 // start of pipe message
+
+//
+// Various SMB flags:
+//
+
+//
+// If the server supports LockAndRead and WriteAndUnlock, it sets this
+// bit the Negotiate response.
+//
+
+#define SMB_FLAGS_LOCK_AND_READ_OK 0x01
+
+//
+// When on, the consumer guarantees that there is a receive buffer posted
+// such that a "Send.No.Ack" can be used by the server to respond to
+// the consumer's request.
+//
+
+#define SMB_FLAGS_SEND_NO_ACK 0x2
+
+//
+// This is part of the Flags field of every SMB header. If this bit
+// is set, then all pathnames in the SMB should be treated as case-
+// insensitive.
+//
+
+#define SMB_FLAGS_CASE_INSENSITIVE 0x8
+
+//
+// When on in session setup, this bit indicates that all paths sent to
+// the server are already in OS/2 canonicalized format.
+//
+
+#define SMB_FLAGS_CANONICALIZED_PATHS 0x10
+
+//
+// When on in a open file request SMBs (open, create, openX, etc.) this
+// bit indicates a request for an oplock on the file. When on in the
+// response, this bit indicates that the oplock was granted.
+//
+
+#define SMB_FLAGS_OPLOCK 0x20
+
+//
+// When on, this bit indicates that the server should notify the client
+// on any request that could cause the file to be changed. If not set,
+// the server only notifies the client on other open requests on the
+// file.
+//
+
+#define SMB_FLAGS_OPLOCK_NOTIFY_ANY 0x40
+
+//
+// This bit indicates that the SMB is being sent from server to redir.
+//
+
+#define SMB_FLAGS_SERVER_TO_REDIR 0x80
+
+//
+// Valid bits for Flags on an incoming SMB
+//
+
+#define INCOMING_SMB_FLAGS \
+ (SMB_FLAGS_LOCK_AND_READ_OK | \
+ SMB_FLAGS_SEND_NO_ACK | \
+ SMB_FLAGS_CASE_INSENSITIVE | \
+ SMB_FLAGS_CANONICALIZED_PATHS | \
+ SMB_FLAGS_OPLOCK_NOTIFY_ANY | \
+ SMB_FLAGS_OPLOCK)
+
+//
+// Names for bits in Flags2 field of SMB header that indicate what the
+// client app is aware of.
+//
+
+#define SMB_FLAGS2_KNOWS_LONG_NAMES 0x0001
+#define SMB_FLAGS2_KNOWS_EAS 0x0002
+#define SMB_FLAGS2_IS_LONG_NAME 0x0040
+#define SMB_FLAGS2_DFS 0x1000
+#define SMB_FLAGS2_PAGING_IO 0x2000
+#define SMB_FLAGS2_NT_STATUS 0x4000
+#define SMB_FLAGS2_UNICODE 0x8000
+
+//
+// Valid bits for Flags2 on an incoming SMB
+//
+
+#define INCOMING_SMB_FLAGS2 \
+ (SMB_FLAGS2_KNOWS_LONG_NAMES | \
+ SMB_FLAGS2_KNOWS_EAS | \
+ SMB_FLAGS2_DFS | \
+ SMB_FLAGS2_PAGING_IO | \
+ SMB_FLAGS2_IS_LONG_NAME | \
+ SMB_FLAGS2_NT_STATUS | \
+ SMB_FLAGS2_UNICODE )
+
+//
+// The SMB open function determines what action should be taken depending
+// on the existence or lack thereof of files used in the operation. It
+// has the following mapping:
+//
+// 1111 1
+// 5432 1098 7654 3210
+// rrrr rrrr rrrC rrOO
+//
+// where:
+//
+// O - Open (action to be taken if the target file exists)
+// 0 - Fail
+// 1 - Open or Append file
+// 2 - Truncate file
+//
+// C - Create (action to be taken if the target file does not exist)
+// 0 - Fail
+// 1 - Create file
+//
+
+#define SMB_OFUN_OPEN_MASK 0x3
+#define SMB_OFUN_CREATE_MASK 0x10
+
+#define SMB_OFUN_OPEN_FAIL 0
+#define SMB_OFUN_OPEN_APPEND 1
+#define SMB_OFUN_OPEN_OPEN 1
+#define SMB_OFUN_OPEN_TRUNCATE 2
+
+#define SMB_OFUN_CREATE_FAIL 0x00
+#define SMB_OFUN_CREATE_CREATE 0x10
+
+//++
+//
+// BOOLEAN
+// SmbOfunCreate(
+// IN USHORT SmbOpenFunction
+// )
+//
+//--
+
+#define SmbOfunCreate(SmbOpenFunction) \
+ (BOOLEAN)((SmbOpenFunction & SMB_OFUN_CREATE_MASK) == SMB_OFUN_CREATE_CREATE)
+
+//++
+//
+// BOOLEAN
+// SmbOfunAppend(
+// IN USHORT SmbOpenFunction
+// )
+//
+//--
+
+#define SmbOfunAppend(SmbOpenFunction) \
+ (BOOLEAN)((SmbOpenFunction & SMB_OFUN_OPEN_MASK) == SMB_OFUN_OPEN_APPEND)
+
+//++
+//
+// BOOLEAN
+// SmbOfunTruncate(
+// IN USHORT SmbOpenFunction
+// )
+//
+//--
+
+#define SmbOfunTruncate(SmbOpenFunction) \
+ (BOOLEAN)((SmbOpenFunction & SMB_OFUN_OPEN_MASK) == SMB_OFUN_OPEN_TRUNCATE)
+
+//
+// The desired access mode passed in Open and Open and X has the following
+// mapping:
+//
+// 1111 11
+// 5432 1098 7654 3210
+// rWrC rLLL rSSS rAAA
+//
+// where:
+//
+// W - Write through mode. No read ahead or write behind allowed on
+// this file or device. When protocol is returned, data is expected
+// to be on the disk or device.
+//
+// S - Sharing mode:
+// 0 - Compatibility mode (as in core open)
+// 1 - Deny read/write/execute (exclusive)
+// 2 - Deny write
+// 3 - Deny read/execute
+// 4 - Deny none
+//
+// A - Access mode
+// 0 - Open for reading
+// 1 - Open for writing
+// 2 - Open for reading and writing
+// 3 - Open for execute
+//
+// rSSSrAAA = 11111111 (hex FF) indicates FCB open (as in core protocol)
+//
+// C - Cache mode
+// 0 - Normal file
+// 1 - Do not cache this file
+//
+// L - Locality of reference
+// 0 - Locality of reference is unknown
+// 1 - Mainly sequential access
+// 2 - Mainly random access
+// 3 - Random access with some locality
+// 4 to 7 - Currently undefined
+//
+
+
+#define SMB_DA_SHARE_MASK 0x70
+#define SMB_DA_ACCESS_MASK 0x07
+#define SMB_DA_FCB_MASK (UCHAR)0xFF
+
+#define SMB_DA_ACCESS_READ 0x00
+#define SMB_DA_ACCESS_WRITE 0x01
+#define SMB_DA_ACCESS_READ_WRITE 0x02
+#define SMB_DA_ACCESS_EXECUTE 0x03
+
+#define SMB_DA_SHARE_COMPATIBILITY 0x00
+#define SMB_DA_SHARE_EXCLUSIVE 0x10
+#define SMB_DA_SHARE_DENY_WRITE 0x20
+#define SMB_DA_SHARE_DENY_READ 0x30
+#define SMB_DA_SHARE_DENY_NONE 0x40
+
+#define SMB_DA_FCB (UCHAR)0xFF
+
+#define SMB_CACHE_NORMAL 0x0000
+#define SMB_DO_NOT_CACHE 0x1000
+
+#define SMB_LR_UNKNOWN 0x0000
+#define SMB_LR_SEQUENTIAL 0x0100
+#define SMB_LR_RANDOM 0x0200
+#define SMB_LR_RANDOM_WITH_LOCALITY 0x0300
+#define SMB_LR_MASK 0x0F00
+
+#define SMB_DA_WRITE_THROUGH 0x4000
+
+//
+// The Action field of OpenAndX has the following format:
+//
+// 1111 11
+// 5432 1098 7654 3210
+// Lrrr rrrr rrrr rrOO
+//
+// where:
+//
+// L - Opportunistic lock. 1 if lock granted, else 0.
+//
+// O - Open action:
+// 1 - The file existed and was opened
+// 2 - The file did not exist but was created
+// 3 - The file existed and was truncated
+//
+
+#define SMB_OACT_OPENED 0x01
+#define SMB_OACT_CREATED 0x02
+#define SMB_OACT_TRUNCATED 0x03
+
+#define SMB_OACT_OPLOCK 0x8000
+
+//
+// These flags are passed in the Flags field of the copy and extended rename
+// SMBs.
+//
+
+//
+// If set, the target must be a file or directory.
+//
+
+#define SMB_TARGET_IS_FILE 0x1
+#define SMB_TARGET_IS_DIRECTORY 0x2
+
+//
+// The copy mode--if set, ASCII copying should be done, otherwise binary.
+//
+
+#define SMB_COPY_TARGET_ASCII 0x4
+#define SMB_COPY_SOURCE_ASCII 0x8
+
+#define SMB_COPY_TREE 0x20
+
+//
+// If set, verify all writes.
+//
+
+#define SMB_VERIFY_WRITES
+
+//
+// Define file attribute bits as used in the SMB protocol. The specific
+// bit positions are, for the most part, identical to those used in NT.
+// However, NT does not define Volume and Directory bits. It also has
+// an explicit Normal bit; this bit is implied in SMB attributes by
+// Hidden, System, and Directory being off.
+//
+
+#define SMB_FILE_ATTRIBUTE_READONLY 0x01
+#define SMB_FILE_ATTRIBUTE_HIDDEN 0x02
+#define SMB_FILE_ATTRIBUTE_SYSTEM 0x04
+#define SMB_FILE_ATTRIBUTE_VOLUME 0x08
+#define SMB_FILE_ATTRIBUTE_DIRECTORY 0x10
+#define SMB_FILE_ATTRIBUTE_ARCHIVE 0x20
+
+//
+// Share type strings are passed in SMBs to indicate what type of shared
+// resource is being or has been connected to.
+//
+
+#define SHARE_TYPE_NAME_DISK "A:"
+#define SHARE_TYPE_NAME_PIPE "IPC"
+#define SHARE_TYPE_NAME_COMM "COMM"
+#define SHARE_TYPE_NAME_PRINT "LPT1:"
+#define SHARE_TYPE_NAME_WILD "?????"
+
+//
+// SMB Error codes:
+//
+
+//
+// Success Class:
+//
+
+#define SMB_ERR_SUCCESS (UCHAR)0x00
+
+//
+// DOS Error Class:
+//
+
+#define SMB_ERR_CLASS_DOS (UCHAR)0x01
+
+#define SMB_ERR_BAD_FUNCTION 1 // Invalid function
+#define SMB_ERR_BAD_FILE 2 // File not found
+#define SMB_ERR_BAD_PATH 3 // Invalid directory
+#define SMB_ERR_NO_FIDS 4 // Too many open files
+#define SMB_ERR_ACCESS_DENIED 5 // Access not allowed for req. func.
+#define SMB_ERR_BAD_FID 6 // Invalid file handle
+#define SMB_ERR_BAD_MCB 7 // Memory control blocks destroyed
+#define SMB_ERR_INSUFFICIENT_MEMORY 8 // For the desired function
+#define SMB_ERR_BAD_MEMORY 9 // Invalid memory block address
+#define SMB_ERR_BAD_ENVIRONMENT 10 // Invalid environment
+#define SMB_ERR_BAD_FORMAT 11 // Invalid format
+#define SMB_ERR_BAD_ACCESS 12 // Invalid open mode
+#define SMB_ERR_BAD_DATA 13 // Invalid data (only from IOCTL)
+#define SMB_ERR_RESERVED 14
+#define SMB_ERR_BAD_DRIVE 15 // Invalid drive specified
+#define SMB_ERR_CURRENT_DIRECTORY 16 // Attempted to remove currect directory
+#define SMB_ERR_DIFFERENT_DEVICE 17 // Not the same device
+#define SMB_ERR_NO_FILES 18 // File search can't find more files
+#define SMB_ERR_BAD_SHARE 32 // An open conflicts with FIDs on file
+#define SMB_ERR_LOCK 33 // Conflict with existing lock
+#define SMB_ERR_FILE_EXISTS 80 // Tried to overwrite existing file
+#define SMB_ERR_BAD_PIPE 230 // Invalie pipe
+#define SMB_ERR_PIPE_BUSY 231 // All instances of the pipe are busy
+#define SMB_ERR_PIPE_CLOSING 232 // Pipe close in progress
+#define SMB_ERR_PIPE_NOT_CONNECTED 233 // No process on other end of pipe
+#define SMB_ERR_MORE_DATA 234 // There is more data to return
+
+//
+// SERVER Error Class:
+//
+
+#define SMB_ERR_CLASS_SERVER (UCHAR)0x02
+
+#define SMB_ERR_ERROR 1 // Non-specific error code
+#define SMB_ERR_BAD_PASSWORD 2 // Bad name/password pair
+#define SMB_ERR_BAD_TYPE 3 // Reserved
+#define SMB_ERR_ACCESS 4 // Requester lacks necessary access
+#define SMB_ERR_BAD_TID 5 // Invalid TID
+#define SMB_ERR_BAD_NET_NAME 6 // Invalid network name in tree connect
+#define SMB_ERR_BAD_DEVICE 7 // Invalid device request
+#define SMB_ERR_QUEUE_FULL 49 // Print queue full--returned print file
+#define SMB_ERR_QUEUE_TOO_BIG 50 // Print queue full--no space
+#define SMB_ERR_QUEUE_EOF 51 // EOF on print queue dump
+#define SMB_ERR_BAD_PRINT_FID 52 // Invalid print file FID
+#define SMB_ERR_BAD_SMB_COMMAND 64 // SMB command not recognized
+#define SMB_ERR_SERVER_ERROR 65 // Internal server error
+#define SMB_ERR_FILE_SPECS 67 // FID and pathname were incompatible
+#define SMB_ERR_RESERVED2 68
+#define SMB_ERR_BAD_PERMITS 69 // Access permissions invalid
+#define SMB_ERR_RESERVED3 70
+#define SMB_ERR_BAD_ATTRIBUTE_MODE 71 // Invalid attribute mode specified
+#define SMB_ERR_SERVER_PAUSED 81 // Server is paused
+#define SMB_ERR_MESSAGE_OFF 82 // Server not receiving messages
+#define SMB_ERR_NO_ROOM 83 // No room for buffer message
+#define SMB_ERR_TOO_MANY_NAMES 87 // Too many remote user names
+#define SMB_ERR_TIMEOUT 88 // Operation was timed out
+#define SMB_ERR_NO_RESOURCE 89 // No resources available for request
+#define SMB_ERR_TOO_MANY_UIDS 90 // Too many UIDs active in session
+#define SMB_ERR_BAD_UID 91 // UID not known as a valid UID
+#define SMB_ERR_INVALID_NAME 123 // Invalid name returned from FAT.
+#define SMB_ERR_INVALID_NAME_RANGE 206 // Non 8.3 name passed to FAT (or non 255 name to HPFS)
+#define SMB_ERR_USE_MPX 250 // Can't support Raw; use MPX
+#define SMB_ERR_USE_STANDARD 251 // Can't support Raw, use standard r/w
+#define SMB_ERR_CONTINUE_MPX 252 // Reserved
+#define SMB_ERR_RESERVED4 253
+#define SMB_ERR_RESERVED5 254
+#define SMB_ERR_NO_SUPPORT_INTERNAL 255 // Internal code for NO_SUPPORT--
+ // allows codes to be stored in a byte
+#define SMB_ERR_NO_SUPPORT (USHORT)0xFFFF // Function not supported
+
+//
+// HARDWARE Error Class:
+//
+
+#define SMB_ERR_CLASS_HARDWARE (UCHAR)0x03
+
+#define SMB_ERR_NO_WRITE 19 // Write attempted to write-prot. disk
+#define SMB_ERR_BAD_UNIT 20 // Unknown unit
+#define SMB_ERR_DRIVE_NOT_READY 21 // Disk drive not ready
+#define SMB_ERR_BAD_COMMAND 22 // Unknown command
+#define SMB_ERR_DATA 23 // Data error (CRC)
+#define SMB_ERR_BAD_REQUEST 24 // Bad request structure length
+#define SMB_ERR_SEEK 25 // Seek error
+#define SMB_ERR_BAD_MEDIA 26 // Unknown media type
+#define SMB_ERR_BAD_SECTOR 27 // Sector not found
+#define SMB_ERR_NO_PAPER 28 // Printer out of paper
+#define SMB_ERR_WRITE_FAULT 29 // Write fault
+#define SMB_ERR_READ_FAULT 30 // Read fault
+#define SMB_ERR_GENERAL 31 // General failure
+#define SMB_ERR_LOCK_CONFLICT 33 // Lock conflicts with existing lock
+#define SMB_ERR_WRONG_DISK 34 // Wrong disk was found in a drive
+#define SMB_ERR_FCB_UNAVAILABLE 35 // No FCBs available to process request
+#define SMB_ERR_SHARE_BUFFER_EXCEEDED 36
+#define SMB_ERR_DISK_FULL 39 // !!! Undocumented, but in LM2.0
+
+//
+// Other Error Classes:
+//
+
+#define SMB_ERR_CLASS_XOS (UCHAR)0x04 // Reserved for XENIX
+#define SMB_ERR_CLASS_RMX1 (UCHAR)0xE1 // Reserved for iRMX
+#define SMB_ERR_CLASS_RMX2 (UCHAR)0xE2 // Reserved for iRMX
+#define SMB_ERR_CLASS_RMX3 (UCHAR)0xE3 // Reserved for iRMX
+#define SMB_ERR_CLASS_COMMAND (UCHAR)0xFF // Command was not in the SMB format
+
+
+//
+// Turn structure packing back off
+//
+
+#ifndef NO_PACKING
+#include <packoff.h>
+#endif // ndef NO_PACKING
+
+
+#endif // _SMB_
+
+// Old (LanMan 1.2) and new (NT) field names:
+// (Undocumented fields have corresponding structure in parenthesis)
+// smb_access Access
+// smb_action Action
+// smb_adate AccessDate
+// smb_allocsize AllocationSize
+// smb_aname AccountName
+// smb_apasslen PasswordSize
+// smb_apasswd AccountPassword
+// smb_atime AccessTime
+// smb_attr Attribute
+// smb_attribute Attribute
+// smb_aunits (RESP_QUERY_INFORMATION_SERVER)
+// smb_bcc BufferSize
+// smb_blkmode BlockMode
+// smb_blksize BlockSize
+// smb_blksperunit BlocksPerUnit
+// smb_bpu BlocksPerUnit
+// smb_bs BlockSize
+// smb_bufsize MaxBufferSize
+// smb_buf[1] Buffer[1]
+// smb_bytes[*] Bytes[*]
+// smb_cat Category
+// smb_cct FilesCopied
+// smb_cdate CreateDate
+// smb_cert CertificateOffset
+// smb_com Command
+// smb_com2 AndXCommand
+// smb_count Count
+// smb_count_left Remaining
+// smb_cryptkey[*] CryptKey
+// smb_ctime CreateTime
+// smb_datablock DataBlock
+// smb_datalen DataSize
+// smb_datasize DataSize
+// smb_data[*] Data[*]
+// smb_dcmode DataCompactMode
+// smb_dev DeviceName
+// smb_doff DataOffset
+// smb_drcnt DataCount
+// smb_drdisp DataDisplacement
+// smb_droff DataOffset
+// smb_dscnt DataCount
+// smb_dsdisp DataDisplacement
+// smb_dsize DataSize
+// smb_dsoff DataOffset
+// smb_encrypt EncryptKey
+// smb_encryptlen EncryptKeySize
+// smb_encryptoff EncryptKeyOffset
+// smb_eos EndOfSearch
+// smb_err Error
+// smb_errmsg[1] ErrorMessage[1]
+// smb_fau (RESP_QUERY_INFORMATION_SERVER)
+// smb_fid Fid
+// smb_fileid ServerFid
+// smb_flag Flag
+// smb_flag2 Flag2
+// smb_flags Flag
+// smb_flg Flag
+// smb_freeunits FreeUnits
+// smb_fsid (RESP_QUERY_INFORMATION_SERVER)
+// smb_fsize FileSize
+// smb_fun Function
+// smb_gid Gid
+// smb_handle Handle
+// smb_ident1 Identifier
+// smb_idf[4] Protocol[4]
+// smb_index Index
+// smb_info Info
+// smb_left Remaining
+// smb_len SetupLength
+// smb_locknum NumberOfLocks
+// smb_lockrng[*] LockRange
+// smb_locktype LockType
+// smb_lpid OwnerPid
+// smb_maxbytes MaxBytes
+// smb_maxcnt MaxCount
+// smb_maxcount MaxCount
+// smb_maxmux (RESP_NEGOTIATE)
+// smb_maxvcs MaxNumberVcs
+// smb_maxxmitsz MaxTransmitSize
+// smb_maxxmt MaxTransmitSize
+// smb_mdate ModificationDate
+// smb_mdrcnt MaxDataCount
+// smb_mid Mid
+// smb_mincnt MinCount
+// smb_mode Mode
+// smb_mprcnt MaxParameterCount
+// smb_mpxmax MaxMpxCount
+// smb_msrcnt MaxSetupCount
+// smb_mtime ModificationTime
+// smb_name[*] Name[*]
+// smb_off2 AndXOffset
+// smb_offset Offset
+// smb_ofun OpenFunction
+// smb_pad Pad
+// smb_pad1[] Pad1
+// smb_pad[] Pad[]
+// smb_param[*] Parameter[*]
+// smb_path ServerName
+// smb_pathname PathName
+// smb_pid Pid
+// smb_prcnt ParameterCount
+// smb_prdisp ParameterDisplacement
+// smb_proff ParameterCount
+// smb_pscnt ParameterCount
+// smb_psdisp ParameterDisplacement
+// smb_psoff ParameterOffset
+// smb_range LockLength or UnlockLength
+// smb_rcls ErrorClass
+// smb_reh ReservedH
+// smb_reh2 ReservedH2
+// smb_remaining Remaining
+// smb_remcnt Remaining
+// smb_res1 Reserved
+// smb_res2 Reserved2
+// smb_res3 Reserved3
+// smb_res4 Reserved4
+// smb_res5 Reserved5
+// smb_reserved Reserved
+// smb_restart Restart
+// smb_resumekey ResumeKey
+// smb_res[5] Reserved[]
+// smb_reverb ReverbCount
+// smb_rsvd Reserved
+// smb_rsvd1 Reserved
+// smb_rsvd2 Reserved2
+// smb_rsvd3 Reserved3
+// smb_rsvd4 Reserved4
+// smb_sattr SearchAttribute
+// smb_secmode SecurityMode
+// smb_seq SequenceNumber
+// smb_services Services
+// smb_sesskey SessionKey
+// smb_setup[*] Setup[*]
+// smb_size Size
+// smb_spasslen ServerPasswordSize
+// smb_spasswd ServerPassword
+// smb_srv_date ServerDate
+// smb_srv_time ServerTime
+// smb_srv_tzone ServerTimeZone
+// smb_start StartIndex
+// smb_state DeviceState
+// smb_suwcnt SetupWordCount
+// smb_su_class SetupClass
+// smb_su_com SetupCommand
+// smb_su_handle SetupFid
+// smb_su_opcode SetupOpcode
+// smb_su_priority SetupPriority
+// smb_tcount Count
+// smb_tdis TreeDisconnect
+// smb_tdrcnt TotalDataCount
+// smb_tdscnt TotalDataCount
+// smb_tid Tid
+// smb_tid2 Tid2
+// smb_time Time
+// smb_timeout Timeout
+// smb_totalunits TotalUnits
+// smb_tprcnt TotalParameterCount
+// smb_tpscnt TotalParameterCount
+// smb_type FileType
+// smb_uid Uid
+// smb_unlkrng[*] UnlockRange
+// smb_unlocknum NumberOfUnlocks
+// smb_vblen DataLength
+// smb_vcnum VcNumber
+// smb_vldate (RESP_QUERY_INFORMATION_SERVER)
+// smb_vllen (RESP_QUERY_INFORMATION_SERVER)
+// smb_vltime (RESP_QUERY_INFORMATION_SERVER)
+// smb_vwv[1] Param
+// smb_wct WordCount
+// smb_wmode WriteMode
+// smb_xchain EncryptChainOffset
+