Мне необходимо получить серийные номера различных устройств хранения данных. На данный момент написан код, корректно работающий с HDD, однако при работе с SSD функция возвращает не тот результат (0000_0000_0100_0000_E4D2_5C42_46E3_4D01
), который я ожидаю.
Также пробовал использовать WMI, результат тот же.
Вопрос такой: корректно ли я использую данный код в применении к SSD. Возможно, есть ли какие-то другие решения, не стесняйтесь, пишите.
// 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;
}
Пробовал получить данный серийный номер из Linux и UEFI - результат одинаковый, номер отображается корректно.
Также пытался получить данный серийный номер GUI средствами Windows - не смог найти решения (но номер необходимо получить именно программно).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Скачал студию 32 канари вот хочу попробовать поработать с новой навигацией
К примеру мне нужно проверить, существует ли какие-либо данные в map, если существуют, то вернуть иначе загрузить из базы данных
Возникает ошибка при создании: (9:9)illegal start of expression