4.0 SMB Requests

This section lists the "best practice" SMB requests—ones that would permit a client to exercise full CIFS functionality and optimum performance when interoperating with a server speaking the latest dialect as of this writing ("NT LM 0.12").

Note   As of this writing, no existing client restricts itself to only these requests, so no useful server can be written that supports just them. The classification is provided so that future clients will be written to permit future servers to be simpler.

4.1 Session Requests

4.1.1 NEGOTIATE: Negotiate Protocol

Client Request
==================
Description
==============================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes; min = 2
struct {
UCHAR BufferFormat; 0x02—Dialect
UCHAR DialectName[]; ASCII null-terminated string
} Dialects[];

The Client sends a list of dialects with which it can communicate. The response is a selection of one of those dialects (numbered 0 through n) or -1 (hex FFFF) indicating that none of the dialects was acceptable. The negotiate message is binding on the virtual circuit and must be sent. One and only one negotiate message may be sent; subsequent negotiate requests will be rejected with an error response, and no action will be taken.

The protocol does not impose any particular structure to the dialect strings. Implementers of particular protocols may choose to include, for example, version numbers in the string.

If the server does not understand any of the dialect strings, or if PC NETWORK PROGRAM 1.0 is the chosen dialect, the response format is:

Server Response
==================
Description
==============================
UCHAR WordCount; Count of parameter words = 1
USHORT DialectIndex; Index of selected dialect
USHORT ByteCount; Count of data bytes = 0

If the chosen dialect is greater than core up to and including LANMAN2.1, the protocol response format is:

Server Response
==================
Description
=============================
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 = use challenge/response authentication
USHORT MaxBufferSize; Max transmit buffer size (>= 1024)
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; Unique token identifying this session
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 EncryptionKey[]; The challenge encryption key
STRING PrimaryDomain[]; The server's primary domain

MaxBufferSize is the size of the largest message that the client can legitimately send to the server.

If bit0 of the Flags field is set in the negotiate response, this indicates the server supports the SMB_COM_LOCK_AND_READ and SMB_COM_WRITE_AND_UNLOCK client requests.

If the SecurityMode field indicates the server is running in user mode, the client must send appropriate SMB_COM_SESSION_SETUP_ANDX requests before the server will allow the client to access resources. If the SecurityMode fields indicate the client should use challenge/response authentication, the client should use the authentication mechanism.

Clients using the "MICROSOFT NETWORKS 1.03" dialect use a different form of raw reads than documented here, and servers are better off setting RawMode in this response to 0 for such sessions.

If the negotiated dialect is "DOS LANMAN2.1" or "LANMAN2.1," then PrimaryDomain string should be included in this response.

If the negotiated dialect is NT LM 0.12, the response format is:

Server Response
==================
Description
==============================
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
bit 2: 1 = Security Signatures (SMB sequence numbers) enabled
bit 3: 1 = Security Signatures (SMB sequence numbers) required
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; Unique token identifying this session
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 EncryptionKey[]; The challenge encryption key; Present only for Non Extended Security i.e., CAP_EXTENDED_SECURITY is off in the Capabilities field
UCHAR OemDomainName[]; The name of the domain (in OEM chars); Present only for Non Extended Security i.e., CAP_EXTENDED_SECURITY is off in the Capabilities field
UCHAR GUID[16] A globally unique identifier assigned to the server; present only when CAP_EXTENDED_SECURITY is on in the Capabilities field
UCHAR SecurityBlob[] Opaque Security Blob associated with the security package; present only when CAP_EXTENDED_SECURITY is on in the Capabilities field

In addition to the definitions above, MaxBufferSize is the size of the largest message the client can legitimately send to the server. If the client is using a connectionless protocol, MaxBufferSize must be set to the smaller of the server's internal buffer size and the amount of data that can be placed in a response packet.

MaxRawSize specifies the maximum message size the server can send or receive for SMB_COM_WRITE_RAW or SMB_COM_READ_RAW.

Connectionless clients must set Sid to 0 in the SMB request header.

Capabilities allows the server to tell the client what it supports. The bit definitions are:

Capability Name
===============
Encoding
========
Meaning
======================
CAP_RAW_MODE 0x0001 The server supports SMB_COM_READ_RAW and SMB_COM_WRITE_RAW.
CAP_MPX_MODE 0x0002 The server supports SMB_COM_READ_MPX and SMB_COM_WRITE_MPX.
CAP_UNICODE 0x0004 The server supports Unicode strings.
CAP_LARGE_FILES 0x0008 The server supports large files with 64-bit offsets.
CAP_NT_SMBS 0x0010 The server supports the SMBs particular to the NT LM 0.12 dialect.
CAP_RPC_REMOTE_APIS 0x0020 The server supports remote API requests via RPC.
CAP_STATUS32 0x0040 The server can respond with 32-bit status codes in Status.Status.
CAP_LEVEL_II_OPLOCKS 0x0080 The server supports level 2 oplocks.
CAP_LOCK_AND_READ 0x0100 The server supports the SMB_COM_LOCK_AND_READ SMB.
CAP_NT_FIND 0x0200
CAP_DFS 0x1000 This server is Dfs aware.
CAP_BULK_TRANSFER 0x20000000 This server supports SMB_BULK_READ, SMB_BULK_WRITE.
CAP_COMPRESSED_DATA 0x40000000 This server supports compressed data transfer (BULK_TRANSFER capability is required in order to support compressed data transfer).
CAP_EXTENDED_SECURITY 0x80000000 This server supports extended security validation.

4.1.1.1 Errors

SUCCESS/SUCCESS
ERRSRV/ERRerror

4.1.2 SESSION_SETUP_ANDX: Session Setup

This SMB is used to further "Set up" the session normally just established via the negotiate protocol.

One primary function is to perform a "user logon" in the case where the server is in user level security mode. The Uid in the SMB header is set by the client to be the userid desired for the AccountName and validated by the AccountPassword.

If the negotiated protocol is prior to NT LM 0.12, the format of SMB_COM_SESSION_SETUP_ANDX is:

Client Request
==================
Description
=============================
  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; Client maximum buffer size
USHORT MaxMpxCount; Actual maximum multiplexed pending requests
USHORT VcNumber; 0 = first (only), non-zero=additional VC number
ULONG SessionKey; Session key (valid iff VcNumber != 0)
USHORT PasswordLength; Account password size
ULONG Reserved; Must be 0
USHORT ByteCount; Count of data bytes;  min = 0
UCHAR AccountPassword[]; Account Password
STRING AccountName[]; Account Name
STRING PrimaryDomain[]; Client's primary domain
STRING NativeOS[]; Client's native operating system
STRING NativeLanMan[]; Client's native LAN Manager type

and the response is:

Server Response
==================
Description
=============================
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
STRING NativeOS[]; Server's native operating system
STRING NativeLanMan[]; Server's native LAN Manager type
STRING PrimaryDomain[]; Server's primary domain

If the server is in "share level security mode," the account name and passwd should be ignored by the server.

If challenge/response authentication is not being used, AccountPassword should be a null terminated ASCII string with PasswordLength set to the string size including the null; the password will be case-insensitive. If challenge/response authentication is being used, then AccountPassword will be the response to the server's challenge, and PasswordLength should be set to its length.

The server validates the name and password supplied and, if valid, registers the user identifier on this session as representing the specified AccountName. The Uid field in the SMB header will then be used to validate access on subsequent SMB requests. The SMB requests where permission checks are required are those that refer to a symbolically named resource such as SMB_COM_OPEN, SMB_COM_RENAME, SMB_COM_DELETE, etc. The value of the Uid is relative to a specific client/server session, so it is possible to have the same Uid value represent two different users on two different sessions at the server.

Multiple session setup commands may be sent to register additional users on this session. If the server receives an additional SMB_COM_SESSION_SETUP_ANDX, only the Uid, AccountName, and AccountPassword fields need contain valid values (the server must ignore the other fields).

The client writes the name of its domain in PrimaryDomain if it knows what the domain name is. If the domain name is unknown, the client either encodes it as a NULL string or as a question mark.

If bit0 of Action is set, this informs the client that, although the server did not recognize the AccountName, it logged in the user as a guest. This is optional behavior by the server, and one would ordinarily expect guest privileges to be limited.

Another function of the Session Set Up protocol is to inform the server of the maximum values that will be utilized by this client. Here MaxBufferSize is the maximum message size the client can receive. Thus, although the server may support 16k buffers (as returned in the SMB_COM_NEGOTIATE response), if the client only has 4k buffers, the value of MaxBufferSize here would be 4096. The minimum allowable value for MaxBufferSize is 1024. The SMB_COM_NEGOTIATE response includes the server buffer size supported. This is the maximum SMB message size the client can send to the server. This size may be larger than the size returned to the server from the client via the SMB_COM_SESSION_SETUP_AND X protocol, which is the maximum SMB message size the server may send to the client. Thus, if the server's buffer size were 4k and the client's buffer size were only 2K, the client could send up to 4k (standard) write requests, but must only request up to 2k for (standard) read requests.

The VcNumber field specifies whether the client wants this to be the first VC or an additional VC.

The values for MaxBufferSize, MaxMpxCount, and VcNumber must be less than or equal to the maximum values supported by the server as returned in the SMB_COM_NEGOTIATE response.

If the server gets a SMB_COM_SESSION_SETUP_ANDX request with VcNumber of 0 and other VCs are still connected to that client, they will be aborted, thus freeing any resources held by the server. This condition could occur if the client was rebooted and reconnected to the server before the transport level had informed the server of the previous VC termination.

If the negotiated SMB dialect is "NT LM 0.12" and the server supports ExtendedSecurity, i.e., the CAP_EXTENDED_SECURITY flag is set in the Capabilities field of the Negotiate Response SMB, the Extended Security SessionSetup SMB format is:

Client Request
================
Description
===============================
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 MaxBufferSize; Client's maximum buffer size
USHORT MaxMpxCount; Actual maximum multiplexed pending requests
USHORT VcNumber; 0 = first (only), non-zero=additional VC number
ULONG SessionKey; Session key (valid iff VcNumber != 0)
USHORT SecurityBlobLength; Length of opaque security blob
ULONG Reserved; must be 0
ULONG Capabilities; Client capabilities
USHORT ByteCount; Count of data bytes; min = 0
UCHAR SecurityBlob[] The opaque security blob
STRING NativeOS[]; Client's native operating system, Unicode
STRING NativeLanMan[]; Client's native LAN Manager type, Unicode

The response is:

Server Response
================
Description
===============================
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 SecurityBlobLength length of Security Blob that follows in a later field
USHORT ByteCount; Count of data bytes
UCHAR SecurityBlob[] SecurityBlob of length specified in field SecurityBlobLength
STRING NativeOS[]; Server's native operating system
STRING NativeLanMan[]; Server's native LAN Manager type
STRING PrimaryDomain[]; Server's primary domain

Multiple parts may be involved in the security blob exchange. In that case, the server may return an error STATUS_MORE_PROCESSING_REQUEIRED (a value of 0xC0000016) in the SMB status. The client can then repeat the SessionSetupAndX SMB with the rest of the security blob.

If the negotiated SMB dialect is "NT LM 0.12" or later and the server does not support Extended Security (i.e., the CAP_EXTENDED_SECURITY flag in the Capabilities field of the Negotiate Response SMB is not set), the format of the response SMB is unchanged, but the request is:

Client Request
===================
Description
============================
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; Client's maximum buffer size
USHORT MaxMpxCount; Actual maximum multiplexed pending requests
USHORT VcNumber; 0 = first (only), non-zero=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; must be 0
ULONG Capabilities; Client capabilities
USHORT ByteCount; Count of data bytes;  min = 0
UCHAR CaseInsensitivePassword[]; Account Password, ANSI
UCHAR CaseSensitivePassword[]; Account Password, Unicode
STRING AccountName[]; Account Name, Unicode
STRING PrimaryDomain[]; Client's primary domain, Unicode
STRING NativeOS[]; Client's native operating system, Unicode
STRING NativeLanMan[]; Client's native LAN Manager type, Unicode

The client expresses its capabilities to the server encoded in the Capabilities field:

Capability Name
==============
Encoding
======
Description
=========================
CAP_UNICODE 0x0004 The client can use UNICODE strings.
CAP_LARGE_FILES 0x0008 The client can deal with files having 64-bit offsets.
CAP_NT_SMBS 0x0010 The client understands the SMBs introduced with the NT LM 0.12 dialect. Implies CAP_NT_FIND.
CAP_NT_FIND 0x0200
CAP_ STATUS32 0x0040 The client can receive 32-bit errors encoded in Status.Status.
CAP_LEVEL_II_OPLOCKS 0x0080 The client understands Level II oplocks.

The entire message sent and received, including the optional ANDX SMB, must fit in the negotiated maximum transfer size. The following are the only valid SMB commands for AndXCommand for SMB_COM_SESSION_SETUP_ANDX.

SMB_COM_TREE_CONNECT_ANDX SMB_COM_OPEN
SMB_COM_OPEN_ANDX SMB_COM_CREATE
SMB_COM_CREATE_NEW SMB_COM_CREATE_DIRECTORY
SMB_COM_DELETE SMB_COM_DELETE_DIRECTORY
SMB_COM_FIND SMB_COM_FIND_UNIQUE
SMB_COM_COPY SMB_COM_RENAME
SMB_COM_NT_RENAME SMB_COM_CHECK_DIRECTORY
SMB_COM_QUERY_INFORMATION SMB_COM_SET_INFORMATION
SMB_COM_NO_ANDX_COMMAND SMB_COM_OPEN_PRINT_FILE
SMB_COM_GET_PRINT_QUEUE SMB_COM_TRANSACTION

4.1.2.1 Errors

ERRSRV/ERRerror- no NEG_PROT issued
ERRSRV/ERRbadpw- password not correct for given username
ERRSRV/ERRtoomanyuids- maximum number of users per session exceeded
ERRSRV/ERRnosupport- chaining of this request to the previous one not supported

4.1.3 LOGOFF_ANDX: User Logoff

This SMB is the inverse of SMB_COM_SESSION_SETUP_ANDX.

Client Request
====================
Description
===========================
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

Server Response
====================
Description
===========================
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

The user represented by Uid in the SMB header is logged off. The server closes all files currently open by this user, and invalidates any outstanding requests with this Uid.

SMB_COM_SESSION_SETUP_ANDX is the only valid AndXCommand. for this SMB.

4.1.3.1 Errors

ERRSRV/invnid- TID was invalid
ERRSRV/baduid- UID was invalid

4.1.4 TREE_CONNECT_ANDX: Tree Connect

Client Request
====================
Description
==========================
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 Password[]; Password
STRING Path[]; Server name and share name
STRING Service[]; Service name

The serving machine verifies the combination and returns an error code or an identifier. The full name is included in this request message, and the identifier identifying the connection is returned in the Tid field of the SMB header. The Tid field in the client request is ignored. The meaning of this identifier (Tid) is server-specific; the client must not associate any specific meaning to it.

If the negotiated dialect is LANMAN1.0 or later, it is a protocol violation for the client to send this message prior to a successful SMB_COM_SESSION_SETUP_ANDX, and the server ignores Password.

If the negotiated dialect is prior to LANMAN1.0 and the client has not sent a successful SMB_COM_SESSION_SETUP_ANDX request when the tree connect arrives, a user level security mode server must nevertheless validate the client's credentials as discussed earlier in this document.

Path follows UNC style syntax, that is, it is encoded as \\server\share and it indicates the name of the resource to which the client wishes to connect.

Because Password may be an authentication response, it is a variable length field with the length specified by PasswordLength. If authentication is not being used, Password should be a null terminated ASCII string with PasswordLength set to the string size including the terminating null.

The server can enforce whatever policy it desires to govern share access. Typically, if the server is paused, administrative privilege is required to connect to any share; if the server is not paused, administrative privilege is required only for administrative shares (C$, etc.). Other such policies may include valid times of day, software usage license limits, number of simultaneous server users or share users, etc.

The Service component indicates the type of resource the client intends to access. Valid values are:

Service
=====
Description
=============
Earliest Dialect Allowed
==========================
A: disk share PC NETWORK PROGRAM 1.0
LPT1: printer PC NETWORK PROGRAM 1.0
IPC named pipe MICROSOFT NETWORKS 3.0
COMM communications device MICROSOFT NETWORKS 3.0
????? any type of device MICROSOFT NETWORKS 3.0

If bit0 of Flags is set, the tree connection to Tid in the SMB header should be disconnected. If this tree disconnect fails, the error should be ignored.

If the negotiated dialect is earlier than DOS LANMAN2.1, the response to this SMB is:

Server Response
===================
Description
===========================
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

If the negotiated is DOS LANMAN2.1 or later, the response to this SMB is:

Server Response
===================
Description
========================
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 Service[]; Service type connected to. Always ANSII.
STRING NativeFileSystem[]; Native file system for this tree

NativeFileSystem is the name of the file system; values to be expected include FAT, NTFS, etc.

OptionalSupport bits has the encoding:

Name
==================
Encoding
======
Description
====================
SMB_SUPPORT_SEARCH_BITS 0x0001
SMB_SHARE_IS_IN_DFS 0x0002

Some servers negotiate "DOS LANMAN2.1" dialect or later and still send the "downlevel" (i.e., wordcount==2) response. Valid AndX following commands are:

SMB_COM_OPEN SMB_COM_OPEN_ANDX SMB_COM_CREATE
SMB_COM_CREATE_NEW SMB_COM_CREATE_DIRECTORY SMB_COM_DELETE
SMB_COM_DELETE_DIRECTORY SMB_COM_FIND SMB_COM_COPY
SMB_COM_FIND_UNIQUE SMB_COM_RENAME
SMB_COM_CHECK_DIRECTORY SMB_COM_QUERY_INFORMATION
SMB_COM_GET_PRINT_QUEUE SMB_COM_OPEN_PRINT_FILE
SMB_COM_TRANSACTION SMB_COM_NO_ANDX_CMD
SMB_COM_SET_INFORMATION SMB_COM_NT_RENAME

4.1.4.1 Errors

ERRDOS/ERRnomem
ERRDOS/ERRbadpath
ERRDOS/ERRinvdevice
ERRSRV/ERRaccess
ERRSRV/ERRbadpw
ERRSRV/ERRinvnetname

4.1.5 TREE_DISCONNECT: Tree Disconnect

This message informs the server that the client no longer wishes to access the resource connected to with a prior SMB_COM_TREE_CONNECT or SMB_COM_TREE_CONNECT_ANDX.

Client Request
====================
Description
==========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

The resource-sharing connection identified by Tid in the SMB header is logically disconnected from the server. Tid is invalidated; it will not be recognized if used by the client for subsequent requests. All locks, open files, etc. created on behalf of Tid are released.

Server Response
====================
Description
==========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

4.1.5.1 Errors

ERRSRV/ERRinvnid
ERRSRV/ERRbaduid

4.1.6 TRANS2_QUERY_FS_INFORMATION: Get File System Information

This transaction requests information about a file system on the server.

Client Request
====================
Value
==========================
WordCount; 15
TotalParameterCount; 2 or 4
MaxSetupCount; 0
SetupCount; 1 or 2
Setup[0]; TRANS2_QUERY_FS_INFORMATION
Parameter Block Encoding
====================
Description
==========================
USHORT Information Level; Level of information requested

The file system is identified by Tid in the SMB header.

MaxDataCount in the transaction request must be large enough to accommodate the response.

The encoding of the response parameter block depends on the InformationLevel requested. Information levels whose values are greater than 0x102 are mapped to corresponding calls to NtQueryVolumeInformationFile calls by the server. The two levels below 0x102 are described below. The requested information is placed in the Data portion of the transaction response.

InformationLevel
=======================
Value
=====
SMB_INFO_ALLOCATION 1
SMB_INFO_VOLUME 2
SMB_QUERY_FS_VOLUME_INFO 0x102
SMB_QUERY_FS_SIZE_INFO 0x103
SMB_QUERY_FS_DEVICE_INFO 0x104
SMB_QUERY_FS_ATTRIBUTE_INFO 0x105

The following sections describe the InformationLevel dependent encoding of the data part of the transaction response.

4.1.6.1 SMB_INFO_ALLOCATION

Data Block Encoding
==============
Description
===============================
ULONG idFileSystem; File system identifier. NT server always returns 0
ULONG cSectorUnit; Number of sectors per allocation unit
ULONG cUnit; Total number of allocation units
ULONG cUnitAvail; Total number of available allocation units
USHORT cbSector; Number of bytes per sector

4.1.6.2 SMB_INFO_VOLUME

Data Block Encoding
==============
Description
===============================
ULONG ulVsn; Volume serial number
UCHAR cch; Number of characters in Label
STRING Label; The volume label

4.1.6.3 SMB_QUERY_FS_VOLUME_INFO

Data Block Encoding
==============
Description
===============================
LARGE_INTEGER Volume Creation Time
ULONG Volume Serial Number
ULONG Length of Volume Label in bytes
BYTE Reserved
BYTE Reserved
STRING Label; The volume label

4.1.6.4 SMB_QUERY_FS_SIZE_INFO

Data Block Encoding
==============
Description
==============================
LARGE_INTEGER Total Number of Allocation units on the Volume
LARGE_INTEGER Number of free Allocation units on the Volume
ULONG Number of sectors in each Allocation unit
ULONG Number of bytes in each sector

4.1.6.5 SMB_QUERY_FS_DEVICE_INFO

Data Block Encoding
===============
Value
==============================
ULONG DeviceType; Values as specified below
ULONG Characteristics of the device; Values as specified below

For DeviceType, note that the values 0-32767 are reserved for the exclusive use of Microsoft Corporation. The following device types are currently defined:

FILE_DEVICE_BEEP 0x00000001
FILE_DEVICE_CD_ROM 0x00000002
FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
FILE_DEVICE_CONTROLLER 0x00000004
FILE_DEVICE_DATALINK 0x00000005
FILE_DEVICE_DFS 0x00000006
FILE_DEVICE_DISK 0x00000007
FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
FILE_DEVICE_FILE_SYSTEM 0x00000009
FILE_DEVICE_INPORT_PORT 0x0000000a
FILE_DEVICE_KEYBOARD 0x0000000b
FILE_DEVICE_MAILSLOT 0x0000000c
FILE_DEVICE_MIDI_IN 0x0000000d
FILE_DEVICE_MIDI_OUT 0x0000000e
FILE_DEVICE_MOUSE 0x0000000f
FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
FILE_DEVICE_NAMED_PIPE 0x00000011
FILE_DEVICE_NETWORK 0x00000012
FILE_DEVICE_NETWORK_BROWSER 0x00000013
FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
FILE_DEVICE_NULL 0x00000015
FILE_DEVICE_PARALLEL_PORT 0x00000016
FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
FILE_DEVICE_PRINTER 0x00000018
FILE_DEVICE_SCANNER 0x00000019
FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
FILE_DEVICE_SERIAL_PORT 0x0000001b
FILE_DEVICE_SCREEN 0x0000001c
FILE_DEVICE_SOUND 0x0000001d
FILE_DEVICE_STREAMS 0x0000001e
FILE_DEVICE_TAPE 0x0000001f
FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
FILE_DEVICE_TRANSPORT 0x00000021
FILE_DEVICE_UNKNOWN 0x00000022
FILE_DEVICE_VIDEO 0x00000023
FILE_DEVICE_VIRTUAL_DISK 0x00000024
FILE_DEVICE_WAVE_IN 0x00000025
FILE_DEVICE_WAVE_OUT 0x00000026
FILE_DEVICE_8042_PORT 0x00000027
FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
FILE_DEVICE_BATTERY 0x00000029
FILE_DEVICE_BUS_EXTENDER 0x0000002a
FILE_DEVICE_MODEM 0x0000002b
FILE_DEVICE_VDM 0x0000002c

Some of these device types are not currently accessible over the network and may never be accessible over the network. Some may change to be accessible over the network. The values for device types that may never be accessible over the network may be redefined to be reserved at some date in the future.

Characteristics is the sum of any of the following:

FILE_REMOVABLE_MEDIA 0x00000001
FILE_READ_ONLY_DEVICE 0x00000002
FILE_FLOPPY_DISKETTE 0x00000004
FILE_WRITE_ONE_MEDIA 0x00000008
FILE_REMOTE_DEVICE 0x00000010
FILE_DEVICE_IS_MOUNTED 0x00000020
FILE_VIRTUAL_VOLUME 0x00000040

4.1.6.6 SMB_QUERY_FS_ATTRIBUTE_INFO

Data Block
Encoding
=============
Description

==================================
ULONG File System Attributes; possible values described below
LONG Maximum length of each file name component in number of bytes
ULONG Length, in bytes, of the name of the file system
STRING Name of the file system

Where FileSystemAttributes is the sum of any of the following:

FILE_CASE_SENSITIVE_SEARCH 0x00000001
FILE_CASE_PRESERVED_NAMES 0x00000002
FILE_PRSISTENT_ACLS 0x00000004
FILE_FILE_COMPRESSION 0x00000008
FILE_VOLUME_QUOTAS 0x00000010
FILE_DEVICE_IS_MOUNTED 0x00000020
FILE_VOLUME_IS_COMPRESSED 0x00008000

4.1.6.7 Errors

ERRSRV/invnid- TID was invalid
ERRSRV/baduid- UID was invalid
ERRHRD/ERRnotready- the file system has been removed
ERRHRD/ERRdata- disk I/O error
ERRSRV/ERRaccess- user does not have the right to perform this operation
ERRSRV/ERRinvdevice- resource identified by TID is not a file system

4.1.7 ECHO: Ping the Server

This request is used to test the connection to the server, and to see if the server is still responding.

Client Request
===================
Description
===========================
UCHAR WordCount; Count of parameter words = 1
USHORT EchoCount; Number of times to echo data back
USHORT ByteCount; Count of data bytes;  min = 1
UCHAR Buffer[1]; Data to echo

Server Response
===================
Description
===========================
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

Each response echoes the data sent, though ByteCount may indicate no data If EchoCount is zero, no response is sent.

Tid in the SMB header is ignored, so this request may be sent to the server even if there are no valid tree connections to the server.

The flow for the ECHO protocol is:

Client Request
===================
<->
====
Server Response
======================
Echo Request (EchoCount == n) ->  
<- Echo Response 1
<- Echo Response 2
<- Echo Response n

4.1.7.1 Errors

ERRSRV/ERRbaduid- UID was invalid
ERRSRV/ERRnoaccess- session has not been established
ERRSRV/ERRnosupport- ECHO function is not supported

4.1.8 NT_CANCEL: Cancel Request

This SMB allows a client to cancel a request currently pending at the server.

Client Request
====================
Description
===========================
UCHAR WordCount; No words are sent (== 0)
USHORT ByteCount; No bytes (==0)

The Sid, Uid, Pid, Tid, and Mid fields of the SMB are used to locate a pending server request from this session. If a pending request is found, it is "hurried along," which may result in success or failure of the original request. No other response is generated for this SMB.

4.2 File Requests

4.2.1 NT_CREATE_ANDX: Create or Open File

This command is used to create or open a file or a directory.

Client Request
================
Description
=============================
UCHAR WordCount; Count of parameter words = 24
UCHAR AndXCommand; Secondary command; 0xFF = None
UCHAR AndXReserved; Reserved (must be 0)
USHORT AndXOffset; Offset to next command WordCount
UCHAR Reserved; Reserved (must be 0)
USHORT NameLength; Length of Name[] in bytes
ULONG Flags; Create bit set:

0x02—Request an oplock
0x04—Request a batch oplock
0x08—Target of open must be directory

ULONG RootDirectoryFid; If non-zero, open is relative to this directory
ACCESS_MASK
DesiredAccess;
access desired
LARGE_INTEGER
AllocationSize;
Initial allocation size
ULONG ExtFileAttributes; File attributes
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 Quality of Service (QOS) information
UCHAR SecurityFlags; Security tracking mode flags:
0x1—SECURITY_CONTEXT_TRACKING
0x2—SECURITY_EFFECTIVE_ONLY
USHORT ByteCount; Length of byte parameters
STRING Name[]; File to open or create

The DesiredAccess parameter is specified in Section 3.8, Access Mask Encoding.

If no value is specified, it still allows an application to query attributes without actually accessing the file.

The ExtFIleAttributes parameter specifies the file attributes and flags for the file. The parameter's value is the sum of allowed attributes and flags defined in Section 3.12 on Extended File Attribute Encoding.

The ShareAccess field specifies how this file can be shared. This parameter must be some combination of the following values:

Name Value Meaning
0 Prevents the file from being shared.
FILE_SHARE_READ 0x00000001 Other open operations can be performed on the file for read access.
FILE_SHARE_WRITE 0x00000002 Other open operations can be performed on the file for write access.
FILE_SHARE_DELETE 0x00000004 Other open operations can be performed on the file for delete access.

The CreateDisposition parameter can contain one of the following values:

CREATE_NEW Creates a new file. The function fails if the specified file already exists.
CREATE_ALWAYS Creates a new file. The function overwrites the file if it exists.
OPEN_EXISTING Opens the file. The function fails if the file does not exist.
OPEN_ALWAYS Opens the file, if it exists. If the file does not exist, act like CREATE_NEW.
TRUNCATE_EXISTING Opens the file. Once opened, the file is truncated so that its size is zero bytes. The calling process must open the file with at least GENERIC_WRITE access. The function fails if the file does not exist.

The ImpersonationLevel parameter can contain one or more of the following values:

SECURITY_ANONYMOUS Specifies to impersonate the client at the Anonymous impersonation level.
SECURITY_IDENTIFICATION Specifies to impersonate the client at the Identification impersonation level.
SECURITY_IMPERSONATION Specifies to impersonate the client at the Impersonation impersonation level.
SECURITY_DELEGATION Specifies to impersonate the client at the Delegation impersonation level.

The SecurityFlags parameter can have either of the following two flags set:

SECURITY_CONTEXT_TRACKING Specifies that the security tracking mode is dynamic. If this flag is not specified, Security Tracking Mode is static.
SECURITY_EFFECTIVE_ONLY Specifies that only the enabled aspects of the client's security context are available to the server. If you do not specify this flag, all aspects of the client's security context are available. This flag allows the client to limit the groups and privileges that a server can use while impersonating the client.

The response is as follows:

Server Response
===================
Description
=========================
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
0—No oplock granted
1—Exclusive oplock granted
2—Batch oplock granted
3—Level II oplock 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 ExtFileAttributes; 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

The following SMBs may follow SMB_COM_NT_CREATE_ANDX:

SMB_COM_READ SMB_COM_READ_ANDX
SMB_COM_IOCTL

4.2.2 NT_TRANSACT_CREATE: Create or Open File with EAs or SD

This command is used to create or open a file or a directory, when EAs or an SD must be applied to the file.

Request Parameter
Block Encoding
====================
Description

=========================
ULONG Flags; Creation flags (see below)
ULONG RootDirectoryFid; Optional directory for relative open
ACCESS_MASK DesiredAccess; Desired access
LARGE_INTEGER AllocationSize; The initial allocation size in bytes, if file created
ULONG ExtFileAttributes; Extended File Attribute Encoding (see Section 3.12)
ULONG ShareAccess; The share access
ULONG CreateDisposition; Action to take if file exists or not
ULONG CreateOptions; Options for creating a new file
ULONG SecurityDescriptorLength; Length of SD in bytes
ULONG EaLength; Length of extended attributes (EA) in bytes
ULONG NameLength; Length of name in characters
ULONG ImpersonationLevel; Security QOS information
UCHAR SecurityFlags; Security QOS information
STRING Name[NameLength]; The name of the file (not NULL terminated)
Data Block Encoding
====================
Description
=========================
UCHAR SecurityDescriptor[ SecurityDescriptorLength];
UCHAR ExtendedAttributes[EaLength];

Creation Flag Name
==================
Value
====
Description
======================
NT_CREATE_REQUEST_OPLOCK 0x02 Level I oplock requested
NT_CREATE_REQUEST_OPBATCH 0x04 Batch oplock requested
NT_CREATE_OPEN_TARGET_DIR 0x08 Target for open is a directory

Output Parameter
Block Encoding
====================

Description
=========================
UCHAR OplockLevel; The oplock level granted
UCHAR Reserved;  
USHORT Fid; The file ID
ULONG CreateAction; The action taken
ULONG EaErrorOffset; Offset of the EA error
TIME CreationTime; The time the file was created
TIME LastAccessTime; The time the file was accessed
TIME LastWriteTime; The time the file was last written
TIME ChangeTime; The time the file was last changed
ULONG ExtFileAttributes; 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

