storport.h) (SRBEX_DATA 结构

SRBEX_DATA结构是包含扩展 SRB 数据的通用格式。

注意 SCSI 端口驱动程序和 SCSI 微型端口驱动程序模型将来可能会更改或不可用。 相反,我们建议使用 Storport 驱动程序Storport 微型端口 驱动程序模型。
 

语法

typedef struct _SRBEX_DATA {
  SRBEXDATATYPE Type;
  ULONG         Length;
  UCHAR         Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;

成员

Type

扩展 SRB 数据结构的数据类型指示器。 Type 的可能值为以下值之一。

含义
SrbExDataTypeUnknown
SRB 扩展数据类型未知。
SrbExDataTypeBidirectional
SRB 扩展数据的格式设置为 SRBEX_DATA_BIDIRECTIONAL 结构。
SrbExDataTypeScsiCdb16
SRB 扩展数据的格式设置为 SRBEX_DATA_SCSI_CDB16 结构。
SrbExDataTypeScsiCdb32
SRB 扩展数据的格式设置为 SRBEX_DATA_SCSI_CDB32 结构。
SrbExDataTypeScsiCdbVar
SRB 扩展数据的格式设置为 SRBEX_DATA_SCSI_CDB_VAR 结构。
SrbExDataTypeWmi
SRB 扩展数据的格式设置为 SRBEX_DATA_WMI 结构。
SrbExDataTypePower
SRB 扩展数据的格式设置为 SRBEX_DATA_POWER 结构。
SrbExDataTypePnp
SRB 扩展数据的格式设置为 SRBEX_DATA_PNP 结构。
SrbExDataTypeIoInfo
SRB 扩展数据的格式设置为 SRBEX_DATA_IO_INFO 结构。

Length

Data 成员中存在的 SRB 数据的长度(以字节为单位)。

Data[ANYSIZE_ARRAY]

扩展的 SRB 数据块内容。

注解

STORAGE_REQUEST_BLOCK结构中的 SrbExDataOffset 数组包含有效的偏移位置时,SRB 扩展数据就会出现。 存储驱动程序最初将 SrbExDataOffset 中包含的内存偏移位置引用为 SRBEX_DATA 结构。 然后,根据 Type 成员中的数据类型值,将指向数据块的指针强制转换为适当的结构类型。

以下示例代码片段演示如何访问 SRB_FUNCTION_PNP SRB 函数的扩展数据。

BOOLEAN CheckIo( _In_ PSCSI_REQUEST_BLOCK Srb)
{
    BOOLEAN result = TRUE;
    ULONG function;
    PSTORAGE_REQUEST_BLOCK SrbEx = (PSTORAGE_REQUEST_BLOCK)Srb;
    PSRBEX_DATA SrbExData = NULL;

    function = (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK) ? SrbEx->SrbFunction : Srb->Function;

    switch (function)
    {
        case SRB_FUNCTION_PNP:
        {
            STOR_PNP_ACTION PnpAction;
            BOOLEAN ForAdapter;

            if (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
            {
                PSRBEX_DATA_PNP SrbExDataPnp = NULL;

                SrbExData = (PSRBEX_DATA) ((PUCHAR)SrbEx + SrbEx->SrbExDataOffset[0]);
                if (SrbExData->Type == SrbExDataTypePnp)
                {
                    SrbExDataPnp = (PSRBEX_DATA_PNP) SrbExData;
                    ForAdapter = (SrbExDataPnp->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
                    PnpAction = SrbExDataPnp->PnPAction;
                }
                else
                {
                    ForAdapter = FALSE;
                    result = FALSE;
                }
            }
            else
            {
                PSCSI_PNP_REQUEST_BLOCK PnpSrb = (PSCSI_PNP_REQUEST_BLOCK)Srb;

                ForAdapter = (PnpSrb->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
                PnpAction = PnpSrb->PnPAction;
           }

           if (ForAdapter)
           {
               switch (PnpAction)
               {
                   case StorRemoveDevice:
                       //
                       // ...
                       //
                       Srb->SrbStatus = SRB_STATUS_SUCCESS;
                       break;

                   default:
                       Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
                       result = FALSE;
                       break:
            }
        }

        default:
            break; 
    }

    return result;
}

要求

要求
最低受支持的客户端 Windows 8
标头 storport.h (包括 Storport.h、Srb.h、Minitape.h)

另请参阅

SRBEX_DATA_BIDIRECTIONAL

SRBEX_DATA_IO_INFO

SRBEX_DATA_PNP

SRBEX_DATA_POWER

SRBEX_DATA_SCSI_CDB16

SRBEX_DATA_SCSI_CDB32

SRBEX_DATA_SCSI_CDB_VAR

SRBEX_DATA_WMI