2.1.5.10.1 FSCTL_CREATE_OR_GET_OBJECT_ID

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:

  • Status: An NTSTATUS code that specifies the result.

  • OutputBuffer: An array of bytes that will return a FILE_OBJECTID_BUFFER structure as specified in [MS-FSCC] section 2.1.3.

  • BytesReturned: The number of bytes returned in OutputBuffer.

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

Pseudocode for the operation is as follows:

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

  • If OutputBufferSize is less than sizeof(FILE_OBJECTID_BUFFER), the operation MUST be failed with STATUS_INVALID_PARAMETER.

  • If Open.File.ObjectId is empty:

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

    • The object store MUST set Open.File.ObjectId to a newly generated ObjectId GUID that is unique on Open.File.Volume.<73>

  • EndIf

  • If a new Open.File.ObjectId was generated above or if Open.File.BirthVolumeId and Open.File.BirthObjectId are both empty:

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

    • If Open.File.BirthVolumeId is empty, the object store MUST set Open.File.BirthVolumeId to Open.File.Volume.VolumeId.

    • If Open.File.BirthObjectId is empty, the object store MUST set Open.File.BirthObjectId to Open.File.ObjectId.

    • The object store MUST set Open.File.DomainId to empty.

    • The object store MUST 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.

    • The object store MUST construct a FILE_OBJECTID_INFORMATION structure (as specified in [MS-FSCC] section 2.4.31.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).

  • EndIf

If a new Open.File.ObjectId was generated above, the object store MUST update Open.File.LastChangeTime.<74>

The object store MUST populate the fields of OutputBuffer as follows:

  • OutputBuffer.ObjectId set to Open.File.ObjectId.

  • OutputBuffer.BirthVolumeId set to Open.File.BirthVolumeId.

  • OutputBuffer.BirthObjectId set to Open.File.BirthObjectId.

  • OutputBuffer.DomainId set to Open.File.DomainId.

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

  • BytesReturned set to sizeof(FILE_OBJECTID_BUFFER).

  • Status set to STATUS_SUCCESS.