See the description of NT_CREATE_ANDX for the definition of the parameters.

4.2.3 CREATE_TEMPORARY: Create Temporary File

The server creates a data file in Directory relative to Tid in the SMB header and assigns a unique name to it.

Client Request
===================
Server Response
==========================
UCHAR WordCount; Count of parameter words = 3
USHORT reserved; Ignored by the server
UTIME CreationTime; New file's creation time stamp
USHORT ByteCount; Count of data bytes; min = 2
UCHAR BufferFormat; 0x04
STRING DirectoryName[]; Directory name

Server Response
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 1
USHORT Fid; File handle
USHORT ByteCount; Count of data bytes; min = 2
UCHAR BufferFormat; 0x04
STRING Filename[]; File name

Fid is the returned handle for future file access. Filename is the name of the file that was created within the requested Directory. It is opened in compatibility mode with read/write access for the client.

Support of CreationTime by the server is optional.

4.2.4 READ_ANDX: Read Bytes

Large File Client Request
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 10 or 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; Reserved
ULONG Reserved; Must be 0
USHORT Remaining; Reserved
ULONG OffsetHigh; Upper 32 bits of offset (only if WordCount is 12)
USHORT ByteCount; Count of data bytes = 0

Server Response
===================
Description
==========================
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; Reserved—must be -1
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 Reserved[5]; Reserved (must be 0)
USHORT ByteCount; Count of data bytes
UCHAR Pad[];
UCHAR Data[ DataLength]; Data from resource

If the negotiated dialect is NT LM 0.12 or later, the client may use the 12-parameter word version of the request. This version allows specification of 64-bit file offsets.

If CAP_LARGE_READX was indicated by the server in the negotiate protocol response, the request's MaxCount field may exceed the negotiated buffer size if Fid refers to a disk file. The server may arbitrarily elect to return fewer than MaxCount bytes in response.

The following SMBs may follow SMB_COM_READ_ANDX:
SMB_COM_CLOSE

4.2.4.1 Errors

ERRDOS/ERRnoaccess
ERRDOS/ERRbadfid
ERRDOS/ERRlock
ERRDOS/ERRbadaccess
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.5 WRITE_ANDX: Write Bytes to file File or Resource

Client Request
===================
Description
=========================
UCHAR WordCount; Count of parameter words = 12 or 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 Reserved; Must be 0
USHORT WriteMode; Write mode bits:
0—write through
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; Upper 32 bits of offset (only present if WordCount = 14)
USHORT ByteCount; Count of data bytes
UCHAR Pad[]; Pad to SHORT or LONG
UCHAR Data[DataLength]; Data to write

Server Response
===================
Description
=========================
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; Reserved
ULONG Reserved;
USHORT ByteCount; Count of data bytes = 0

A ByteCount of 0 does not truncate the file. Rather, a zero length write merely transfers zero bytes of information to the file. A request such as SMB_COM_WRITE must be used to truncate the file.

If WriteMode has bit0 set in the request and Fid refers to a disk file, the response is not sent from the server until the data is on stable storage.

If the negotiated dialect is NT LM 0.12 or later, the 14-word format of this SMB may be used to access portions of files requiring offsets expressed as 64 bits. Otherwise, the OffsetHigh field must be omitted from the request.

The following are the valid AndXCommand values for this SMB:

SMB_COM_READ SMB_COM_READ_ANDX
SMB_COM_LOCK_AND_READ SMB_COM_WRITE_ANDX
SMB_COM_CLOSE

4.2.5.1 Errors

ERRDOS/ERRnoaccess
ERRDOS/ERRbadfid
ERRDOS/ERRlock
ERRDOS/ERRbadaccess
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.6 LOCKING_ANDX: Lock or Unlock Byte Ranges

SMB_COM_LOCKING_ANDX allows both locking and/or unlocking of file range(s).

Client Request
===================
Description
==========================
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
UCHAR LockType; See LockType table below
UCHAR OplockLevel; The new oplock level
ULONG Timeout; Milliseconds to wait for unlock
USHORT NumberOfUnlocks; Num. unlock range structs following
USHORT NumberOfLocks; Num. lock range structs following
USHORT ByteCount; Count of data bytes
LOCKING_ANDX_RANGE Unlocks[]; Unlock ranges
LOCKING_ANDX_RANGE Locks[]; Lock ranges

LockType Flag Name
==================
Value
====
Description
=====================
LOCKING_ANDX_SHARED_LOCK 0x01 Read-only lock
LOCKING_ANDX_OPLOCK_RELEASE 0x02 Oplock break notification
LOCKING_ANDX_CHANGE_LOCKTYPE 0x04 Change lock type
LOCKING_ANDX_CANCEL_LOCK 0x08 Cancel outstanding request
LOCKING_ANDX_LARGE_FILES 0x10 Large file locking format

LOCKING_ANDX_RANGE Format
===============================================
USHORT Pid; PID of process "owning" lock
ULONG Offset; Offset to bytes to [un]lock
ULONG Length; Number of bytes to [un]lock

Large File LOCKING_ANDX_RANGE Format
===============================================
USHORT Pid; PID of process "owning" lock
USHORT Pad; Pad to DWORD align (mbz)
ULONG OffsetHigh; Offset to bytes to [un]lock (high)
ULONG OffsetLow; Offset to bytes to [un]lock (low)
ULONG LengthHigh; Number of bytes to [un]lock (high)
ULONG LengthLow; Number of bytes to [un]lock (low)

Server Response
==================
Description
==========================
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

Locking is a simple mechanism for excluding other processes read/write access to regions of a file. The locked regions can be anywhere in the logical file. Locking beyond end-of-file is permitted. Any process using the Fid specified in this request's Fid has access to the locked bytes; other processes will be denied the locking of the same bytes.

The proper method for using locks is not to rely on being denied read or write access on any of the read/write protocols, but rather to attempt the locking protocol and proceed with the read/write only if the locks succeeded.

Locking a range of bytes will fail if any subranges or overlapping ranges are locked. In other words, if any of the specified bytes are already locked, the lock will fail.

If NumberOfUnlocks is non-zero, the Unlocks vector contains NumberOfUnlocks elements. Each element requests that a lock at Offset of Length be released. If NumberOfLocks is non-zero, the Locks vector contains NumberOfLocks elements. Each element requests the acquisition of a lock at Offset of Length.

Timeout is the maximum amount of time to wait for the byte range(s) specified to become unlocked. A timeout value of 0 indicates that the server should fail immediately if any lock range specified is locked. A timeout value of -1 indicates that the server should wait as long as it takes for each byte range specified to become unlocked so that it may be again locked by this protocol. Any other value of smb_timeout specifies the maximum number of milliseconds to wait for all lock range(s) specified to become available.

If any of the lock ranges timeout because of the area to be locked is already locked (or the lock fails), the other ranges in the protocol request that were successfully locked as a result of this protocol will be unlocked (either all requested ranges will be locked when this protocol returns to the client or none).

If LockType has the LOCKING_ANDX_SHARED_LOCK flag set, the lock is specified as a shared lock. Locks for both read and write (where LOCKING_ANDX_SHARED_LOCK is clear) should be prohibited, but other shared locks should be permitted. If shared locks cannot be supported by a server, the server should map the lock to a lock for both read and write. Closing a file with locks still in force causes the locks to be released in no defined order.

If LockType has the LOCKING_ANDX_LARGE_FILES flag set and if the negotiated protocol is NT LM 0.12 or later, then the Locks and Unlocks vectors are in the Large File LOCKING_ANDX_RANGE format. This allows specification of 64-bit offsets for very large files.

If the one and only member of the Locks vector has the LOCKING_ANDX_CANCEL_LOCK flag set in the LockType field, the client is requesting the server to cancel a previously requested, but not yet responded to, lock.

If LockType has the LOCKING_ANDX_CHANGE_LOCKTYPE flag set, the client is requesting that the server atomically change the lock type from a shared lock to an exclusive lock or vice versa. If the server cannot do this in an atomic fashion, the server must reject this request. NT and W95 servers do not support this capability.

Oplocks are described in Opportunistic Locks, Section 2.6 in this document. A client requests an oplock by setting the appropriate bit in the SMB_COM_OPEN_ANDX request when the file is being opened in a mode that is not exclusive. The server responds by setting the appropriate bit in the response SMB indicating whether or not the oplock was granted. By granting the oplock, the server tells the client the file is currently being used by only this one client process at the current time. The client can therefore safely do read ahead and write behind as well as local caching of file locks, knowing that the file will not be accessed/changed in any way by another process while the oplock is in effect. The client will be notified when another process attempts to open or modify the oplocked file.

When another user attempts to open or otherwise modify the file that a client has oplocked, the server delays the second attempt and notifies the client via an SMB_LOCKING_ANDX SMB asynchronously sent from the server to the client. This message has the LOCKING_ANDX_OPLOCK_RELEASE flag set indicating to the client that the oplock is being broken. OplockLevel indicates the type of oplock the client now owns. If OplockLevel is 0, the client possesses no oplocks on the file at all. If OplockLevel is 1, the client possesses a Level II oplock. The client is expected to flush any dirty buffers to the server, submit any file locks, and respond to the server with either an SMB_LOCKING_ANDX SMB having the LOCKING_ANDX_OPLOCK_RELEASE flag set, or with a file close if the file is no longer in use by the client. If the client sends an SMB_LOCKING_ANDX SMB with the LOCKING_ANDX_OPLOCK_RELEASE flag set and NumberOfLocks is zero, the server does not send a response. Since a close being sent to the server and break oplock notification from the server could cross on the wire, if the client gets an oplock notification on a file that it does not have open, that notification should be ignored.

Due to timing, the client could get an "oplock broken" notification in a user's data buffer as a result of this notification crossing on the wire with an SMB_COM_READ_RAW request. The client must detect this (use length of msg, "FFSMB," MID of -1 and Command of SMB_COM_LOCKING_ANDX) and honor the "oplock broken" notification as usual. The server must also note on receipt of an SMB_COM_READ_RAW request that there is an outstanding (unanswered) "oplock broken" notification to the client; it must then return a zero length response denoting failure of the read raw request. The client should (after responding to the "oplock broken" notification), use a standard read protocol to redo the read request. This allows a file to actually contain data matching an "oplock broken" notification and still be read correctly.

The entire message sent and received including the optional second protocol must fit in the negotiated maximum transfer size. The following are the only valid SMB commands for AndXCommand for SMB_COM_LOCKING_ANDX:

SMB_COM_READ SMB_COM_READ_ANDX
SMB_COM_WRITE SMB_COM_WRITE_ANDX
SMB_COM_FLUSH

4.2.6.1 Errors

ERRDOS/ERRbadfile
ERRDOS/ERRbadfid
ERRDOS/ERRlock
ERRDOS/ERRinvdevice
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.7 SEEK: Seek in File

