c++ - SSD 序列号不正确
问题描述
我正在尝试获取物理驱动器的制造商序列号。
我正在尝试以这种方式获取它(该代码在 HDD 上运行得很好,但返回的序列号不正确,如下所示0000_0000_0100_0000_E4D2_5C42_46E3_4D01
):
// there I get handle to physical drive
// HANDLE h = CreateFile(L"\\\\.\\PhysicalDrive0", FILE_ANY_ACCESS , FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
// bool success = h != INVALID_HANDLE_VALUE;
std::string getSerialNumber(HANDLE h)
{
std::string result;
static STORAGE_PROPERTY_QUERY spq = { StorageDeviceProperty, PropertyStandardQuery };
union {
PVOID buf;
PSTR psz;
PSTORAGE_DEVICE_DESCRIPTOR psdd;
};
ULONG size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 0x100;
ULONG dwError;
do
{
dwError = ERROR_NO_SYSTEM_RESOURCES;
if (buf = LocalAlloc(0, size))
{
DWORD returned;
if (DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), buf, size, &returned, 0))
{
if (psdd->Version >= sizeof(STORAGE_DEVICE_DESCRIPTOR))
{
if (psdd->Size > size)
{
size = psdd->Size;
dwError = ERROR_MORE_DATA;
}
else
{
if (psdd->SerialNumberOffset)
{
result = psz + psdd->SerialNumberOffset;
dwError = NOERROR;
}
else
{
throw std::runtime_error(std::to_string(ERROR_NO_DATA));
}
}
}
else
{
throw std::runtime_error(std::to_string(ERROR_GEN_FAILURE));
}
}
else
{
throw std::runtime_error(std::to_string(GetLastError()));
}
LocalFree(buf);
}
} while (dwError == ERROR_MORE_DATA);
return result;
}
所以问题是我使用 API 的方式正确吗?如果有人知道如何以另一种方式获得序列号,我会很高兴看到它。
编辑: 我也尝试使用 WMI。
Linux 和 UEFI 环境显示正确的结果,在 Windows 上我无法实现。
解决方案
推荐阅读
- sql - 如何在 SQL Server 2012 的列中查找最大值
- node.js - 如何使用 Lerna 和 Yarn 安装预发布包?
- javascript - 为什么 onClick 事件在下面的代码中不起作用?
- angular - 如何在应用程序中安排 1 个计时器 - 服务不是单例的?
- reactjs - 运行反应应用程序时的 RESULT_CODE_INVALID_CMDLINE_URL
- scala - Scala Circe 推断类
- assembly - 如果使用 Intel 语法,GAS 可以在非 Intel 系统上组装吗?
- angular - “对象”类型错误中不存在属性
- python - 无法理解:ValueError: Graph disconnected: cannot get value for tensor Tensor
- java - jconsole之类的java监控工具会强制垃圾回收吗?