2.2.4.32.1 Request
-
SMB_Parameters { UCHAR WordCount; Words { UCHAR AndXCommand; UCHAR AndXReserved; USHORT AndXOffset; USHORT FID; UCHAR TypeOfLock; UCHAR NewOpLockLevel; ULONG Timeout; USHORT NumberOfRequestedUnlocks; USHORT NumberOfRequestedLocks; } } SMB_Data { USHORT ByteCount; Bytes { LOCKING_ANDX_RANGE Unlocks[NumberOfRequestedUnlocks]; LOCKING_ANDX_RANGE Locks[NumberOfRequestedLocks]; } }
SMB_Header: Flags (1 byte): If the server sends an OpLock Break Notification to a client holding an OpLock, the SMB_FLAGS_REPLY bit (0x80) MUST be clear (0) to indicate that the message is a request. This is the only instance in the protocol in which the server sends a request message.
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
3 |
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SMB_Parameters (17 bytes) |
|||||||||||||||||||||||||||||||
... |
|||||||||||||||||||||||||||||||
... |
|||||||||||||||||||||||||||||||
... |
|||||||||||||||||||||||||||||||
... |
SMB_Data (variable) |
||||||||||||||||||||||||||||||
... |
SMB_Parameters (17 bytes):
-
0
1
2
3
4
5
6
7
8
91
0
1
2
3
4
5
6
7
8
92
0
1
2
3
4
5
6
7
8
93
0
1-
WordCount
-
Words (16 bytes)
-
...
-
...
-
...
-
-
WordCount (1 byte): This field MUST be 0x08.
-
Words (16 bytes):
-
0
1
2
3
4
5
6
7
8
91
0
1
2
3
4
5
6
7
8
92
0
1
2
3
4
5
6
7
8
93
0
1-
AndXCommand
-
AndXReserved
-
AndXOffset
-
FID
-
TypeOfLock
-
NewOpLockLevel
-
Timeout
-
NumberOfRequestedUnlocks
-
NumberOfRequestedLocks
-
-
AndXCommand (1 byte): The command code for the next SMB command in the packet. This value MUST be set to 0xFF if there are no additional SMB commands in the client request packet.
-
AndXReserved (1 byte): A reserved field. This MUST be set to 0x00 when this request is sent, and the server MUST ignore this value when the message is received.
-
AndXOffset (2 bytes): This field MUST be set to the offset, in bytes, from the start of the SMB_Header (section 2.2.3.1) to the start of the WordCount field in the next SMB command in this packet. This field is valid only if the AndXCommand field is not set to 0xFF. If AndXCommand is 0xFF, this field MUST be ignored by the server.
-
FID (2 bytes): This field MUST be a valid 16-bit unsigned integer indicating the file from which the data SHOULD be read.
-
TypeOfLock (1 byte): This field is an 8-bit unsigned integer bit mask indicating the nature of the lock request and the format of the LOCKING_ANDX_RANGE data. If the negotiated protocol is NT LAN Manager or later, CAP_LARGE_FILES was negotiated and LARGE_FILES bit is set, then the Locks and Unlocks arrays are in the large file 64-bit offset LOCKING_ANDX_RANGE format. This allows specification of 64-bit offsets for very large files.
-
If TypeOfLock has the SHARED_LOCK bit set, the lock is specified as a shared read-only lock. If shared read-only locks cannot be supported by a server, the server SHOULD map the lock to an exclusive lock for both read and write. Locks for both read and write messages in which TypeOfLock bit READ_WRITE_LOCK is set SHOULD be prohibited by the server, and the server SHOULD return an implementation-specific error to the client. If TypeOfLock has the CHANGE_LOCKTYPE bit 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 and return an implementation-specific error to the client. Closing a file with locks still in force causes the locks to be released in a nondeterministic order.
-
If the Locks vector contains one and only one entry (NumberOfRequestedLocks == 1) and TypeOfLock has the CANCEL_LOCK bit set, the client is requesting that the server cancel a previously requested but unacknowledged lock. This allows the client to cancel lock requests that can wait forever to complete (see Timeout below).
-
Lock type and bitmask
Meaning
READ_WRITE_LOCK
0x00
Request for an exclusive read and write lock.
SHARED_LOCK
0x01
Request for a shared read-only lock.
OPLOCK_RELEASE
0x02
When sent from the server to the client in an OpLock Break Notification, this bit indicates to the client that an OpLock change has occurred on the FID supplied in the request. The client MUST set this bit when sending the OpLock Break Request message acknowledging the OpLock Break.
CHANGE_LOCKTYPE
0x04
Request to atomically change the lock type from a shared lock to an exclusive lock or vice versa for the specified Locks.<39>
CANCEL_LOCK
0x08
Request to cancel all outstanding lock requests for the specified FID and PID.<40>
LARGE_FILES
0x10
Indicates that the LOCKING_ANDX_RANGE format is the 64-bit file offset version. If this flag is not set, then the LOCKING_ANDX_RANGE format is the 32-bit file offset version.
-
-
-
NewOpLockLevel (1 byte): This field is valid only in SMB_COM_LOCKING_ANDX (0x24) (section 2.2.4.32) SMB requests sent from the server to the client in response to a change in an existing OpLock's state. This field is an 8-bit unsigned integer indicating the OpLock level now in effect for the FID in the request. If NewOpLockLevel is 0x00, the client possesses no OpLocks on the file at all. If NewOpLockLevel is 0x01, then the client possesses a Level II OpLock.
-
Timeout (4 bytes): This field is a 32-bit unsigned integer value. Timeout is the maximum amount of time to wait, in milliseconds, for the byte range(s) specified in Locks to become locked. A Timeout value of 0x00000000 indicates that the server fails immediately if any lock range specified is already locked and cannot be locked by this request. A Timeout value of -1 (0xFFFFFFFF) indicates that the server waits as long as it takes (wait forever) for each byte range specified to become unlocked so that it can be locked by this request. Any other value of Timeout specifies the maximum number of milliseconds to wait for all lock ranges specified in Locks to become available and to be locked by this request.
-
NumberOfRequestedUnlocks (2 bytes): This field is a 16-bit unsigned integer value containing the number of entries in the Unlocks array.
-
NumberOfRequestedLocks (2 bytes): This field is a 16-bit unsigned integer value containing the number of entries in the Locks array.
-
SMB_Data (variable):
-
0
1
2
3
4
5
6
7
8
91
0
1
2
3
4
5
6
7
8
92
0
1
2
3
4
5
6
7
8
93
0
1-
ByteCount
-
Bytes (variable)
-
...
-
-
ByteCount (2 bytes): This field MUST be greater than or equal to 0x0000.
-
Bytes (variable):
-
0
1
2
3
4
5
6
7
8
91
0
1
2
3
4
5
6
7
8
92
0
1
2
3
4
5
6
7
8
93
0
1-
Unlocks (variable)
-
...
-
Locks (variable)
-
...
-
-
Unlocks (variable): An array of byte ranges to be unlocked. If 32-bit offsets are being used, this field uses LOCKING_ANDX_RANGE32 (see below) and is (10 * NumberOfRequestedUnlocks) bytes in length. If 64-bit offsets are being used, this field uses LOCKING_ANDX_RANGE64 (see below) and is (20 * NumberOfRequestedUnlocks) bytes in length.
-
Locks (variable): An array of byte ranges to be locked. If 32-bit offsets are being used, this field uses LOCKING_ANDX_RANGE32 (see following) and is (10 * NumberOfRequestedLocks) bytes in length. If 64-bit offsets are being used, this field uses LOCKING_ANDX_RANGE64 (see following) and is (20 * NumberOfRequestedLocks) bytes in length.
-
-
The LOCKING_ANDX_RANGE32 data type has the following structure.
-
LOCKING_ANDX_RANGE32 { USHORT PID; ULONG ByteOffset; ULONG LengthInBytes; }
-
-
PID (2 bytes): The PID of the process requesting the locking change.
-
ByteOffset (4 bytes): The 32-bit unsigned integer value that is the offset into the file at which the locking change MUST begin.
-
LengthInBytes (4 bytes): The 32-bit unsigned integer value that is the number of bytes, beginning at OffsetInBytes, that MUST be locked or unlocked.
-
The LOCKING_ANDX_RANGE64 data type has the following structure.
-
LOCKING_ANDX_RANGE64 { USHORT PID; USHORT Pad; ULONG ByteOffsetHigh; ULONG ByteOffsetLow; ULONG LengthInBytesHigh; ULONG LengthInBytesLow; }
-
-
PID (2 bytes): The PID of the process requesting the locking change.
-
Pad (2 bytes): This field pads the structure to DWORD alignment and MUST be zero (0x0000).
-
OffsetInBytesHigh (4 bytes): The 32-bit unsigned integer value that is the high 32 bits of a 64-bit offset into the file at which the locking change MUST begin.
-
OffsetInBytesLow (4 bytes): The 32-bit unsigned integer value that is the low 32 bits of a 64-bit offset into the file at which the locking change MUST begin.
-
LengthInBytesHigh (4 bytes): The 32-bit unsigned integer value that is the high 32 bits of a 64-bit value specifying the number of bytes that MUST be locked or unlocked.
-
LengthInBytesLow (4 bytes): The 32-bit unsigned integer value that is the low 32 bits of a 64-bit value specifying the number of bytes that MUST be locked or unlocked.
-
-
-