SCSI_ADAPTER_BUS_INFO 構造体 (ntddscsi.h)

SCSI_ADAPTER_BUS_INFO構造体は、特定の SCSI バス上のすべてのデバイスの SCSI 照会データを取得するために、 IOCTL_SCSI_GET_INQUIRY_DATA 要求と組み合わせて使用されます。

メモ 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 ホスト バス アダプター (HBA) に関連付けられているすべてのバス上のすべての論理ユニットの SCSI 照会データを返します。 SCSI_ADAPTER_BUS_INFO の BusData メンバーには、 SCSI_BUS_DATA 構造体の可変長配列が含まれています。 この配列には、アダプター上の SCSI バスごとに 1 つの要素があるため、そのサイズは、SCSI_ADAPTER_BUS_INFO の NumberOfBuses メンバーに示されているバスの数と等しくなります。

ほとんどの場合、 NumberOfBuses の値は 1 になります。 初期の SCSI バスは (現在の制限の 128 ではなく) 36 個のターゲットに制限されていたため、一部のベンダーでは、ターゲットの最大数を増やすために、複数のバスで HBA を製造していました。 これらの古い HBA をサポートするために、Windows には、複数のバスを使用して HBA から照会データを取得するためのメカニズムが用意されています。 1 つのバスを持つアダプターの場合、 NumberOfBuses は 1 つになり、SCSI_ADAPTER_BUS_INFO の BusData メンバーには 1 つの要素しかありませんが、複数のバスを持つ HBA は複数のSCSI_BUS_DATA構造体のデータを生成し、 NumberOfBuses は 1 より大きくなります。

BusData の配列の直後には、HBA に属するすべてのバス上のすべてのデバイスの照会データがあります。 各SCSI_BUS_DATA構造体の InquiryDataOffset メンバーは、対応する SCSI バスの照会データへのオフセットを提供します。

各 SCSI バスの照会データには、そのバス上のすべての論理ユニットに関する情報が含まれます。 各論理ユニットの照会データは 、SCSI_INQUIRY_DATA型の構造体で書式設定され、特定のバスのすべてのSCSI_INQUIRY_DATA構造体が NextInquiryDataOffset メンバーによってリンクされます。 SCSI バスごとに個別のリストがあり、各リストの最後の構造体の NextInquiryDataOffset メンバーには 0 の値が含まれます。

次の擬似コード例は、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");
}

NextInquiryDataOffset メンバーを使用して、次の論理ユニットの照会データを検索する必要があります。 ポインターの算術演算では、この操作を実行しないでください。 各SCSI_INQUIRY_DATA構造の配置は、データ配置の要件に依存するため、HBA ミニポート ドライバーごとに異なる可能性があります。

要件

要件
Header ntddscsi.h (Ntddscsi.h を含む)

こちらもご覧ください

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA