Неверное отображение серийного номера SSD диска

167
11 августа 2018, 01:50

Мне необходимо получить серийные номера различных устройств хранения данных. На данный момент написан код, корректно работающий с 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 - не смог найти решения (но номер необходимо получить именно программно).

READ ALSO
Как определить зависимость для androidX?

Как определить зависимость для androidX?

Скачал студию 32 канари вот хочу попробовать поработать с новой навигацией

185
Что быстрее map.containsKey(key) || map.get(key) != null

Что быстрее map.containsKey(key) || map.get(key) != null

К примеру мне нужно проверить, существует ли какие-либо данные в map, если существуют, то вернуть иначе загрузить из базы данных

176
Ошибка: illegal start of expression

Ошибка: illegal start of expression

Возникает ошибка при создании: (9:9)illegal start of expression

193
Ошибка в HibernateUtil.java

Ошибка в HibernateUtil.java

Ошибка Exception in thread "JavaFX Application Thread" javalang

245