Получить правильный серийный номер 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 ключ и нашел там правильный серийный номер (как я предполагаю). Это число совпадает с результатом udevadm info -q all -n /dev/sda8 | grep SERIAL на ОС Linux.

SSD S / N, полученный таким способом, также не распознается. Это выглядит так: 0000_0000_0100_0000_E4D2_5C42_46E3_4D01

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]