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接口的硬盘如何获取它的主控和固件信息呢?
...全文
1093 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxh1124 2022-06-24
  • 打赏
  • 举报
回复

第一个sptwb.DataBuf要设东西,而且cdb也填错了

hxh1124 2022-06-24
  • 举报
回复
@hxh1124 另外不能用ata pass through来获取,你这个获取方式没问题
大鱼sln 2020-12-13
  • 打赏
  • 举报
回复
获取NVME的盘只能用win10 nvme.h提供的相关接口来儿取,IOCTL_ATA_PASS_THROUGH 是针对ata设备的
lwei2 2020-09-22
  • 打赏
  • 举报
回复
引用 3 楼 飞鹤0755 的回复:
获取硬盘的IDENTIFY,只能用IOCTL_ATA_PASS_THROUGH,不能用SCSI。
IOCTL_ATA_PASS_THROUGH这个控制码不是只适用ATA接口的硬盘吗?目前我想获取UASP (NVM Express)接口的硬盘,好像用那个控制码不合适吧……
lwei2 2020-09-22
  • 打赏
  • 举报
回复
引用 3 楼 飞鹤0755 的回复:
获取硬盘的IDENTIFY,只能用IOCTL_ATA_PASS_THROUGH,不能用SCSI。
大佬,那用IOCTL_ATA_PASS_THROUGH控制码怎么给NVME接口的硬盘发送CDB呢?方便再讲详细一些吗?因为我已经找了很多资料,试过很多办法和不同的控制码,但好像都没有把NVME接口的硬盘的主控和固件信息获取出来……
-飞鹤- 2020-09-22
  • 打赏
  • 举报
回复
获取硬盘的IDENTIFY,只能用IOCTL_ATA_PASS_THROUGH,不能用SCSI。
lwei2 2020-09-21
  • 打赏
  • 举报
回复
[quote=引用 1 楼 zgl7903 的回复:]失败时 GetLastError() 看错误返回值 再分析 大佬,分析了,GetLastError()返回0,sptwb.DataBuf获取的信息为空,因此返回主控和固件信息也为空。那个返回值说明它操作成功,但不知道该怎么定位它的问题。请问你有什么办法可以帮一下忙或意见,令我可以将NVME接口的硬盘主控和固件信息获取出来吗?
zgl7903 2020-09-19
  • 打赏
  • 举报
回复
失败时 GetLastError() 看错误返回值 再分析


2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