2.1.5.10.35 FSCTL_SET_OBJECT_ID

The server provides:

  • Open: An Open of a DataFile or DirectoryFile.

  • InputBuffer: An array of bytes containing a FILE_OBJECTID_BUFFER structure as specified in [MS-FSCC] section 2.1.3.

  • InputBufferSize: The number of bytes in InputBuffer.

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.<142>

Pseudocode for the operation is as follows:

  • If InputBufferSize is not equal to sizeof(FILE_OBJECTID_BUFFER), the operation MUST be failed with STATUS_INVALID_PARAMETER.

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

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

  • If Open.HasRestoreAccess is FALSE, the operation MUST be failed with STATUS_ACCESS_DENIED.

  • If Open.File.ObjectId is not empty, the operation MUST be failed with STATUS_OBJECT_NAME_COLLISION.

  • If InputBuffer.ObjectId is not unique on Open.File.Volume, the operation MUST be failed with STATUS_DUPLICATE_NAME.

  • Before completing the operation successfully, the object store MUST set:

    • Open.File.LastChangeTime to the current time.<143>

    • Post a USN change as specified in section 2.1.4.11 with File equal to File, Reason equal to USN_REASON_OBJECT_ID_CHANGE, and FileName equal to Open.Link.Name.

    • Open.File.ObjectId to InputBuffer.ObjectId.

    • Open.File.BirthVolumeId to InputBuffer.BirthVolumeId.

    • Open.File.BirthObjectId to InputBuffer.BirthObjectId.

    • Open.File.DomainId to InputBuffer.DomainId.

    • The object store MUST construct a FILE_OBJECTID_INFORMATION structure (as specified in [MS-FSCC] section 2.4.35.1) ObjectIdInfo as follows:

      • ObjectIdInfo.FileReference set to zero.

      • ObjectIdInfo.ObjectId set to Open.File.ObjectId.

      • ObjectIdInfo.BirthVolumeId set to Open.File.BirthVolumeId.

      • ObjectIdInfo.BirthObjectId set to Open.File.BirthObjectId.

      • ObjectIdInfo.DomainId set to Open.File.DomainId.

    • Send directory change notification as specified in section 2.1.4.1, with Volume equal to Open.File.Volume, Action equal to FILE_ACTION_ADDED, FilterMatch equal to FILE_NOTIFY_CHANGE_FILE_NAME, FileName equal to "\$Extend\$ObjId", NotifyData equal to ObjectIdInfo, and NotifyDataLength equal to sizeof(FILE_OBJECTID_INFORMATION).

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

  • Status set to STATUS_SUCCESS.