2.1.5.10.14 FSCTL_GET_REPARSE_POINT

msdn link

The server provides:

  • Open: An Open of a DataFile or DirectoryFile.

  • OutputBufferSize: The maximum number of bytes to return in OutputBuffer.

On completion, the object store MUST return:

  • OutputBuffer: An array of bytes containing a REPARSE_DATA_BUFFER or REPARSE_GUID_DATA_BUFFER structure as defined in [MS-FSCC] sections 2.1.2.2 and 2.1.2.3, respectively.

  • BytesReturned: The number of bytes returned to the caller.

  • Status: An NTSTATUS code that specifies the result.

Support for this operation is optional. If the object store does not implement this functionality, the operation MUST be failed with STATUS_INVALID_DEVICE_REQUEST.<97>

Pseudocode for the operation is as follows:

  • If Open.File.Volume.IsReparsePointsSupported is FALSE, the operation MUST be failed with STATUS_VOLUME_NOT_UPGRADED.

  • Phase 1 -- Check whether there is a reparse point on the File

  • If Open.File.ReparseTag is empty, the operation MUST be failed with STATUS_NOT_A_REPARSE_POINT.

  • Phase 2 -- Verify that OutputBufferSize is large enough to contain the reparse point data header.

  • If Open.File.ReparseTag is a Microsoft reparse tag as defined in [MS-FSCC] section 2.1.2.1, then OutputBufferSize MUST be >= sizeof(REPARSE_DATA_BUFFER). If not, the operation MUST be failed with STATUS_BUFFER_TOO_SMALL.

  • If Open.File.ReparseTag is a non-Microsoft reparse tag, then OutputBufferSize MUST be >= sizeof(REPARSE_GUID_DATA_BUFFER). If it is not, the operation MUST be failed with STATUS_BUFFER TOO_SMALL.

  • Phase 3 -- Return the reparse data

  • Set OutputBuffer.ReparseTag to Open.File.ReparseTag.

  • Set OutputBuffer.ReparseDataLength to the size of Open.File.ReparseData, in bytes.

  • Set OutputBuffer.Reserved to zero.

  • Copy as much of Open.File.ReparseData as can fit into the remainder of OutputBuffer starting at OutputBuffer.DataBuffer.

  • If Open.File.ReparseTag is a non-Microsoft reparse tag, set OutputBuffer.ReparseGUID to Open.File.ReparseGUID.

  • Upon successful completion of the operation, the object store MUST return:

    • BytesReturned set to the number of bytes written to OutputBuffer.

    • Status set to STATUS_SUCCESS.