Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define IOCTL_STORAGE_SET_TEMPERATURE_THRESHOLD CTL_CODE(IOCTL_STORAGE_BASE, 0x0480, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
- #define IOCTL_STORAGE_PROTOCOL_COMMAND CTL_CODE(IOCTL_STORAGE_BASE, 0x04F0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
- //
- // IOCTLs for firmware upgrade on storage devices
- //
- #define IOCTL_STORAGE_FIRMWARE_GET_INFO CTL_CODE(IOCTL_STORAGE_BASE, 0x0700, METHOD_BUFFERED, FILE_ANY_ACCESS)
- #define IOCTL_STORAGE_FIRMWARE_DOWNLOAD CTL_CODE(IOCTL_STORAGE_BASE, 0x0701, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
- #define IOCTL_STORAGE_FIRMWARE_ACTIVATE CTL_CODE(IOCTL_STORAGE_BASE, 0x0702, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
- //
- // IOCTL to specify a power cap for a storage device.
- //
- #define IOCTL_STORAGE_DEVICE_POWER_CAP CTL_CODE(IOCTL_STORAGE_BASE, 0x0725, METHOD_BUFFERED, FILE_ANY_ACCESS)
- //
- // Output buffer for StorageDeviceFaultDomainProperty & PropertyStandardQuery
- //
- typedef _Struct_size_bytes_(Size) struct _STORAGE_DEVICE_FAULT_DOMAIN_DESCRIPTOR {
- //
- // Size of this structure serves
- // as the version
- //
- ULONG Version;
- //
- // Size of this structure plus
- // all the variable sized fields
- //
- ULONG Size;
- //
- // Number of fault domains
- //
- ULONG NumberOfFaultDomains;
- //
- // Fault domain ids
- //
- _Field_size_(NumberOfFaultDomains) GUID FaultDomainIds[ANYSIZE_ARRAY];
- } STORAGE_DEVICE_FAULT_DOMAIN_DESCRIPTOR, *PSTORAGE_DEVICE_FAULT_DOMAIN_DESCRIPTOR;
- //
- // Parameters for StorageAdapterProtocolSpecificProperty (or StorageDeviceProtocolSpecificProperty) & PropertyStandardQuery
- //
- //
- // Define the different storage command protocols that used between software and hardware.
- // e.g. command protocol software uses to communicate with hardware.
- // Protocol types below 128 (0x80) are reserved for Microsoft use.
- //
- typedef enum _STORAGE_PROTOCOL_TYPE {
- ProtocolTypeUnknown = 0x00,
- ProtocolTypeScsi,
- ProtocolTypeAta,
- ProtocolTypeNvme,
- ProtocolTypeSd,
- ProtocolTypeProprietary = 0x7E,
- ProtocolTypeMaxReserved = 0x7F
- } STORAGE_PROTOCOL_TYPE, *PSTORAGE_PROTOCOL_TYPE;
- typedef enum _STORAGE_PROTOCOL_NVME_DATA_TYPE {
- NVMeDataTypeUnknown = 0,
- NVMeDataTypeIdentify, // Retrieved by command - IDENTIFY CONTROLLER or IDENTIFY NAMESPACE
- NVMeDataTypeLogPage, // Retrieved by command - GET LOG PAGE
- NVMeDataTypeFeature, // Retrieved by command - GET FEATURES
- } STORAGE_PROTOCOL_NVME_DATA_TYPE, *PSTORAGE_PROTOCOL_NVME_DATA_TYPE;
- typedef enum _STORAGE_PROTOCOL_ATA_DATA_TYPE {
- AtaDataTypeUnknown = 0,
- AtaDataTypeIdentify, // Retrieved by command - IDENTIFY DEVICE
- AtaDataTypeLogPage, // Retrieved by command - READ LOG EXT
- } STORAGE_PROTOCOL_ATA_DATA_TYPE, *PSTORAGE_PROTOCOL_ATA_DATA_TYPE;
- //
- // Protocol Data should follow this data structure in the same buffer.
- // The offset of Protocol Data from the beginning of this data structure
- // is reported in data field - "ProtocolDataOffset".
- //
- typedef struct _STORAGE_PROTOCOL_SPECIFIC_DATA {
- STORAGE_PROTOCOL_TYPE ProtocolType;
- ULONG DataType; // The value will be protocol specific, as defined in STORAGE_PROTOCOL_NVME_DATA_TYPE or STORAGE_PROTOCOL_ATA_DATA_TYPE.
- ULONG ProtocolDataRequestValue;
- ULONG ProtocolDataRequestSubValue;
- ULONG ProtocolDataOffset; // The offset of data buffer is from beginning of this data structure.
- ULONG ProtocolDataLength;
- ULONG FixedProtocolReturnData; // This is returned data, especially from NVMe feature data that doesn't need separate device data transfer.
- ULONG Reserved[3];
- } STORAGE_PROTOCOL_SPECIFIC_DATA, *PSTORAGE_PROTOCOL_SPECIFIC_DATA;
- //
- // Input parameters for StorageAdapterProtocolSpecificProperty (or StorageDeviceProtocolSpecificProperty) & PropertyStandardQuery
- // will be data structure STORAGE_PROPERTY_QUERY, where the data field "AdditionalParameters" is a buffer
- // in format of STORAGE_PROTOCOL_SPECIFIC_DATA.
- //
- //
- // Out parameters for StorageAdapterProtocolSpecificProperty (or StorageDeviceProtocolSpecificProperty) & PropertyStandardQuery
- //
- typedef struct _STORAGE_PROTOCOL_DATA_DESCRIPTOR {
- ULONG Version;
- ULONG Size;
- STORAGE_PROTOCOL_SPECIFIC_DATA ProtocolSpecificData;
- } STORAGE_PROTOCOL_DATA_DESCRIPTOR, *PSTORAGE_PROTOCOL_DATA_DESCRIPTOR;
- //
- // Parameters for StorageAdapterTemperatureProperty (or StorageDeviceTemperatureProperty) & PropertyStandardQuery
- //
- //
- // Input parameters for StorageAdapterTemperatureProperty (or StorageDeviceTemperatureProperty) & PropertyStandardQuery
- // uses data structure STORAGE_PROPERTY_QUERY.
- //
- //
- // Out parameters for StorageAdapterTemperatureProperty (or StorageDeviceTemperatureProperty) & PropertyStandardQuery
- // For temperature/threshold data fields, the smallest value of SHORT type - 0x8000 indicates the value is not reported.
- //
- #define STORAGE_TEMPERATURE_VALUE_NOT_REPORTED 0x8000
- typedef struct _STORAGE_TEMPERATURE_INFO {
- USHORT Index; // Starts from 0. Index 0 may indicate a composite value.
- SHORT Temperature; // Signed value; in Celsius.
- SHORT OverThreshold; // Signed value; in Celsius.
- SHORT UnderThreshold; // Signed value; in Celsius.
- BOOLEAN OverThresholdChangable; // Can the threshold value being changed by using IOCTL_STORAGE_SET_TEMPERATURE_THRESHOLD.
- BOOLEAN UnderThresholdChangable; // Can the threshold value being changed by using IOCTL_STORAGE_SET_TEMPERATURE_THRESHOLD.
- BOOLEAN EventGenerated; // Indicates that notification will be generated when temperature cross threshold.
- UCHAR Reserved0;
- ULONG Reserved1;
- } STORAGE_TEMPERATURE_INFO, *PSTORAGE_TEMPERATURE_INFO;
- typedef struct _STORAGE_TEMPERATURE_DATA_DESCRIPTOR {
- ULONG Version;
- ULONG Size;
- //
- // Indicates the maximum temperature in degrees Celsius that may prevent continued normal operation,
- // possibility of data loss, automatic device shutdown, extreme performance throttling, or permanent damage.
- //
- SHORT CriticalTemperature; // Signed value; in Celsius.
- //
- // Indicates the maximum temperature in degrees Celsius at which the device is capable of
- // operating continuously without degrading operation or reliability.
- //
- SHORT WarningTemperature; // Signed value; in Celsius.
- USHORT InfoCount; // Some devices may report more than one temperature information as there can be multiple sensors implemented.
- UCHAR Reserved0[2];
- ULONG Reserved1[2];
- STORAGE_TEMPERATURE_INFO TemperatureInfo[ANYSIZE_ARRAY];
- } STORAGE_TEMPERATURE_DATA_DESCRIPTOR, *PSTORAGE_TEMPERATURE_DATA_DESCRIPTOR;
- //
- // Input parameters for IOCTL_STORAGE_SET_TEMPERATURE_THRESHOLD
- //
- //
- // Indicate the target of the request other than the device handle/object itself.
- // This is used in "Flags" field of data structures.
- //
- #define STORAGE_TEMPERATURE_THRESHOLD_FLAG_ADAPTER_REQUEST 0x0001
- typedef struct _STORAGE_TEMPERATURE_THRESHOLD {
- ULONG Version;
- ULONG Size;
- USHORT Flags;
- USHORT Index;
- SHORT Threshold; // Signed value; in Celsius.
- BOOLEAN OverThreshold; // If TRUE, set the OverThreshold value; Otherwise, set the UnderThreshold value.
- UCHAR Reserved;
- } STORAGE_TEMPERATURE_THRESHOLD, *PSTORAGE_TEMPERATURE_THRESHOLD;
- //
- // Parameters for StorageAdapterPhysicalTopologyProperty (or StorageDevicePhysicalTopologyProperty) & PropertyStandardQuery
- //
- //
- // Input parameters for StorageAdapterPhysicalTopologyProperty (or StorageDevicePhysicalTopologyProperty) & PropertyStandardQuery
- // uses data structure STORAGE_PROPERTY_QUERY.
- //
- //
- // Out parameters for StorageAdapterPhysicalTopologyProperty (or StorageDevicePhysicalTopologyProperty) & PropertyStandardQuery
- // uses data structure STORAGE_PHYSICAL_TOPOLOGY_DESCRIPTOR
- //
- //
- // Multiple roles are allowed for a single device.
- //
- #define STORAGE_COMPONENT_ROLE_CACHE 0x00000001
- #define STORAGE_COMPONENT_ROLE_TIERING 0x00000002
- #define STORAGE_COMPONENT_ROLE_DATA 0x00000004
- typedef enum _STORAGE_DEVICE_FORM_FACTOR {
- FormFactorUnknown = 0,
- FormFactor3_5, // 3.5 inch nominal form factor
- FormFactor2_5, // 2.5 inch nominal form factor
- FormFactor1_8, // 1.8 inch nominal form factor
- FormFactor1_8Less, // Less than 1.8 inch nominal form factor
- FormFactorEmbedded, // Embedded on board.
- FormFactorMemoryCard, // Memory card such as SD, CF.
- FormFactormSata, // mSATA
- FormFactorM_2, // M.2
- FormFactorPCIeBoard, // PCIe card plug into slot.
- FormFactorDimm, // DIMM Slot
- } STORAGE_DEVICE_FORM_FACTOR, *PSTORAGE_DEVICE_FORM_FACTOR;
- typedef enum _STORAGE_COMPONENT_HEALTH_STATUS {
- HealthStatusUnknown = 0,
- HealthStatusNormal,
- HealthStatusThrottled,
- HealthStatusWarning,
- HealthStatusDisabled,
- HealthStatusFailed,
- } STORAGE_COMPONENT_HEALTH_STATUS, *PSTORAGE_COMPONENT_HEALTH_STATUS;
- #pragma warning(push)
- #pragma warning(disable:4201) // nameless struct/unions
- typedef union _STORAGE_SPEC_VERSION {
- struct {
- union {
- struct {
- UCHAR SubMinor;
- UCHAR Minor;
- } DUMMYSTRUCTNAME;
- USHORT AsUshort;
- } MinorVersion;
- USHORT MajorVersion;
- } DUMMYSTRUCTNAME;
- ULONG AsUlong;
- } STORAGE_SPEC_VERSION, *PSTORAGE_SPEC_VERSION;
- #pragma warning(pop)
- typedef struct _STORAGE_PHYSICAL_DEVICE_DATA {
- ULONG DeviceId;
- ULONG Role; // Value(s) of bitmask from STORAGE_COMPONENT_ROLE_xxx
- STORAGE_COMPONENT_HEALTH_STATUS HealthStatus;
- STORAGE_PROTOCOL_TYPE CommandProtocol;
- STORAGE_SPEC_VERSION SpecVersion; // Supported storage spec version. For example: SBC 3, SATA 3.2, NVMe 1.2
- STORAGE_DEVICE_FORM_FACTOR FormFactor;
- UCHAR Vendor[8];
- UCHAR Model[40];
- UCHAR FirmwareRevision[16];
- ULONGLONG Capacity; // in unit of Kilo-Bytes (1024 bytes).
- UCHAR PhysicalLocation[32]; // Reserved for future.
- ULONG Reserved[2];
- } STORAGE_PHYSICAL_DEVICE_DATA, *PSTORAGE_PHYSICAL_DEVICE_DATA;
- typedef struct _STORAGE_PHYSICAL_ADAPTER_DATA {
- ULONG AdapterId;
- STORAGE_COMPONENT_HEALTH_STATUS HealthStatus;
- STORAGE_PROTOCOL_TYPE CommandProtocol;
- STORAGE_SPEC_VERSION SpecVersion; // Supported storage spec version. For example: AHCI 1.3.1
- UCHAR Vendor[8];
- UCHAR Model[40];
- UCHAR FirmwareRevision[16];
- UCHAR PhysicalLocation[32]; // Reserve for future.
- BOOLEAN ExpanderConnected;
- UCHAR Reserved0[3];
- ULONG Reserved1[3];
- } STORAGE_PHYSICAL_ADAPTER_DATA, *PSTORAGE_PHYSICAL_ADAPTER_DATA;
- typedef struct _STORAGE_PHYSICAL_NODE_DATA {
- ULONG NodeId;
- ULONG AdapterCount; // 0 or 1
- ULONG AdapterDataLength;
- ULONG AdapterDataOffset; // Offset from beginning of this data structure. The buffer contains an array of STORAGE_PHYSICAL_ADAPTER_DATA.
- ULONG DeviceCount; // >= 1
- ULONG DeviceDataLength;
- ULONG DeviceDataOffset; // Offset from beginning of this data structure. The buffer contains an array of STORAGE_PHYSICAL_DEVICE_DATA.
- ULONG Reserved[3];
- } STORAGE_PHYSICAL_NODE_DATA, *PSTORAGE_PHYSICAL_NODE_DATA;
- typedef struct _STORAGE_PHYSICAL_TOPOLOGY_DESCRIPTOR {
- ULONG Version; // sizeof(STORAGE_PHYSICAL_TOPOLOGY_DESCRIPTOR)
- ULONG Size; // Total size of the data. Should be >= sizeof(STORAGE_PHYSICAL_TOPOLOGY_DESCRIPTOR)
- ULONG NodeCount;
- ULONG Reserved;
- STORAGE_PHYSICAL_NODE_DATA Node[ANYSIZE_ARRAY];
- } STORAGE_PHYSICAL_TOPOLOGY_DESCRIPTOR, *PSTORAGE_PHYSICAL_TOPOLOGY_DESCRIPTOR;
- //
- // Output buffer for StorageDeviceIoCapabilityProperty & PropertyStandardQuery
- //
- typedef _Struct_size_bytes_(Size) struct _STORAGE_DEVICE_IO_CAPABILITY_DESCRIPTOR {
- //
- // Size of this structure serves
- // as the version
- //
- ULONG Version;
- //
- // Size of this structure
- //
- ULONG Size;
- //
- // LUN max outstanding IO count
- //
- ULONG LunMaxIoCount;
- //
- // Adapter max outstanding IO count
- //
- ULONG AdapterMaxIoCount;
- } STORAGE_DEVICE_IO_CAPABILITY_DESCRIPTOR, *PSTORAGE_DEVICE_IO_CAPABILITY_DESCRIPTOR;
- //
- // IOCTL_STORAGE_DEVICE_POWER_CAP
- //
- // This IOCTL specifies a maximum *operational* power consumption level for a
- // storage device.
- // The storage stack will do its best to transition the device to a power state
- // that will not exceed the given maximum. However, this depends on what the
- // device supports. The actual maximum may be less than or greater than the
- // desired maximum.
- //
- // Input buffer:
- // A STORAGE_DEVICE_POWER_CAP structure.
- // * The Units field specifies the units of the MaxPower field. It can be
- // either a percentage (0-100%) or an absolute value in milliwatts.
- // * The MaxPower field is used to set the desired maximum power consumption
- // value for the storage device.
- //
- // Output buffer:
- // On success, the output buffer will contain a STORAGE_DEVICE_POWER_CAP
- // structure.
- // * The Units field will continue to specify the units of the MaxPower field
- // and will match the value from the input buffer.
- // * The MaxPower field will contain the value of the actual maximum
- // power consumption level of the device. This may be equal to, less than,
- // or greater than the desired cap, depending on what the device supports.
- //
- typedef enum _STORAGE_DEVICE_POWER_CAP_UNITS {
- StorageDevicePowerCapUnitsPercent,
- StorageDevicePowerCapUnitsMilliwatts
- } STORAGE_DEVICE_POWER_CAP_UNITS, *PSTORAGE_DEVICE_POWER_CAP_UNITS;
- typedef struct _STORAGE_DEVICE_POWER_CAP {
- ULONG Version;
- ULONG Size;
- STORAGE_DEVICE_POWER_CAP_UNITS Units;
- ULONGLONG MaxPower;
- } STORAGE_DEVICE_POWER_CAP, *PSTORAGE_DEVICE_POWER_CAP;
- #define STORAGE_DEVICE_POWER_CAP_VERSION_V1 1
- //
- // Parameter and data structure for firmware upgrade IOCTLs
- // IOCTL_STORAGE_FIRMWARE_GET_INFO, IOCTL_STORAGE_FIRMWARE_DOWNLOAD, IOCTL_STORAGE_FIRMWARE_ACTIVATE
- //
- //
- // Indicate the target of the request other than the device handle/object itself.
- // This is used in "Flags" field of data structures for firmware upgrade request.
- //
- #define STORAGE_HW_FIRMWARE_REQUEST_FLAG_CONTROLLER 0x00000001
- //
- // Indicate that the existing firmware in slot should be activated.
- // Only valid for IOCTL_STORAGE_FIRMWARE_ACTIVATE.
- //
- #define STORAGE_HW_FIRMWARE_REQUEST_FLAG_SWITCH_TO_EXISTING_FIRMWARE 0x80000000
- //
- // Input parameter for IOCTL_STORAGE_FIRMWARE_GET_INFO
- //
- typedef struct _STORAGE_HW_FIRMWARE_INFO_QUERY {
- ULONG Version; // sizeof(STORAGE_FIRMWARE_INFO_QUERY)
- ULONG Size; // Whole size of the buffer (in case this data structure being extended to be variable length)
- ULONG Flags;
- ULONG Reserved;
- } STORAGE_HW_FIRMWARE_INFO_QUERY, *PSTORAGE_HW_FIRMWARE_INFO_QUERY;
- //
- // Output parameter for IOCTL_STORAGE_FIRMWARE_GET_INFO
- // The total size of returned data is for Firmware Info is:
- // sizeof(STORAGE_HW_FIRMWARE_INFO) + sizeof(STORAGE_HW_FIRMWARE_SLOT_INFO) * (SlotCount - 1).
- // If the buffer is not big enough, callee should set the required length in "Size" field of STORAGE_HW_FIRMWARE_INFO,
- //
- //
- // Following value maybe used in "PendingActiveSlot" field indicating there is no firmware pending to activate.
- //
- #define STORAGE_HW_FIRMWARE_INVALID_SLOT 0xFF
- #pragma warning(push)
- #pragma warning(disable:4214) // bit fields other than int
- #define STORAGE_HW_FIRMWARE_REVISION_LENGTH 16
- typedef struct _STORAGE_HW_FIRMWARE_SLOT_INFO {
- ULONG Version; // sizeof(STORAGE_HW_FIRMWARE_SLOT_INFO)
- ULONG Size; // size the data contained in STORAGE_HW_FIRMWARE_SLOT_INFO.
- UCHAR SlotNumber;
- UCHAR ReadOnly : 1;
- UCHAR Reserved0 : 7;
- UCHAR Reserved1[6];
- UCHAR Revision[STORAGE_HW_FIRMWARE_REVISION_LENGTH];
- } STORAGE_HW_FIRMWARE_SLOT_INFO, *PSTORAGE_HW_FIRMWARE_SLOT_INFO;
- typedef struct _STORAGE_HW_FIRMWARE_INFO {
- ULONG Version; // sizeof(STORAGE_HW_FIRMWARE_INFO)
- ULONG Size; // size of the whole buffer including slot[]
- UCHAR SupportUpgrade : 1;
- UCHAR Reserved0 : 7;
- UCHAR SlotCount;
- UCHAR ActiveSlot;
- UCHAR PendingActivateSlot;
- BOOLEAN FirmwareShared; // The firmware applies to both device and adapter. For example: PCIe SSD.
- UCHAR Reserved[3];
- ULONG ImagePayloadAlignment; // Number of bytes. Max: PAGE_SIZE. The transfer size should be multiple of this unit size. Some protocol requires at least sector size. 0 means the value is not valid.
- ULONG ImagePayloadMaxSize; // for a single command.
- STORAGE_HW_FIRMWARE_SLOT_INFO Slot[ANYSIZE_ARRAY];
- } STORAGE_HW_FIRMWARE_INFO, *PSTORAGE_HW_FIRMWARE_INFO;
- #pragma warning(pop)
- //
- // Input parameter for IOCTL_STORAGE_FIRMWARE_DOWNLOAD
- //
- #pragma warning(push)
- #pragma warning(disable:4200)
- typedef struct _STORAGE_HW_FIRMWARE_DOWNLOAD {
- ULONG Version; // sizeof(STORAGE_FIRMWARE_DOWNLOAD)
- ULONG Size; // size of the whole buffer include "ImageBuffer"
- ULONG Flags;
- UCHAR Slot; // Slot number that firmware image will be downloaded into.
- UCHAR Reserved[3];
- ULONGLONG Offset; // Image file offset, should be aligned to "ImagePayloadAlignment" value from STORAGE_FIRMWARE_INFO.
- ULONGLONG BufferSize; // should be multiple of "ImagePayloadAlignment" value from STORAGE_FIRMWARE_INFO.
- UCHAR ImageBuffer[ANYSIZE_ARRAY]; // firmware image file.
- } STORAGE_HW_FIRMWARE_DOWNLOAD, *PSTORAGE_HW_FIRMWARE_DOWNLOAD;
- #pragma warning(pop)
- //
- // Input parameter for IOCTL_STORAGE_FIRMWARE_ACTIVATE
- //
- typedef struct _STORAGE_HW_FIRMWARE_ACTIVATE {
- ULONG Version;
- ULONG Size;
- ULONG Flags;
- UCHAR Slot; // Slot with firmware image to be activated.
- UCHAR Reserved0[3];
- } STORAGE_HW_FIRMWARE_ACTIVATE, *PSTORAGE_HW_FIRMWARE_ACTIVATE;
- //
- // Parameter for IOCTL_STORAGE_PROTOCOL_COMMAND
- // Buffer layout: <STORAGE_PROTOCOL_COMMAND> <Command> [Error Info Buffer] [Data-to-Device Buffer] [Data-from-Device Buffer]
- //
- #define STORAGE_PROTOCOL_STRUCTURE_VERSION 0x1
- typedef struct _STORAGE_PROTOCOL_COMMAND {
- ULONG Version; // STORAGE_PROTOCOL_STRUCTURE_VERSION
- ULONG Length; // sizeof(STORAGE_PROTOCOL_COMMAND)
- STORAGE_PROTOCOL_TYPE ProtocolType;
- ULONG Flags; // Flags for the request
- ULONG ReturnStatus; // return value
- ULONG ErrorCode; // return value, optional
- ULONG CommandLength; // non-zero value should be set by caller
- ULONG ErrorInfoLength; // optional, can be zero
- ULONG DataToDeviceTransferLength; // optional, can be zero. Used by WRITE type of request.
- ULONG DataFromDeviceTransferLength; // optional, can be zero. Used by READ type of request.
- ULONG TimeOutValue; // in unit of seconds
- ULONG ErrorInfoOffset; // offsets need to be pointer aligned
- ULONG DataToDeviceBufferOffset; // offsets need to be pointer aligned
- ULONG DataFromDeviceBufferOffset; // offsets need to be pointer aligned
- ULONG CommandSpecific; // optional information passed along with Command.
- ULONG Reserved0;
- ULONG FixedProtocolReturnData; // return data, optional. Some protocol, such as NVMe, may return a small amount data (DWORD0 from completion queue entry) without the need of separate device data transfer.
- ULONG Reserved1[3];
- _Field_size_bytes_full_(CommandLength) UCHAR Command[ANYSIZE_ARRAY];
- } STORAGE_PROTOCOL_COMMAND, *PSTORAGE_PROTOCOL_COMMAND;
- //
- // Bit-mask values for STORAGE_PROTOCOL_COMMAND - "Flags" field.
- //
- #define STORAGE_PROTOCOL_COMMAND_FLAG_ADAPTER_REQUEST 0x80000000 // Flag indicates the request targeting to adapter instead of device.
- //
- // Status values for STORAGE_PROTOCOL_COMMAND - "ReturnStatus" field.
- //
- #define STORAGE_PROTOCOL_STATUS_PENDING 0x0
- #define STORAGE_PROTOCOL_STATUS_SUCCESS 0x1
- #define STORAGE_PROTOCOL_STATUS_ERROR 0x2
- #define STORAGE_PROTOCOL_STATUS_INVALID_REQUEST 0x3
- #define STORAGE_PROTOCOL_STATUS_NO_DEVICE 0x4
- #define STORAGE_PROTOCOL_STATUS_BUSY 0x5
- #define STORAGE_PROTOCOL_STATUS_DATA_OVERRUN 0x6
- #define STORAGE_PROTOCOL_STATUS_INSUFFICIENT_RESOURCES 0x7
- #define STORAGE_PROTOCOL_STATUS_NOT_SUPPORTED 0xFF
- //
- // Command Length for Storage Protocols.
- //
- #define STORAGE_PROTOCOL_COMMAND_LENGTH_NVME 0x40 // NVMe commands are always 64 bytes.
- //
- // Command Specific Information for Storage Protocols - "CommandSpecific" field.
- //
- #define STORAGE_PROTOCOL_SPECIFIC_NVME_ADMIN_COMMAND 0x01
- #define STORAGE_PROTOCOL_SPECIFIC_NVME_NVM_COMMAND 0x02
- //
- // Additional notes when STORAGE_PROTOCOL_TYPE is ProtocolTypeNvme:
- // 1. When flag STORAGE_PROTOCOL_COMMAND_FLAG_ADAPTER_REQUEST is set, or the request is sent through adapter, namespace Id from "Command" field is used;
- // otherwise, the underneath driver should determine namespace Id from the device that receives the command.
- // 2. When a command fails, the "ErrorCode" field contains value from NVMe Completion Queue Entry - DW3 - Status Field.
- // 3. "CommandLength" field must have value of 64. e.g. STORAGE_PROTOCOL_COMMAND_LENGTH_NVME.
- // 4. "CommandSpecific" field must have value of either STORAGE_PROTOCOL_SPECIFIC_NVME_ADMIN_COMMAND, or STORAGE_PROTOCOL_SPECIFIC_NVME_NVM_COMMAND.
- // 5. When a command succeeds, field "FixedProtocolReturnData" may contain value from NVMe Completion Queue Entry - DW0.
- //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement