#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;
}