SRBEX_DATA结构 (srb.h)
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 的可能值为以下值之一。
值 | 含义 |
---|---|
|
SRB 扩展数据类型未知。 |
|
SRB 扩展数据的格式设置为 SRBEX_DATA_BIDIRECTIONAL 结构。 |
|
SRB 扩展数据的格式设置为 SRBEX_DATA_SCSI_CDB16 结构。 |
|
SRB 扩展数据的格式设置为 SRBEX_DATA_SCSI_CDB32 结构。 |
|
SRB 扩展数据的格式设置为 SRBEX_DATA_SCSI_CDB_VAR 结构。 |
|
SRB 扩展数据的格式设置为 SRBEX_DATA_WMI 结构。 |
|
SRB 扩展数据的格式设置为 SRBEX_DATA_POWER 结构。 |
|
SRB 扩展数据的格式设置为 SRBEX_DATA_PNP 结构。 |
|
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开始可用。 |
标头 | srb.h (包括 Storport.h、Srb.h、Minitape.h) |