获取正确的USB驱动器序列号

时间:2018-06-18 13:44:48

标签: c++ winapi serial-number

我想要

  • HDD
  • USB闪光灯
  • SSD

正确驱动制造商序列号。

我是winapi的新手,想知道:有没有办法用相同的代码来做?

WMI也没有取得好成绩,DeviceIoControl也是如此。某些USB设备的序列号错误(错误的键结果始终相同)。

我正试图以这种方式获取序列号(这段代码我从源代码中获取,我不记得了):

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))
        {
            if (DeviceIoControl(h, IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), buf, size, 0, 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;
                        }
                    }
                }
            }
            LocalFree(buf);
        }
    } while (dwError == ERROR_MORE_DATA);
    return result;
}

此代码工作得很好,但并非适用于所有USB设备。对于其中一些,它返回12345678123456781234567812345678。 WMI方法为我测试的所有设备返回相同的内容。

我还尝试检查HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB密钥并找到正确的序列号(我假设)。此数字与linux OS上udevadm info -q all -n /dev/sda8 | grep SERIAL的结果相同。

SSD S / N收到这种方式也无法识别。它看起来像这样:0000_0000_0100_0000_E4D2_5C42_46E3_4D01

0 个答案:

没有答案