다음을 통해 공유


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 버스에 대해 하나의 요소가 있으므로 크기는 SCSI_ADAPTER_BUS_INFO NumberOfBuses 멤버에 표시된 버스 수와 같습니다.

대부분의 경우 NumberOfBuses 의 값은 1입니다. 초기 SCSI 버스는 현재 128개가 아닌 36개의 대상으로 제한되었으므로 일부 공급업체는 최대 목표 수를 늘리기 위해 여러 대의 버스로 HBA를 제조했습니다. 이러한 이전 HBA를 지원하기 위해 Windows는 여러 버스가 있는 HBA에서 조회 데이터를 검색하는 메커니즘을 제공합니다. 단일 버스가 있는 어댑터의 경우 NumberOfBuses 는 1이고 SCSI_ADAPTER_BUS_INFO BusData 멤버에는 요소가 하나만 있지만 버스가 여러 개 있는 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 미니포트 드라이버에 대해 잠재적으로 다릅니다.

요구 사항

요구 사항
헤더 ntddscsi.h(Ntddscsi.h 포함)

추가 정보

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA