3.2.4.2 CprepDiskRawWrite (Opnum 4)

The CprepDiskRawWrite method writes information directly to a single 512 byte sector on a given disk.

 HRESULT CprepDiskRawWrite(
   [in] CPREP_DISKID DiskId,
   [in] unsigned long ulSector,
   [in] unsigned long cbData,
   [in, size_is(cbData)] byte* pbData,
   [out] unsigned long* pcbDataWritten,
   [out] unsigned long* ulLatency
 );

DiskId: The identifier of the ClusPrepDisk representing the disk that holds the sector to which to write.

ulSector: The sector number to write to.

cbData: The size, in bytes of the buffer pbData.

pbData: The data to write to the disk.

pcbDataWritten: If the CprepDiskRawWrite method is successful, the server MUST set this value to 512. If an error occurs, the server MUST set pcbDataWritten to zero.

ulLatency: The time, in milliseconds, that the write took to be performed.

Return Values: A signed, 32-bit value that indicates return status. If the method returns a negative value, it has failed. Zero or positive values indicate success, with the lower 16 bits in positive nonzero values containing warnings or flags defined in the method implementation. For more information about Win32 error codes and HRESULT values, see [MS-ERREF] sections 2.2 and 2.1.

Return value/code

Description

0x00000000

S_OK

The call was successful.

0x80070002

ERROR_FILE_NOT_FOUND

The disk was not found.

0x8007001D

ERROR_WRITE_FAULT

The size of the passed buffer was larger than 512 bytes.

0x80070548

ERROR_INVALID_SERVER_STATE

The server's Prepare State is not Online.

For any other condition, this method MUST return a value that is not one of the values listed in the preceding table. The client MUST behave in one consistent, identical manner for all values that are not listed in the preceding table.

Exceptions Thrown: No exceptions are thrown beyond those thrown by the underlying RPC protocol [MS-RPCE].

The opnum field value for this method is 4.

When processing this call, the server MUST do the following:

  • Obtain the ClusPrepDisk identified by the DiskId parameter as specified in section 3.2.4.

  • If the passed cbData is greater than 512, then return ERROR_WRITE_FAULT.

  • Write a single sector of 512 bytes from pbData to the disk at the correct sector. If the size of cbData is less than 512 bytes, then pbData is padded to 512 bytes with arbitrary data.

    Note While performing the write operation, use the Latency Time Source ADM element in an implementation-specific manner to determine the elapsed time. For example, prior to initiating the write operation, observe the current time of day in millisecond granularity. Upon completion of the write, again observe the current time of day. The elapsed time can be calculated by subtracting the first observed value from the second.

  • Set pcbDataWritten to 512.

  • Set ulLatency to the time, in milliseconds, that the write operation took to complete.

The server returns the following information to the client:

  • The amount of data written (512 bytes).

  • How long the write took.