#include <stdio.h> #include <windows.h> #include <winioctl.h> #include <ntddscsi.h> typedef struct _INQUIRYDATA { UCHAR DeviceType:5; UCHAR DeviceTypeQualifier:3; UCHAR DeviceTypeModifier:7; UCHAR RemovableMedia:1; UCHAR Versions; UCHAR ResponseDataFormat; UCHAR AdditionalLength; UCHAR Reserved[2]; UCHAR SoftReset:1; UCHAR CommandQueue:1; UCHAR Reserved2:1; UCHAR LinkedCommands:1; UCHAR Synchronous:1; UCHAR Wide16Bit:1; UCHAR Wide32Bit:1; UCHAR RelativeAddressing:1; UCHAR VendorId[8]; UCHAR ProductId[16]; UCHAR ProductRevisionLevel[4]; UCHAR VendorSpecific[20]; UCHAR Reserved3[40]; } INQUIRYDATA, *PINQUIRYDATA; int main(void) { HANDLE hFile = CreateFile("\\\\.\\scsi0:",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); IO_SCSI_CAPABILITIES Cap ; DWORD temp; BOOL bRet = DeviceIoControl(hFile,IOCTL_SCSI_GET_CAPABILITIES, NULL,0, &Cap,sizeof(IO_SCSI_CAPABILITIES), &temp,NULL); if (!bRet) { printf("Error code:%x\n",GetLastError()); } const int INQUIRY_DATA_SIZE=2048; PSCSI_ADAPTER_BUS_INFO AdapterInformation = (PSCSI_ADAPTER_BUS_INFO) new UCHAR[INQUIRY_DATA_SIZE]; bRet = DeviceIoControl(hFile,IOCTL_SCSI_GET_INQUIRY_DATA, NULL,0, AdapterInformation,INQUIRY_DATA_SIZE, &temp,NULL); if (!bRet) { printf("Error code:%x\n",GetLastError()); } PUCHAR Buffer = (PUCHAR)AdapterInformation; for (int Bus=0;Bus<AdapterInformation->NumberOfBuses;Bus++) { PSCSI_INQUIRY_DATA UnitInfo = (PSCSI_INQUIRY_DATA)(Buffer + AdapterInformation->BusData[Bus].InquiryDataOffset); while (AdapterInformation->BusData[Bus].InquiryDataOffset) { PINQUIRYDATA InquiryData = (PINQUIRYDATA)UnitInfo->InquiryData; printf("Device: '%.8s'\n", InquiryData->VendorId); printf("%s\n",InquiryData->ProductId); if (UnitInfo->NextInquiryDataOffset == 0) break; UnitInfo = (PSCSI_INQUIRY_DATA) (Buffer + UnitInfo->NextInquiryDataOffset); } } delete[] AdapterInformation; return 0; }