Windows API 通过IOCTL_SCSI_PASS_THROUGH获取硬盘的主控和固件信息失败
lwei2 2020-09-16 03:15:48 各位大佬,请问想获取NVME接口的硬盘的主控和固件信息,代码思路如下:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct _SCSI_PASS_THROUGH_WITH_BUFFERS24 {
SCSI_PASS_THROUGH Spt;
UCHAR SenseBuf[24];
UCHAR DataBuf[512];
} SCSI_PASS_THROUGH_WITH_BUFFERS24, *PSCSI_PASS_THROUGH_WITH_BUFFERS24;
/////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL bRet;
DWORD dwReturned;
DWORD length;
SCSI_PASS_THROUGH_WITH_BUFFERS24 sptwb;
HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive2", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "#####:Error:%ld\n", GetLastError());
return FALSE;
}
::ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS24));
sptwb.Spt.Length = sizeof(SCSI_PASS_THROUGH);
//......
sptwb.Spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf);
sptwb.Spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, SenseBuf);
sptwb.Spt.CdbLength = 16;
//......
sptwb.DataBuf[0] = 1;
length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf) + sptwb.Spt.DataTransferLength;
bRet = ::DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH,
&sptwb, length,
&sptwb, length, &dwReturned, NULL);
if (bRet == FALSE)
{
::CloseHandle(hDevice);
return FALSE;
}
sptwb.Spt.CdbLength = 16;
//......
bRet = ::DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH,
&sptwb, length,
&sptwb, length, &dwReturned, NULL);
if (bRet == FALSE)
{
::CloseHandle(hDevice);
return FALSE;
}
DWORD count = 0;
for (int i = 0; i < 1024; i++)
{
count += sptwb.DataBuf[i];
}
if (count == 0)
{
fprintf(stderr, "#####:Error:%ld\n", GetLastError());
::CloseHandle(hDevice);
return FALSE;
}
fprintf(stderr, "Buf:%s\n", sptwb.DataBuf);
::CloseHandle(hDevice);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
请问为啥sptwb这个获取为空呢??像NVME接口的硬盘如何获取它的主控和固件信息呢?