2.1.5.9 Server Requests an Unlock of a Byte-Range
The server provides:
Open: An Open of a DataStream.
FileOffset: A 64-bit unsigned integer containing the starting offset, in bytes.
Length: A 64-bit unsigned integer containing the length, in bytes.
LockKey: A 32-bit unsigned integer containing an identifier for the lock being obtained by a specific process.
On completion, the object store MUST return:
Status: An NTSTATUS code that specifies the result.
Pseudocode for the operation is as follows:
[Validation]
If Open.Stream.StreamType is DirectoryStream, return STATUS_INVALID_PARAMETER, as byte range locks are not permitted on directories.
If (((FileOffset + Length - 1) < FileOffset) && Length != 0)
This means that the requested range contains one or more bytes with offsets beyond the maximum 64-bit unsigned integer. The operation MUST be failed with STATUS_INVALID_LOCK_RANGE.
EndIf
[Processing]
Initialize LockToRemove to NULL.
For each ByteRangeLock in Open.Stream.ByteRangeLockList:
If ((ByteRangeLock.LockOffset == FileOffset) and (ByteRangeLock.LockLength == Length) and (ByteRangeLock.OwnerOpen == Open) and (ByteRangeLock.LockKey == LockKey)) then:
Set LockToRemove to ByteRangeLock.
If (LockToRemove.ExclusiveLock == TRUE) then break.
EndIf
EndFor
If LockToRemove is not NULL:
Remove LockToRemove from Open.Stream.ByteRangeLockList.
Complete this operation with STATUS_SUCCESS.
Else:
Complete this operation with STATUS_RANGE_NOT_LOCKED.
EndIf