2.1.5.10.3 FSCTL_DELETE_REPARSE_POINT

The server provides:

  • Open: An Open of a DataFile or DirectoryFile.

  • ReparseTag: An identifier indicating the type of the reparse point to delete, as defined in [MS-FSCC] section 2.1.2.1.

  • ReparseGUID: A GUID indicating the type of the reparse point to delete.

On completion, the object store MUST return:

  • 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.<77>

Pseudocode for the operation is as follows:

  • Phase 1 -- Verify the parameters.

  • If (Open.GrantedAccess & (FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES)) == 0, the operation MUST be failed with STATUS_ACCESS_DENIED.

  • If Open.File.Volume.IsReadOnly is TRUE, the operation MUST be failed with STATUS_MEDIA_WRITE_PROTECTED.

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

  • If the ReparseTag is either IO_REPARSE_TAG_RESERVED_ZERO or IO_REPARSE_TAG_RESERVED_ONE, the operation MUST be failed with STATUS_IO_REPARSE_TAG_INVALID. The reserved reparse tags are defined in [MS-FSCC] section 2.1.2.1.

  • If ReparseTag is a non-Microsoft Reparse Tag, then the ReparseGUID MUST be a valid GUID; otherwise the operation MUST be failed with STATUS_IO_REPARSE_DATA_INVALID.

  • Phase 2 -- Validate that the requested tag deletion type matches with the stored tag type.

  • If (ReparseTag != Open.File.ReparseTag), the operation MUST be failed with STATUS_IO_REPARSE_TAG_MISMATCH.

  • If (ReparseTag is a non-Microsoft Reparse Tag && Open.File.ReparseGUID != ReparseGUID), the operation MUST be failed with STATUS_REPARSE_ATTRIBUTE_CONFLICT.

  • Phase 3 -- Remove the reparse point from the File.

  • Set Open.File.ReparseData, Open.File.ReparseGUID, and Open.File.ReparseTag to empty.

  • Update Open.File.LastChangeTime to the current system time.<78>

  • If Open.File.FileType == DataFile, set Open.File.FileAttributes.FILE_ATTRIBUTE_ARCHIVE to TRUE.

  • Set Open.File.PendingNotifications.FILE_NOTIFY_CHANGE_LAST_ACCESS to TRUE.

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

    • Status set to STATUS_SUCCESS.