The seek message is sent to set the current file pointer for Fid.

Client Request
===================
Description
=========================
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
LONG Offset; Relative offset
USHORT ByteCount; Count of data bytes = 0

The starting point of the seek is set by Mode:

0 seek from start of file
1 seek from current file pointer
2 seek from end of file

The "current position" reflects the offset plus data length specified in the previous read, write, or seek request; and the pointer set by this command will be replaced by the offset specified in the next read, write, or seek command.

Server Response
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 2
ULONG Offset; Offset from start of file
USHORT ByteCount; Count of data bytes = 0

The response returns the new file pointer in Offset, which is expressed as the offset from the start of the file, and may be beyond the current end of file. An attempt to seek to before the start of file sets the current file pointer to start of the file.

This request should generally be issued only by clients wishing to find the size of a file, because all read and write requests include the read or write file position as part of the SMB. This request is inappropriate for very large files, as the offsets specified are only 32 bits. A seek that results in an Offset that cannot be expressed in 32 bits returns the least significant.

4.2.7.1 Errors

ERRDOS/ERRbadfid
ERRDOS/ERRnoaccess
ERRSRV/ERRinvdevice
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.8 FLUSH: Flush File

The flush SMB is sent to ensure all data and allocation information for the corresponding file has been written to stable storage. When the Fid has a value -1 (hex FFFF), the server performs a flush for all file handles associated with the client and Pid. The response is not sent until the writes are complete.

Client Request
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 1
USHORT Fid; File handle
USHORT ByteCount; Count of data bytes = 0

This client request is probably expensive to perform at the server, because the server's operating system is generally scheduling disk writes in a way that is optimal for the system's read and write activity integrated over the entire population of clients. This message from a client "interferes" with the server's ability to optimally schedule the disk activity; clients are discouraged from overuse of this SMB request.

Server Response
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

4.2.8.1 Errors

ERRDOS/ERRbadfid
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.9 CLOSE: Close File

The close message is sent to invalidate a file handle for the requesting process. All locks or other resources held by the requesting process on the file should be released by the server. The requesting process can no longer use Fid for further file access requests.

Client Request
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 3
USHORT Fid; File handle
UTIME LastWriteTime Time of last write
USHORT ByteCount; Count of data bytes = 0

If LastWriteTime is 0, the server should allow its local operating system to set the file's times. Otherwise, the server should set the time to the values requested. Failure to set the times, even if requested by the client in the request message, should not result in an error response from the server.

If Fid refers to a print spool file, the file should be spooled to the printer at this time.

Server Response
===================
Description
=========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

4.2.9.1 Errors

ERRDOS/ERRbadfid
ERRSRV/ERRinvdevice
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.10 DELETE: Delete File

The delete file message is sent to delete a data file. The appropriate Tid and additional pathname are passed. Read only files may not be deleted, the read-only attribute must be reset prior to file deletion.

Client Request
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 1
USHORT SearchAttributes;
USHORT ByteCount; Count of data bytes;  min = 2
UCHAR BufferFormat; 0x04
STRING FileName[]; File name

Multiple files may be deleted in response to a single request, as SMB_COM_DELETE supports wildcards.

SearchAttributes indicates the attributes that the target file(s) must have. If the attribute is zero, then only normal files are deleted. If the system file or hidden attributes are specified, then the delete is inclusive—both the specified type(s) of files and normal files are deleted. Attributes are described in Section 3.11, File Attribute Encoding.

If bit0 of the Flags2 field of the SMB header is set, a pattern is passed in, and the file has a long name, then the passed pattern must match the long file name for the delete to succeed. If bit0 is clear, a pattern is passed in, and the file has a long name, then the passed pattern must match the file's short name for the deletion to succeed.

Server Response
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

4.2.10.1 Errors

ERRDOS/ERRbadpath
ERRDOS/ERRbadfile
ERRDOS/ERRnoaccess
ERRHRD/ERRnowrite
ERRSRV/ERRaccess
ERRSRV/ERRinvdevice
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.11 RENAME: Rename File

The rename file message is sent to change the name of a file.

Client Request
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 1
USHORT SearchAttributes; Target file attributes
USHORT ByteCount; Count of data bytes;  min = 4
UCHAR BufferFormat1; 0x04
STRING OldFileName[]; Old file name
UCHAR BufferFormat2; 0x04
STRING NewFileName[]; New file name

Files OldFileName must exist and NewFileName must not. Both pathnames must be relative to the Tid specified in the request. Open files may be renamed.

Multiple files may be renamed in response to a single request, as Rename File supports wildcards in the file name (last component of the pathname).

SearchAttributes indicates the attributes that the target file(s) must have. If SearchAttributes is zero, then only normal files are renamed. If the system file or hidden attributes are specified, then the rename is inclusive—both the specified type(s) of files and normal files are renamed. The encoding of SearchAttributes is described in Section 3.11, File Attribute Encoding.

Server Response
===================
Description
=========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

4.2.11.1 Errors

ERRDOS/ERRbadpath
ERRDOS/ERRbadfile
ERRDOS/ERRnoaccess
ERRDOS/ERRdiffdevice
ERRHRD/ERRnowrite
ERRSRV/ERRaccess
ERRSRV/ERRinvdevice
ERRSRV/ERRinvid
ERRSRV/ERRbaduid

4.2.12 MOVE: Rename File

The source file is copied to the destination, and the source is subsequently deleted.

Client Request
===================
Description
===========================
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 Format1; 0x04
STRING OldFileName[]; Old file name
UCHAR FormatNew; 0x04
STRING NewFileName[]; New file name

OldFileName is copied to NewFileName, then OldFileName is deleted. Both OldFileName and NewFileName must refer to paths on the same server. NewFileName can refer to either a file or a directory. All file components except the last must exist; directories will not be created.

NewFileName can be required to be a file or a directory by the Flags field.

The Tid in the header is associated with the source while Tid2 is associated with the destination. These fields may contain the same or differing valid values. Tid2 can be set to –1, indicating that this is to be the same Tid as in the SMB header. This allows use of the move protocol with SMB_TREE_CONNECT_ANDX.

Server Response
===================
Description
===========================
UCHAR WordCount; Count of parameter words = 1
USHORT Count; Number of files moved
USHORT ByteCount; Count of data bytes;  min = 0
UCHAR ErrorFileFormat; 0x04 (only if error)
STRING ErrorFileName[]; Pathname of file where error occurred

The source path must refer to an existing file or files. Wildcards are permitted. Source files specified by wildcards are processed until an error is encountered. If an error is encountered, the expanded name of the file is returned in ErrorFileName. Wildcards are not permitted in NewFileName.

OpenFunction controls what should happen if the destination file exists. If (OpenFunction & 0x30) == 0, the operation should fail if the destination exists. If (OpenFunction & 0x30) == 0x20, the destination file should be overwritten.

4.2.12.1 Errors

ERRDOS/ERRfilexists
ERRDOS/ERRbadfile
ERRDOS/ERRnoaccess
ERRDOS/ERRnofiles
ERRDOS/ERRbadshare
ERRHRD/ERRnowrite
ERRSRV/ERRnoaccess
ERRSRV/ERRinvdevice
ERRSRV/ERRinvid
ERRSRV/ERRbaduid
ERRSRV/ERRnosupport
ERRSRV/ERRaccess

4.2.13 COPY: Copy File

Client Request
===================
Description
=========================
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 be 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 SourceFileNameFormat; 0x04
STRING SourceFileName; Pathname of source file
UCHAR TargetFileNameFormat; 0x04
STRING TargetFileName; Pathname of target file

The file at SourceName is copied to TargetFileName, both of which must refer to paths on the same server.

The Tid in the header is associated with the source while Tid2 is associated with the destination. These fields may contain the same or differing valid values. Tid2 can be set to –1, indicating that this is to be the same Tid as in the SMB header. This allows use of the move protocol with SMB_TREE_CONNECT_ANDX.

Server Response
===================
Description
=========================
UCHAR WordCount; Count of parameter words = 1
USHORT Count; Number of files copied
USHORT ByteCount; Count of data bytes;  min = 0
UCHAR ErrorFileFormat; 0x04 (only if error)
STRING ErrorFileName;

The source path must refer to an existing file or files. Wildcards are permitted. Source files specified by wildcards are processed until an error is encountered. If an error is encountered, the expanded name of the file is returned in ErrorFileName. Wildcards are not permitted in TargetFileName. TargetFileName can refer to either a file or a directory.

The destination can be required to be a file or a directory by the bits in Flags. If neither bit0 nor bit1 is set, the destination may be either a file or a directory. Flags also controls the copy mode. In a binary copy for the source, the copy stops the first time an end of file (EOF) (control-Z) is encountered. In a binary copy for the target, the server must make sure that there is exactly one EOF in the target file and that it is the last character of the file.

If the destination is a file and the source contains wildcards, the destination file will either be truncated or appended to at the start of the operation, depending on bits in OpenFunction. Subsequent files will then be appended to the file.

If the negotiated dialect is LM1.2X002 or later, bit5 of Flags is used to specify a tree copy on the remote server. When this option is selected, the destination must not be an existing file, and the source mode must be binary. A request with bit5 set and either bit0 or bit3 set is therefore an error. When the tree copy mode is selected, the Count field in the server response is undefined.

4.2.13.1 Errors

ERRDOS/ERRfilexists
ERRDOS/ERRshare
ERRDOS/ERRnofids
ERRDOS/ERRbadfile
ERRDOS/ERRnoaccess
ERRDOS/ERRnofiles
ERRDOS/ERRbadshare
ERRSRV/ERRnoaccess
ERRSRV/ERRinvdevice
ERRSRV/ERRinvid
ERRSRV/ERRbaduid
ERRSRV/ERRaccess

4.2.14 TRANS2_QUERY_PATH_INFORMATION: Get File Attributes Given Path

This request is used to get information about a specific file or subdirectory.

Client Request
====================
Value
========================
WordCount 15
MaxSetupCount 0
SetupCount 1
Setup[0] TRANS2_QUERY_PATH_INFORMATION
Parameter Block Encoding
====================
Description
========================
USHORT InformationLevel; Level of information requested
ULONG Reserved; Must be zero
STRING FileName; File or directory name

The following InformationLevels may be requested:

Information Level
====================
Value
====
SMB_INFO_STANDARD 1
SMB_INFO_QUERY_EA_SIZE 2
SMB_INFO_QUERY_EAS_FROM_LIST 3
SMB_INFO_QUERY_ALL_EAS 4
SMB_INFO_IS_NAME_VALID 6
SMB_QUERY_FILE_BASIC_INFO 0x101
SMB_QUERY_FILE_STANDARD_INFO 0x102
SMB_QUERY_FILE_EA_INFO 0x103
SMB_QUERY_FILE_NAME_INFO 0x104
SMB_QUERY_FILE_ALL_INFO 0x107
SMB_QUERY_FILE_ALT_NAME_INFO 0x108
SMB_QUERY_FILE_STREAM_INFO 0x109
SMB_QUERY_FILE_COMPRESSION_INFO 0x10B

The requested information is placed in the Data portion of the transaction response. For the information levels greater than 0x100, the transaction response has 1 parameter word that should be ignored by the client.

The following sections describe the InformationLevel dependent encoding of the data part of the transaction response.

4.2.14.1 SMB_INFO_STANDARD & SMB_INFO_QUERY_EA_SIZE

Data Block Encoding
===================
Description
=========================
SMB_DATE CreationDate; Date when file was created
SMB_TIME CreationTime; Time when file was created
SMB_DATE LastAccessDate; Date of last file access
SMB_TIME LastAccessTime; Time of last file access
SMB_DATE LastWriteDate; Date of last write to the file
SMB_TIME LastWriteTime; Time of last write to the file
ULONG DataSize; File Size
ULONG AllocationSize; Size of file system allocation unit
USHORT Attributes; File Attributes
ULONG EaSize; Size of file's EA information (SMB_INFO_QUERY_EA_SIZE)

4.2.14.2 SMB_INFO_QUERY_EAS_FROM_LIST & SMB_INFO_QUERY_ALL_EAS

Response Field
================
Value
=============================
MaxDataCount Length of EAlist found (minimum value is 4)
Parameter Block
Encoding
================
Description

=============================
USHORT EaErrorOffset Offset into EAList of EA error
Data Block Encoding
================
Description
=============================
ULONG ListLength; Length of the remaining data
UCHAR EaList[] The extended attributes list

4.2.14.3 SMB_INFO_IS_NAME_VALID

This requests checks to see if the name of the file contained in the request's Data field has a valid path syntax. No parameters or data are returned on this information request. An error is returned if the syntax of the name is incorrect. Success indicates the server accepts the path syntax, but it does not ensure that the file or directory actually exists.

4.2.14.4 SMB_QUERY_FILE_BASIC_INFO

Data Block Encoding
====================
Description
==========================
LARGE_INTEGER CreationTime; Time when file was created
LARGE_INTEGER LastAccessTime; Time of last file access
LARGE_INTEGER LastWriteTime; Time of last write to the file
LARGE_INTEGER ChangeTime Time when file was last changed
USHORT Attributes; File Attributes

4.2.14.5 SMB_QUERY_FILE_STANDARD_INFO

Data Block Encoding
====================
Description
==========================
LARGE_INTEGER AllocationSize Allocated size of the file in number of bytes
LARGE_INTEGER EndofFile; Offset to the first free byte in the file
ULONG NumberOfLinks Number of hard links to the file
BOOLEAN DeletePending Indicates whether the file is marked for deletion
BOOLEAN Directory Indicates whether the file is a directory

4.2.14.6 SMB_QUERY_FILE_EA_INFO

Data Block Encoding
===================
Description
=========================
ULONG EASize Size of the file's extended attributes in number of bytes

4.2.14.7 SMB_QUERY_FILE_NAME_INFO

Data Block Encoding
===================
Description
=========================
ULONG FileNameLength Length of the file name in number of bytes
STRING FileName Name of the file

4.2.14.8 SMB_QUERY_FILE_ALL_INFO

Data Block Encoding
===================
Description
========================
LARGE_INTEGER CreationTime; Time when file was created
LARGE_INTEGER LastAccessTime; Time of last file access
LARGE_INTEGER LastWriteTime; Time of last write to the file
LARGE_INTEGER ChangeTime Time when file was last changed
USHORT Attributes; File Attributes
LARGE_INTEGER AllocationSize Allocated size of the file in number of bytes
LARGE_INTEGER EndofFile; Offset to the first free byte in the file
ULONG NumberOfLinks Number of hard links to the file
BOOLEAN DeletePending Indicates whether the file is marked for deletion
BOOLEAN Directory Indicates whether the file is a directory
LARGE_INTEGER Index Number A file system unique identifier
ULONG EASize Size of the file's extended attributes in number of bytes
ULONG AccessFlags Access that a caller has to the file; Possible values and meanings are specified below
LARGE_INTEGER Index Number A file system unique identifier
LARGE_INTEGER CurrentByteOffset Current byte offset within the file
ULONG Mode Current Open mode of the file handle to the file; possible values and meanings are detailed below
ULONG AlignmentRequirement Buffer Alignment required by device; possible values detailed below
ULONG FileNameLength Length of the file name in number of bytes
STRING FileName Name of the file

The AccessFlags specifies the access permissions a caller has to the file and can have any suitable combination of the following values:

 Value Meaning
FILE_READ_DATA 0x00000001 Data can be read from the file.
FILE_WRITE_DATA 0x00000002 Data can be written to the file.
FILE_APPEND_DATA 0x00000004 Data can be appended to the file.
FILE_READ_EA 0x00000008 Extended attributes associated with the file can be read.
FILE_WRITE_EA 0x00000010 Extended attributes associated with the file can be written.
FILE_EXECUTE 0x00000020 Data can be read into memory from the file using system paging I/O.
FILE_READ_ATTRIBUTES 0x00000080 Attributes associated with the file can be read.
FILE_WRITE_ATTRIBUTES 0x00000100 Attributes associated with the file can be written.
DELETE 0x00010000 The file can be deleted.
READ_CONTROL 0x00020000 The access control list and ownership associated with the file can be read.
WRITE_DAC 0x00040000 The access control list and ownership associated with the file can be written.
WRITE_OWNER 0x00080000 Ownership information associated with the file can be written.
SYNCHRONIZE 0x00100000 The file handle can be waited on to synchronize with the completion of an input/output request

The Mode field specifies the mode in which the file is currently opened. The possible values may be a suitable and logical combination of the following:

Value Meaning
FILE_WRITE_THROUGH 0x00000002 File is opened in mode where data is written to file before the driver completes a write request.
FILE_SEQUENTIAL_ONLY 0x00000004 All access to the file is sequential.
FILE_SYNCHRONOUS_IO_ALERT 0x00000010 All operations on the file are performed synchronously.
FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 All operations on the file are to be performed synchronously. Waits in the system to synchronize I/O queuing and completion are not subject to alerts.

The AlignmentRequirement field specifies buffer alignment required by the device and can have any one of the following values:

 Value   Meaning
FILE_BYTE_ALIGNMENT 0x00000000 The buffer needs to be aligned on a byte boundary.
FILE_WORD_ALIGNMENT 0x00000001 The buffer needs to be aligned on a word boundary.
FILE_LONG_ALIGNMENT 0x00000003 The buffer needs to be aligned on a 4-byte boundary.
FILE_QUAD_ALIGNMENT 0x00000007 The buffer needs to be aligned on an 8-byte boundary.
FILE_OCTA_ALIGNMENT 0x0000000f The buffer needs to be aligned on a 16-byte boundary.
FILE_32_BYTE_ALIGNMENT 0x0000001f The buffer needs to be aligned on a 32-byte boundary.
FILE_64_BYTE_ALIGNMENT 0x0000003f The buffer needs to be aligned on a 64-byte boundary.
FILE_128_BYTE_ALIGNMENT 0x0000007f The buffer needs to be aligned on a 128-byte boundary.
FILE_256_BYTE_ALIGNMENT 0x000000ff The buffer needs to be aligned on a 256-byte boundary.
FILE_512_BYTE_ALIGNMENT 0x000001ff The buffer needs to be aligned on a 512-byte boundary.

4.2.14.9 SMB_QUERY_FILE_ALT_NAME_INFO

Data Block Encoding
===================
Description
=========================
ULONG FileNameLength Length of the file name in number of bytes
STRING FileName Name of the file

4.2.14.10 SMB_QUERY_FILE_STREAM_INFO

Data Block Encoding
===================
Description
=========================
ULONG NextEntryOffset Offset to the next entry (in bytes)
ULONG StreamNameLength Length of the stream name in number of bytes
LARGE_INTEGER StreamSize Size of the stream in number of bytes
LARGE_INTEGER StreamAllocationSize Allocated size of the stream in number of bytes
STRING FileName Name of the stream

4.2.14.11 SMB_QUERY_FILE_COMPRESSION_INFO

Data Block Encoding
===================
Description
=========================
LARGE_INTEGER CompressedFileSize Size of the compressed file in number of bytes
USHORT CompressionFormat A constant signifying the compression algorithm used. Possible values are:

0—There is no compression

2—Compression Format is LZNT

UCHAR CompressionUnitShift
UCHAR ChunkShift stored in log2 format. 1<<ChunkShift = ChunkSizeInBytes
UCHAR ClusterShift indicates how much space must be saved to successfully compress a compression unit
UCHAR Reserved[3]

4.2.15 TRANS2_QUERY_FILE_INFORMATION: Get File Attributes Given FID

This request is used to get information about a specific file or subdirectory given a handle to it.

Client Request
===================
Value
=========================
WordCount 15
MaxSetupCount 0
SetupCount 1
Setup[0] TRANS2_QUERY_FILE_INFORMATION
Parameter Block Encoding
===================
Description
=========================
USHORT Fid; Handle of file for request
USHORT InformationLevel; Level of information requested

The available information levels, as well as the format of the response are identical to TRANS2_QUERY_PATH_INFORMATION.

4.2.16 TRANS2_SET_PATH_INFORMATION: Set File Attributes Given Path

This request is used to set information about a specific file or subdirectory.

Client Request
===================
Value
=========================
WordCount 15
MaxSetupCount 0
SetupCount 1
Setup[0] TRANS2_SET_PATH_INFORMATION
Parameter Block Encoding
===================
Description
=========================
USHORT InformationLevel; Level of information to set
ULONG Reserved; Must be zero
STRING FileName; File or directory name

The following Information Levels may be set:

Information Level
===================
Value
=========================
SMB_INFO_STANDARD 1
SMB_INFO_QUERY_EA_SIZE 2
SMB_INFO_QUERY_ALL_EAS 4

The response formats are:

4.2.16.1 SMB_INFO_STANDARD & SMB_INFO_QUERY_EA_SIZE

Parameter Block
Encoding
===================
Description

=========================
USHORT Reserved 0
Data Block Encoding
===================
Description
=========================
SMB_DATE CreationDate; Date when file was created
SMB_TIME CreationTime; Time when file was created
SMB_DATE LastAccessDate; Date of last file access
SMB_TIME LastAccessTime; Time of last file access
SMB_DATE LastWriteDate; Date of last write to the file
SMB_TIME LastWriteTime; Time of last write to the file
ULONG DataSize; File Size
ULONG AllocationSize; Size of file system allocation unit
USHORT Attributes; File Attributes
ULONG EaSize; Size of file's EA information (SMB_INFO_QUERY_EA_SIZE)

4.2.16.2 SMB_INFO_QUERY_ALL_EAS

Response Field
================
Value
=============================
MaxDataCount Length of FEAlist found (minimum value is 4)
Parameter Block
Encoding
================
Description

