SRBEX_DATA構造体 (storport.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 データ ブロックの内容。
注釈
SRB 拡張データは、STORAGE_REQUEST_BLOCK構造体の SrbExDataOffset 配列に有効なオフセット位置が含まれている場合に存在します。 ストレージ ドライバーは、最初に 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 |
Header | storport.h (Storport.h、Srb.h、Minitape.h を含む) |