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 に指定できる値は、次のいずれかです。

意味
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

データ メンバーに存在する 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 srb.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