=============================
USHORT EaErrorOffset Offset into EAList of EA error
Data Block
Encoding
================
Description

=============================
ULONG ListLength; Length of the remaining data
UCHAR EaList[] The extended attributes list

4.2.17 TRANS2_SET_FILE_INFORMATION: Set File Attributes Given FID

This request is used to set information about a specific file or subdirectory given a handle to the file or subdirectory.

Client Request
===================
Value
==========================
WordCount 15
MaxSetupCount 0
SetupCount 1
Setup[0] TRANS2_SET_FILE_INFORMATION
Parameter Block Encoding
===================
Description
==========================
USHORT Fid; Handle of file for request
USHORT InformationLevel; Level of information requested
USHORT Reserved; Ignored by the server

The following InformationLevels may be set:

Information Level
=======================
Value
====
SMB_INFO_STANDARD 1
SMB_INFO_QUERY_EA_SIZE 2
SMB_SET_FILE_BASIC_INFO 0x101
SMB_SET_FILE_DISPOSITION_INFO 0x102
SMB_SET_FILE_ALLOCATION_INFO 0x103
SMB_SET_FILE_END_OF_FILE_INFO 0x104

The two levels below 0x101 are as described in the NT_SET_PATH_INFORMATION transaction. The requested information is placed in the Data portion of the transaction response. For the information levels greater than 0x100, the transaction response has 1 parameter word that should be ignored by the client.

4.2.17.1 SMB_FILE_DISPOSITION_INFO

Response Field
===============
Value
==============================
BOOLEAN FileIsDeleted A boolean that is TRUE if the file is marked for deletion

4.2.17.2 SMB_FILE_ALLOCATION_INFO

Response Field
===============
Value
==============================
LARGE_INTEGER File Allocation size in number of bytes

4.2.17.3 SMB_FILE_END_OF_FILE_INFO

Response Field
================
Value
=============================
LARGE_INTEGER The total number of bytes that need to be traversed from the beginning of the file in order to locate the end of the file

4.3 Directory Requests

4.3.1 TRANS2_CREATE_DIRECTORY: Create Directory (with Optional EAs)

This requests the server to create a directory relative to Tid in the SMB header, optionally assigning extended attributes to it.

Client Request
===================
Value
==========================
WordCount 15
MaxSetupCount 0
SetupCount 1
Setup[0] TRANS2_CREATE_DIRECTORY
Parameter Block Encoding
===================
Description
==========================
ULONG Reserved; Reserved—must be zero
STRING Name[]; Directory name to create
UCHAR Data[]; Optional FEAList for the new directory

Response Parameter Block
===================
Description
==========================
USHORT EaErrorOffset Offset into FEAList of first error that occurred while setting EAs

4.3.2 DELETE_DIRECTORY: Delete Directory

The delete directory message is sent to delete an empty directory. The appropriate Tid and additional pathname are passed. The directory must be empty for it to be deleted.

Client Request
====================
Description
===========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes;  min = 2
UCHAR BufferFormat; 0x04
STRING DirectoryName[]; Directory name

The directory to be deleted cannot be the root of the share specified by Tid.

Server Response
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

4.3.3 CHECK_DIRECTORY: Check Directory

This SMB is used to verify that a path exists and is a directory. No error is returned if the given path exists and the client has read access to it. Client machines that maintain a concept of a "working directory" will find this useful to verify the validity of a "change working directory" command.

Note   The servers do not have a concept of working directory for a particular client. The client must always supply full pathnames relative to the Tid in the SMB header.

Client Request
===================
Description
==========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes;  min = 2
UCHAR BufferFormat; 0x04
STRING DirectoryPath[]; Directory path

Server Response
==================
Description
==========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

DOS clients, in particular, depend on the SMB_ERR_BAD_PATH return code if the directory is not found.

4.3.3.1 Errors

ERRDOS/ERRbadfile
ERRDOS/ERRbadpath
ERRDOS/ERRnoaccess
ERRHRD/ERRdata
ERRSRV/ERRinvid
ERRSRV/ERRbaduid
ERRSRV/ERRaccess

4.3.4 TRANS2_FIND_FIRST2: Search Directory Using Wildcards

Client Request
===================
Value
==========================
WordCount 15
TotalDataCount Total size of extended attribute list
SetupCount 1
Setup[0] TRANS2_FIND_FIRST2
Parameter Block Encoding
===================
Description
==========================
USHORT SearchAttributes;
USHORT SearchCount; Maximum number of entries to return
USHORT Flags; Additional information:
Bit 0—close search after this request
Bit 1—close search if end of search reached
Bit 2—return resume keys for each entry found
Bit 3—continue search from previous ending place
Bit 4—find with backup intent
USHORT InformationLevel; See below
ULONG SearchStorageType;
STRING FileName; Pattern for the search
UCHAR Data[ TotalDataCount ] FEAList if InformationLevel is QUERY_EAS_FROM_LIST

Response Parameter Block
===================
Description
==========================
USHORT Sid; Search handle
USHORT SearchCount; Number of entries returned
USHORT EndOfSearch; Was last entry returned?
USHORT EaErrorOffset; Offset into EA list if EA error
USHORT LastNameOffset; Offset into data to file name of last entry, if server needs it to resume search; else 0
UCHAR Data[ TotalDataCount ] Level-dependent info about the matches found in the search

This request allows the client to search for the file(s) that match the file specification. The search can be continued if necessary with TRANS2_FIND_NEXT2. Numerous levels of information may be obtained for the returned files; the desired level is specified in the InformationLevel field of the request.

InformationLevel Name
==================
Value
================
SMB_INFO_STANDARD 1
SMB_INFO_QUERY_EA_SIZE 2
SMB_INFO_QUERY_EAS_FROM_LIST 3
SMB_FIND_FILE_DIRECTORY_INFO 0x101
SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102
SMB_FIND_FILE_NAMES_INFO 0x103
SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104

The following sections detail the data returned for each InformationLevel. The requested information is placed in the Data portion of the transaction response.

Note   A client that does not support long names can only request SMB_INFO_STANDARD.

A four-byte resume key precedes each data item (described below) if bit 2 in the Flags field is set, i.e., if the request indicates the server should return resume keys.

4.3.4.1 SMB_INFO_STANDARD

Response Field
===================
Description
=========================
SMB_DATE CreationDate; Date when file was created
SMB_TIME CreationTime; Time when file was created
SMB_DATE LastAccessDate; Date of last file access
SMB_TIME LastAccessTime; Time of last file access
SMB_DATE LastWriteDate; Date of last write to the file
SMB_TIME LastWriteTime; Time of last write to the file
ULONG DataSize; File Size
ULONG AllocationSize; Size of file system allocation unit
USHORT Attributes; File Attributes
UCHAR FileNameLength; Length of filename in bytes
STRING FileName; Name of found file

4.3.4.2 SMB_INFO_QUERY_EA_SIZE

Response Field
===================
Description
=========================
SMB_DATE CreationDate; Date when file was created
SMB_TIME CreationTime; Time when file was created
SMB_DATE LastAccessDate; Date of last file access
SMB_TIME LastAccessTime; Time of last file access
SMB_DATE LastWriteDate; Date of last write to the file
SMB_TIME LastWriteTime; Time of last write to the file
ULONG DataSize; File Size
ULONG AllocationSize; Size of file system allocation unit
USHORT Attributes; File Attributes
ULONG EaSize; Size of file's EA information
UCHAR FileNameLength; Length of filename in bytes
STRING FileName; Name of found file

4.3.4.3 SMB_INFO_QUERY_EAS_FROM_LIST

This request returns the same information as SMB_INFO_QUERY_EA_SIZE, but only for files that have an extended attributes (EA) list that matches the EA information in the Data part of the request.

4.3.4.4 SMB_FIND_FILE_DIRECTORY_INFO

Response Field
===================
Description
==========================
ULONG NextEntryOffset; Offset from this structure to beginning of next one
ULONG FileIndex;
LARGE_INTEGER CreationTime; file creation time
LARGE_INTEGER LastAccessTime; last access time
LARGE_INTEGER LastWriteTime; last write time
LARGE_INTEGER ChangeTime; last attribute change time
LARGE_INTEGER EndOfFile; file size
LARGE_INTEGER AllocationSize; size of file system allocation information
ULONG ExtFileAttributes; Extended File Attribute Encoding (see Section 3.12)
ULONG FileNameLength; Length of filename in bytes
STRING FileName; Name of the file

4.3.4.5 SMB_FIND_FILE_FULL_DIRECTORY_INFO

Response Field
===================
Description
==========================
ULONG NextEntryOffset; Offset from this structure to beginning of next one
ULONG FileIndex;
LARGE_INTEGER CreationTime; file creation time
LARGE_INTEGER LastAccessTime; last access time
LARGE_INTEGER LastWriteTime; last write time
LARGE_INTEGER ChangeTime; last attribute change time
LARGE_INTEGER EndOfFile; file size
LARGE_INTEGER AllocationSize; size of file system allocation information
ULONG ExtFileAttributes; Extended File Attribute Encoding (see Section 3.12)
ULONG FileNameLength; Length of filename in bytes
ULONG EaSize; Size of file's extended attributes
STRING FileName; Name of the file

4.3.4.6 SMB_FIND_FILE_BOTH_DIRECTORY_INFO

Response Field
===================
Description
==========================
ULONG NextEntryOffset; Offset from this structure to beginning of next one
ULONG FileIndex;
LARGE_INTEGER CreationTime; file creation time
LARGE_INTEGER LastAccessTime; last access time
LARGE_INTEGER LastWriteTime; last write time
LARGE_INTEGER ChangeTime; last attribute change time
LARGE_INTEGER EndOfFile; file size
LARGE_INTEGER AllocationSize; size of file system allocation information
ULONG ExtFileAttributes; Extended File Attribute Encoding (see Section 3.12)
ULONG FileNameLength; Length of FileName in bytes
ULONG EaSize; Size of file's extended attributes
UCHAR ShortNameLength; Length of file's short name in bytes
UCHAR Reserved
WCHAR ShortName[12]; File's 8.3 conformant name in Unicode
STRING FileName; Files full length name

4.3.4.7 SMB_FIND_FILE_NAMES_INFO

Response Field
===================
Description
==========================
ULONG NextEntryOffset; Offset from this structure to beginning of next one
ULONG FileIndex;
ULONG FileNameLength; Length of FileName in bytes
STRING FileName; Files full length name

4.3.5 TRANS2_FIND_NEXT2: Resume Directory Search Using Wildcards

This request resumes a search that was begun with a previous TRANS2_FIND_FIRST2 request.

Client Request
===================
Value
==========================
WordCount 15
SetupCount 1
Setup[0] TRANS2_FIND_NEXT2
Parameter Block Encoding
===================
Description
==========================
USHORT Sid; Search handle
USHORT SearchCount; Maximum number of entries to return
USHORT InformationLevel; Levels described in TRANS2_FIND_FIRST2 request
ULONG ResumeKey; Value returned by previous find2 call
USHORT Flags; Additional information: bit set-
0—close search after this request
1—close search if end of search reached
2—return resume keys for each entry found
3—resume/continue from previous ending place
4—find with backup intent
STRING FileName; Resume file name

Sid is the value returned by a previous successful TRANS2_FIND_FIRST2 call. If Bit3 of Flags is set, then FileName may be the NULL string, because the search is continued from the previous TRANS2_FIND request. Otherwise, FileName must not be more than 256 characters long.

Response Field
===================
Description
=========================
USHORT SearchCount; Number of entries returned
USHORT EndOfSearch; Was last entry returned?
USHORT EaErrorOffset; Offset into EA list if EA error
USHORT LastNameOffset; Offset into data to file name of last entry, if server needs it to resume search; else 0
UCHAR Data[TotalDataCount] Level-dependent info about the matches found in the search

4.3.6 FIND_CLOSE2: Close Directory Search

This SMB closes a search started by the TRANS2_FIND_FIRST2 transaction request.

Client Request
====================
Description
=========================
UCHAR WordCount; Count of parameter words = 1
USHORT Sid; Find handle
USHORT ByteCount; Count of data bytes = 0

Server Response
====================
Description
=========================
UCHAR WordCount; Count of parameter words = 0
USHORT ByteCount; Count of data bytes = 0

4.3.6.1 Errors

ERRDOS/ERRbadfid
ERRSRV/ERRinvid
ERRSRV/ERRaccess

4.3.7 NT_TRANSACT_NOTIFY_CHANGE: Request Change Notification

Client Setup Words
===================
Description
=========================
ULONG CompletionFilter; Specifies operation to monitor
USHORT Fid; Fid of directory to monitor
BOOLEAN WatchTree; TRUE = watch all subdirectories too
UCHAR Reserved; MBZ

This command notifies the client when the directory specified by Fid is modified. It also returns the name(s) of the file(s) that changed. The command completes once the directory has been modified based on the supplied CompletionFilter. The command is a "single shot" and therefore needs to be reissued to watch for more directory changes.

A directory file must be opened before this command may be used. Once the directory is open, this command may be used to begin watching files and subdirectories in the specified directory for changes. The first time the command is issued, the MaxParameterCount field in the transact header determines the size of the buffer that will be used at the server to buffer directory change information between issuances of the notify change commands.

When a change in the CompletionFilter is made to the directory, the command completes. The names of the files that have changed since the last time the command was issued are returned to the client. The ParameterCount field of the response indicates the number of bytes that are being returned. If too many files have changed since the last time the command was issued, then zero bytes are returned, and an alternate status code is returned in the Status field of the response.

The CompletionFilter is a mask created as the sum of any of the following flags:

FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
FILE_NOTIFY_CHANGE_NAME 0x00000003
FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
FILE_NOTIFY_CHANGE_SIZE 0x00000008
FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
FILE_NOTIFY_CHANGE_CREATION 0x00000040
FILE_NOTIFY_CHANGE_EA 0x00000080
FILE_NOTIFY_CHANGE_SECURITY 0x00000100
FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800

Server Response
====================
Description
===========================
ParameterCount # of bytes of change data
Parameters[ ParameterCount ] FILE_NOTIFY_INFORMATION structures

The response contains FILE_NOTIFY_INFORMATION structures, as defined below. The NextEntryOffset field of the structure specifies the offset, in bytes, from the start of the current entry to the next entry in the list. If this is the last entry in the list, this field is zero. Each entry in the list must be longword aligned, so NextEntryOffset must be a multiple of four.

typedef struct {
    ULONG NextEntryOffset;
    ULONG Action;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION;

Where Action describes what happened to the file named FileName:

FILE_ACTION_ADDED 0x00000001
FILE_ACTION_REMOVED 0x00000002
FILE_ACTION_MODIFIED 0x00000003
FILE_ACTION_RENAMED_OLD_NAME 0x00000004
FILE_ACTION_RENAMED_NEW_NAME 0x00000005
FILE_ACTION_ADDED_STREAM 0x00000006
FILE_ACTION_REMOVED_STREAM 0x00000007
FILE_ACTION_MODIFIED_STREAM 0x00000008

4.4 Dfs Operations

4.4.1 TRANS2_GET_DFS_REFERRAL: Retrieve Distributed File System Referral

The client sends this request to ask the server to convert RequestFilename into an alternate name for this file. This request can be sent to the server if the server response to the NEGOTIATE SMB included the CAP_DFS capability. The TID of the request must be IPC$. Bit15 of Flags2 in the SMB header must be set, indicating this is a UNICODE request.

Client Request
==================
Description
===========================
WordCount 15
TotalDataCount 0
SetupCount 1
Setup[0] TRANS2_GET_DFS_REFERRAL
Parameter Block Encoding
===================
Description
===========================
USHORT MaxReferralLevel Latest referral version number understood
WCHAR RequestFileName; Dfs name of file for which referral is sought

Response Data Block
===================
Description
===========================
USHORT PathConsumed; Number of RequestFilename bytes client
USHORT NumberOfReferrals; Number of referrals contained in this response
USHORT Flags; bit0—The servers in Referrals are capable of fielding TRANS2_GET_DFS_REFERRAL.

bit1—The servers in Referrals should hold the storage for the requested file.

REFERRAL_LIST Referrals[] Set of referrals for this file
UNICODESTRINGE Strings Used to hold the strings pointed to by Version 2 Referrals in REFERRALS.

The server response is a list of Referrals that inform the client where it should resubmit the request to obtain access to the file. PathConsumed in the response indicates to the client how many characters of RequestFilename have been consumed by the server. When the client chooses one of the referrals to use for file access, the client may need to strip the leading PathConsumed characters from the front of RequestFileName before submitting the name to the target server. Whether or not the pathname should be trimmed is indicated by the individual referral as detailed below.

Flags indicates how this referral should be treated. If bit0 is clear, any entity in the Referrals list holds the storage for RequestFileName. If bit0 is set, any entity in the Referrals list has further referral information for RequestFilename—a TRANS2_GET_DFS_REFERRAL request should be sent to an entity in the Referrals list for further resolution.

The format of an individual referral contains version and length information allowing the client to skip referrals it does not understand. MaxReferralLevel indicates to the server the latest version of referral that the client can digest. Since each referral has a uniform element, MaxReferralLevel is advisory only. Each element in Referrals has this envelope:

REFERRAL_LIST element
================================================
USHORT VersionNumber Version of this referral element
USHORT ReferralSize Size of this referral element

The following referral element versions are defined:

Version 1 Referral Element Format
================================================
USHORT ServerType Type of Node handling referral:
0—Don't know
1—SMB Service
2—Netware Server
3—Domain
USHORT ReferralFlags Flags that describe this referral:
01—Strip off PathConsumed characters before submitting RequestFileName to Node
UNICODESTRING Node Name of entity to visit next

Version 2 Referral Element Format
===============================================
USHORT ServerType Type of Node handling referral:
0—Don't know
1—SMB Service
2—Netware Server
3—Domain
USHORT ReferralFlags Flags that describe this referral:

01—Strip off PathConsumed characters before submitting RequestFileName to Node

ULONG Proximity A hint describing the proximity of this server to the client. 0 indicates the closest, higher numbers indicate increasingly "distant" servers. The number is only relevant within the context of the servers listed in this particular SMB.
ULONG TimeToLive Number of seconds for which the client can cache this referral.
USHORT DfsPathOffset Offset, in bytes from the beginning of this referral, of the Dfs Path that matched PathConsumed bytes of the RequestFileName.
USHORT DfsAlternatePathOffset Offset, in bytes from the beginning of this referral, of an alternate name (8.3 format) of the Dfs Path that matched PathConsumed bytes of the RequestFileName.
USHORT NetworkAddressOffset Offset, in bytes from the beginning of this referral, of the entity to visit next.

The CIFS protocol imposes no referral selection policy.

4.4.2 TRANS2_REPORT_DFS_INCONSISTENCY: Inform a Server about Dfs Error

As part of the Distributed Name Resolution algorithm, a Dfs client may discover a knowledge inconsistency between the referral server (i.e., the server that handed out a referral), and the storage server (i.e., the server to which the client was redirected to by the referral server). When such an inconsistency is discovered, the Dfs client optionally sends this SMB to the referral server, allowing the referral server to take corrective action.

Client Request
===================
Description
===========================
WordCount 15
MaxParameterCount 0
SetupCount 1
Setup[0] TRANS2_REPORT_DFS_INCONSISTENCY
Parameter Block Encoding
===================
Description
===========================
UNICODESTRING RequestFileName; Dfs Name of file for which referral was sought

The data part of this request contains the referral element (Version 1 format only) believed to be in error. These are encoded as described in the TRANS2_GET_DFS_REFERRAL response. If the server returns success, the client can resubmit the TRANS2_GET_DFS_REFERRAL request to this server to get a new referral. It is not mandatory for the Dfs knowledge to be automatically repaired—the client must be prepared to receive further errant referrals and must not wind up looping between this request and the TRANS2_GET_DFS_REFERRAL request.

Bit15 of Flags2 in the SMB header must be set, indicating that this is a UNICODE request.

4.5 Miscellaneous Operations

4.5.1 NT_TRANSACT_IOCTL

This command allows device and file system control functions to be transferred transparently from client to server.

Setup Words Encoding
===================
Description
==========================
ULONG FunctionCode; NT device or file system control code
USHORT Fid; Handle for io or fs control, unless BIT0 of ISFLAGS is set
BOOLEAN IsFsctl; Indicates whether the command is a device control (FALSE) or a file system control (TRUE).
UCHAR IsFlags; BIT0—command is to be applied to share root handle. Share must be a Dfs share.
Data Block Encoding
===================
Description
==========================
Data[ TotalDataCount ] Passed to the Fsctl or Ioctl

Server Response
===================
Description
==========================
SetupCount 1
Setup[0] Length of information returned by io or fs control
DataCount Length of information returned by io or fs control
Data[ DataCount ] The results of the io or fs control

4.5.2 NT_TRANSACT_QUERY_SECURITY_DESC

This command allows the client to retrieve the security descriptor on a file.

Client Parameter Block
===================
Description
==========================
USHORT Fid; FID of target
USHORT Reserved; MBZ
ULONG SecurityInformation; Fields of descriptor to set

NtQuerySecurityObject() is called, requesting SecurityInformation. The result of the call is returned to the client in the Data part of the transaction response.

4.5.3 NT_TRANSACT_SET_SECURITY_DESC

This command allows the client to change the security descriptor on a file.

Client Parameter Block Encoding
===================
Description

==========================
USHORT Fid; FID of target
USHORT Reserved; MBZ
ULONG SecurityInformation; Fields of SD that to set
Data Block Encoding
===================
Description
==========================
Data[TotalDataCount] Security Descriptor information

Data is passed directly to NtSetSecurityObject(), with SecurityInformation describing which information to set. The transaction response contains no parameters or data.