Windows API 通过IOCTL_SCSI_PASS_THROUGH获取硬盘的主控和固件信息失败
各位大佬,请问想获取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接口的硬盘如何获取它的主控和固件信息呢?
/////////////////////////////////////////////////////////////////////////////////////////////////////////
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接口的硬盘如何获取它的主控和固件信息呢?
...全文
相关推荐
不用驱动直接获取硬盘信息
硬盘型号,硬盘序列号,硬盘缓存大小,硬盘容量
【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04
编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421云原生数据库:TiDBHTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)
易语言源码取硬盘特征字揭密
易语言源码取硬盘特征字揭密
易语言源码易语言特殊取硬盘特征源码
易语言源码易语言特殊取硬盘特征源码
VC编程在Windows下直接读写磁盘扇区数据_磁盘读写_Vc_
VC编程在Windows下直接读写磁盘扇区数据


硬件/系统
