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 數據區塊內容。

備註

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)

另請參閱

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