Windows API 通过IOCTL_SCSI_PASS_THROUGH获取硬盘的主控和固件信息失败

lwei2 lwei2 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位大佬,请问想获取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接口的硬盘如何获取它的主控和固件信息呢?
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
lwei2
硬件/系统 2,644 成员 17,229 内容