SCSI_ADAPTER_BUS_INFO 構造体 (ntddscsi.h)
SCSI_ADAPTER_BUS_INFO構造体は、特定の SCSI バス上のすべてのデバイスの SCSI 照会データを取得するために、 IOCTL_SCSI_GET_INQUIRY_DATA 要求と組み合わせて使用されます。
構文
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 を含む) |