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 的可能值為下列其中一項。
值 | 意義 |
---|---|
|
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
SRB 數據的長度,以位元組為單位,存在於 Data 成員中。
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) |