Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Support for this operation is optional. If the object store does not implement this functionality, this operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<116>
The server provides:
Open: An Open of DataFile.
InputBuffer: An array of bytes containing a single FILE_REGION_INPUT structure indicating the range of the DataFile to return data about, as specified in [MS-FSCC] section 2.3.55. This input structure is optional.
InputBufferSize: The number of bytes in InputBuffer.
OutputBufferSize: The maximum number of bytes to return in OutputBuffer.
Upon completion, this object store MUST return:
Status: An NTSTATUS code that specifies the result.
OutputBuffer: An array of bytes that will return a FILE_REGION_OUTPUT structure as specified in [MS-FSCC] section 2.3.56.
BytesReturned: The number of bytes returned in OutputBuffer.
This operation uses the following local variables:
A FILE_REGION_INPUT structure as specified in [MS-FSCC] section 2.3.55: InputRegion
32-bit unsigned integers (initialized to zero): OutputBufferIndex, Length
64-bit unsigned integers (initialized to zero): Vdl, Eof
Pseudocode for this operation is as follows:
If InputBufferSize == 0:
Set InputRegion.FileOffset = 0
Set InputRegion.Length = MAXLONGLONG
Set InputRegion.DesiredUsage = FILE_REGION_USAGE_VALID_CACHED_DATA for NTFS or Set InputRegion.DesiredUsage = FILE_REGION_USAGE_VALID_NONCACHED_DATA for ReFS<117>
ElseIf InputBufferSize < Sizeof(FILE_REGION_INPUT)
The operation MUST be failed with STATUS_BUFFER_TOO_SMALL.
Else:
Set InputRegion = InputBuffer
EndIf
If InputRegion.Length <= 0, the operation MUST be failed with STATUS_INVALID_PARAMETER.
If (InputRegion.FileOffset + InputRegion.Length) exceeds 63 bits, the operation MUST be failed with STATUS_INVALID_PARAMETER
If InputRegion.DesiredUsage does NOT have flag FILE_REGION_USAGE_VALID_CACHED_DATA (for NTFS) or flag FILE_REGION_USAGE_VALID_NONCACHED_DATA (for ReFS) set, the operation MUST be failed with STATUS_INVALID_PARAMETER
If OutputBuffer.Length < sizeof(FILE_REGION_OUTPUT), the operation MUST be failed with STATUS_BUFFER_TOO_SMALL
Set Vdl = Open.File.ValidDataLength
Set Eof = Open.File.Eof
Set Length = FieldOffset(OutputBuffer.Region[0])
If (InputRegion.FileOffset > Eof) OR ((InputRegion.FileOffset == Eof) AND (Eof > 0)), the operation MUST return STATUS_SUCCESS, with BytesReturned set to 0.
If (InputRegion.FileOffset >= Vdl)
Set OutputBuffer.Region[OutputBufferIndex].FileOffset = InputRegion.FileOffset
Set OutputBuffer.Region[OutputBufferIndex].Length = min(InputRegion.Length, Eof - InputRegion.FileOffset)
Set OutputBuffer.Region[OutputBufferIndex].Usage = 0
Set OutputBuffer.Region[OutputBufferIndex].Reserved = 0
Set Length = Length + sizeof(FILE_REGION_INFO)
Set OutputBufferIndex = OutputBufferIndex + 1
Set OutputBuffer.TotalRegionEntryCount = OutputBuffer.TotalRegionEntryCount + 1
Else
Set OutputBuffer.Region[OutputBufferIndex].FileOffset = InputRegion.FileOffset
Set OutputBuffer.Region[OutputBufferIndex].Length = min((Vdl – InputRegion.FileOffset), InputRegion.Length)
Set OutputBuffer.Region[OutputBufferIndex].Usage = InputRegion.DesiredUsage
Set OutputBuffer.Region[OutputBufferIndex].Reserved = 0
Set Length = Length + sizeof(FILE_REGION_INFO)
Set OutputBufferIndex = OutputBufferIndex + 1
Set OutputBuffer.TotalRegionEntryCount = OutputBuffer.TotalRegionEntryCount + 1
If (Vdl < Eof) AND (OutputBuffer.Region[OutputBufferIndex - 1]. Length <InputRegion.Length),
If (Length + sizeof(FILE_REGION_INFO)) > OutputBufferSize)
Set OutputBuffer.TotalRegionEntryCount = OutputBuffer.TotalRegionEntryCount + 1
The operation MUST be failed with STATUS_BUFFER_OVERFLOW.
Set OutputBuffer.Region[OutputBufferIndex].FileOffset = Vdl
Set OutputBuffer.Region[OutputBufferIndex].Length = min(InputRegion.Length –OutputBuffer.Region[OutputBufferIndex - 1].Length, Eof –Vdl)
Set OutputBuffer.Region[OutputBufferIndex].Usage = 0
Set OutputBuffer.Region[OutputBufferIndex].Reserved = 0;
Set Length = Length + sizeof(FILE_REGION_INFO)
Set OutputBufferIndex = OutputBufferIndex + 1
Set OutputBuffer.TotalRegionEntryCount = OutputBuffer.TotalRegionEntryCount + 1
EndIf
EndIf
Upon successful completion of the operation, the object store MUST return:
OutputBuffer.RegionEntryCount set to OutputBufferIndex
BytesReturned set to Length
Status set to STATUS_SUCCESS