STORAGE_PROTOCOL_COMMAND structure (winioctl.h)

This structure is used as an input buffer when using the pass-through mechanism to issue a vendor-specific command to a storage device (via IOCTL_STORAGE_PROTOCOL_COMMAND).

Syntax

typedef struct _STORAGE_PROTOCOL_COMMAND {
                  DWORD                 Version;
                  DWORD                 Length;
                  STORAGE_PROTOCOL_TYPE ProtocolType;
                  DWORD                 Flags;
                  DWORD                 ReturnStatus;
                  DWORD                 ErrorCode;
                  DWORD                 CommandLength;
                  DWORD                 ErrorInfoLength;
                  DWORD                 DataToDeviceTransferLength;
                  DWORD                 DataFromDeviceTransferLength;
                  DWORD                 TimeOutValue;
                  DWORD                 ErrorInfoOffset;
                  DWORD                 DataToDeviceBufferOffset;
                  DWORD                 DataFromDeviceBufferOffset;
                  DWORD                 CommandSpecific;
                  DWORD                 Reserved0;
                  DWORD                 FixedProtocolReturnData;
                  DWORD                 Reserved1[3];
                  BYTE                  Command[ANYSIZE_ARRAY];
} STORAGE_PROTOCOL_COMMAND, *PSTORAGE_PROTOCOL_COMMAND;

Members

Version

The version of this structure. This should be set to STORAGE_PROTOCOL_STRUCTURE_VERSION.

Length

The size of this structure. This should be set to sizeof(STORAGE_PROTOCOL_COMMAND).

ProtocolType

The protocol type, of type STORAGE_PROTOCOL_TYPE.

Flags

Flags set for this request. The following are valid flags.

Flag Description
STORAGE_PROTOCOL_COMMAND_FLAG_ADAPTER_REQUEST This flag indicates the request to target an adapter instead of device.

ReturnStatus

The status of the request made to the storage device. In Windows 10, possible values include:

Status value Description
STORAGE_PROTOCOL_STATUS_PENDING The request is pending.
STORAGE_PROTOCOL_STATUS_SUCCESS The request has completed successfully.
STORAGE_PROTOCOL_STATUS_ERROR The request has encountered an error.
STORAGE_PROTOCOL_STATUS_INVALID_REQUEST The request is not valid.
STORAGE_PROTOCOL_STATUS_NO_DEVICE A device is not available to make a request to.
STORAGE_PROTOCOL_STATUS_BUSY The device is busy acting on the request.
STORAGE_PROTOCOL_STATUS_DATA_OVERRUN The device encountered a data overrun while acting on the request.
STORAGE_PROTOCOL_STATUS_INSUFFICIENT_RESOURCES The device cannot complete the request due to insufficient resources.
STORAGE_PROTOCOL_STATUS_NOT_SUPPORTED The request is not supported.

ErrorCode

The error code for this request. This is optionally set.

CommandLength

The length of the command. A non-zero value must be set by the caller.

ErrorInfoLength

The length of the error buffer. This is optionally set and can be set to 0.

DataToDeviceTransferLength

The size of the buffer that is to be transferred to the device. This is only used with a WRITE request.

DataFromDeviceTransferLength

The size of the buffer this is to be transferred from the device. This is only used with a READ request.

TimeOutValue

How long to wait for the device until timing out. This is set in units of seconds.

ErrorInfoOffset

The offset of the error buffer. This must be pointer-aligned.

DataToDeviceBufferOffset

The offset of the buffer that is to be transferred to the device. This must be pointer-aligned and is only used with a WRITE request.

DataFromDeviceBufferOffset

The offset of the buffer that is to be transferred from the device. This must be pointer-aligned and is only used with a READ request.

CommandSpecific

Command-specific data passed along with the command. This depends on the command from the driver, and is optionally set.

Reserved0

Reserved for future use.

FixedProtocolReturnData

The return data. This is optionally set. Some protocols such as NVMe, may return a small amount of data (DWORD0 from completion queue entry) without the need of a separate device data transfer.

Reserved1[3]

Reserved for future use.

[ANYSIZE_ARRAY] Command[ANYSIZE_ARRAY]

The vendor-specific command that is to be passed-through to the device.

Requirements

   
Minimum supported client Windows 10
Minimum supported server Windows Server 2016
Header winioctl.h (include Windows.h)

See also

IOCTL_STORAGE_PROTOCOL_COMMAND