C++ SSD序列号不正确
我正在尝试获取物理驱动器的制造商序列号 我正试图通过这种方式获得它(该代码与HDD配合使用效果很好,但返回的序列号不正确,类似于以下内容:C++ SSD序列号不正确,c++,windows,winapi,C++,Windows,Winapi,我正在尝试获取物理驱动器的制造商序列号 我正试图通过这种方式获得它(该代码与HDD配合使用效果很好,但返回的序列号不正确,类似于以下内容:0000\u 0000\u 0100\u 0000\u E4D2\u 5C42\u 46E3\u 4D01): 所以问题是我使用API的方式是否正确?如果有人知道如何以另一种方式获取序列号,我很乐意看到 编辑: 我还尝试使用WMI Linux和UEFI环境显示正确的结果,在Windows上我无法实现。为什么您认为0000\u 0000\u 0100\u 000
0000\u 0000\u 0100\u 0000\u E4D2\u 5C42\u 46E3\u 4D01
):
所以问题是我使用API的方式是否正确?如果有人知道如何以另一种方式获取序列号,我很乐意看到
编辑:
我还尝试使用WMI
Linux和UEFI环境显示正确的结果,在Windows上我无法实现。为什么您认为
0000\u 0000\u 0100\u 0000\u E4D2\u 5C42\u 46E3\u 4D01
不正确?这是什么设备返回给你。你认为什么是“正确的”?同样,与具体结果无关,如果你抛出,谁会调用LocalFree(buf)代码>?@RbMm我认为这个数字不正确,因为它显示的结果与linux和uefi不同(linux和uefi显示的结果相同)。在linux上,我是这样做的:udevadm info-qall-n/dev/nvme0n1 | grep SERIAL
但是如果windows将此字符串返回给您-您想要什么指定从结构开头到包含设备产品版本字符串的以null结尾的ASCII字符串的字节偏移量。如果设备没有产品修订字符串,则此成员为零。如果serialnumberofset
不为零,则这是驱动程序为此设备对象返回的值。此字符串由驱动程序返回(如果不为空)。
// 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;
}