共用方式為


SCSI_ADAPTER_BUS_INFO 結構 (ntddscsi.h)

SCSI_ADAPTER_BUS_INFO結構會與 IOCTL_SCSI_GET_INQUIRY_DATA 要求搭配使用,以擷取指定 SCSI 總線上所有裝置的 SCSI 查詢數據。

注意 未來可能會變更或無法使用 SCSI 埠驅動程式和 SCSI 迷你埠驅動程式模型。 相反地,我們建議使用 Storport 驅動程式Storport 迷你埠 驅動程式模型。
 

語法

typedef struct _SCSI_ADAPTER_BUS_INFO {
  UCHAR         NumberOfBuses;
  SCSI_BUS_DATA BusData[1];
} SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;

成員

NumberOfBuses

包含正在報告查詢數據之適配卡上的總線數目。

BusData[1]

包含保存查詢數據的 SCSI_BUS_DATA 結構的可變長度陣列。

備註

SCSI_ADAPTER_BUS_INFO是一種標頭結構,描述 IOCTL_SCSI_GET_INQUIRY_DATA 要求的輸出緩衝區配置。 此要求會針對與特定 SCSI 主機總線適配卡相關聯的所有總線上所有邏輯單元傳回 SCSI 查詢數據, (HBA) 。 SCSI_ADAPTER_BUS_INFO的 BusData 成員包含 SCSI_BUS_DATA 結構的可變長度陣列。 此陣列具有適配卡上每個SCSI總線的一個元素,因此其大小等於 SCSI_ADAPTER_BUS_INFO NumberOfBuses 成員中所指出的總線數目。

在大部分情況下, NumberOfBuses 的值會是 1。 早期 SCSI 總線限制為 36 個目標 (,而不是目前的限制 128) ,因此有些廠商製造了具有數個總線的 HBA,以增加目標數目上限。 為了支持這些較舊的 HBA,Windows 提供從具有多個總線的 HBA 擷取查詢數據的機制。 對於具有單一總線的配接器, NumberOfBuses 將會是一個,而 SCSI_ADAPTER_BUS_INFO 的 BusData 成員只有一個元素,但具有多個總線的 HBA 會產生多個SCSI_BUS_DATA結構的數據, 而 NumberOfBuses 將會大於 1。

在 BusData 中緊接數位之後,就是所有屬於 HBA 之公交車上所有裝置的查詢數據。 每個SCSI_BUS_DATA結構的 In查詢DataOffset 成員會針對對應的 SCSI 總線提供查詢數據的位移。

每個 SCSI 總線的查詢數據都包含該總線上所有邏輯單元的相關信息。 每個邏輯單元的查詢數據都會格式化為類型 為 SCSI_INQUIRY_DATA,而特定總線的所有SCSI_INQUIRY_DATA結構都會由 NextIn 查詢DataOffset 成員連結在一起。 每個 SCSI 總線會有個別的清單,而每個清單中最後一個結構的 NextIn 查詢DataOffset 成員會包含零的值。

下列虛擬程式代碼範例說明如何逐步執行 HBA 上的 SCSI 總線,以及每個總線的邏輯單元、讀取和列印每個邏輯單元的查詢數據:

VOID
PrintInquiryData(PCHAR  DataBuffer)
{
    PSCSI_ADAPTER_BUS_INFO  adapterInfo;
    PSCSI_INQUIRY_DATA inquiryData;
    ULONG i, j;

    adapterInfo = (PSCSI_ADAPTER_BUS_INFO) DataBuffer;
    for (i = 0; i < adapterInfo->NumberOfBuses; i++) {
       inquiryData = (PSCSI_INQUIRY_DATA) (DataBuffer +
          adapterInfo->BusData[i].InquiryDataOffset);
       while (adapterInfo->BusData[i].InquiryDataOffset) {
          printf(" %d   %d  %3d    %s    %.28s ",
             i,
             inquiryData->TargetId,
             inquiryData->Lun,
             (inquiryData->DeviceClaimed) ? "Y" : "N",
             &inquiryData->InquiryData[8]);
          for (j = 0; j < 8; j++) {
             printf("%02X ", inquiryData->InquiryData[j]);
          }
          printf("\n");
          if (inquiryData->NextInquiryDataOffset == 0) {
             break;
          }
          inquiryData = (PSCSI_INQUIRY_DATA) (DataBuffer +
             inquiryData->NextInquiryDataOffset);
       }
    }
    printf("\n\n");
}

您必須使用 NextIn查詢DataOffset 成員來尋找下一個邏輯單元的查詢數據。 請勿嘗試透過指標算術來執行此動作。 每個 HBA 迷你埠驅動程式的每個SCSI_INQUIRY_DATA結構位置可能不同,因為它取決於數據對齊需求。

規格需求

需求
標頭 ntddscsi.h (包含 Ntddscsi.h)

另請參閱

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA