Как я могу запросить производителя диска в Windows API?

Меня интересует, как программно определить производителя жесткого диска, SSD и т. Д., Подключенного к ПК с Windows. Если это имеет значение, я, вероятно, буду использовать C ++ в Windows 10.

Возможно, есть несколько уровней, возможно, реестр, Windows API, SATA, USB?

Мне нужен метод, который будет работать для внешних накопителей, подключенных по USB. Я думаю, что ищу Windows API, который будет запрашивать оборудование.

Я могу найти в Google только способы просмотра этой информации с консоли или какого-либо приложения или способы запроса другой информации о дисках, но не о производителе.


person hippietrail    schedule 18.04.2020    source источник
comment
Вы можете использовать класс WMI Win32_DiskDrive docs.microsoft.com/en- us / windows / win32 / cimwin32prov /. В противном случае запросите сам диск, но это будет сложнее: stackoverflow.com/questions/5070987/ Но, как вы узнаете, поля производителя WMI часто заполняются (Стандартные диски). Для других API ничего не будет. Если это так, значит, эта информация вообще недоступна. Вы получите только модель (которая часто содержит намек, например, WDC для Western Digital).   -  person Simon Mourier    schedule 18.04.2020
comment
Например, диск, указанный в диспетчере устройств: Samsung SSD 850 EVO 500GB, вы хотите получить название производителя, например Samsung?   -  person Rita Han    schedule 20.04.2020
comment
@ RitaHan-MSFT: Да. Я не знаю, нужно ли мне анализировать такую ​​строку и будет ли этот формат надежным, или есть какие-то двоичные числа низкого уровня, которые нужно искать в таблице?   -  person hippietrail    schedule 20.04.2020
comment
@hippietrail Подходит ли вам ответ?   -  person Rita Han    schedule 24.04.2020


Ответы (1)


Вы найдете название производителя аппаратного диска, например, в следующем ключе реестра:

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0

Имя значения "Identifier" кажется тем, что вы ищете:

введите описание изображения здесь

Ниже приведен пример запроса этого значения с использованием функций реестра :

#include <windows.h>
#include <tchar.h>

#define MAX_VALUE_NAME 16383

void QueryKey(HKEY hKey)
{
    DWORD    cValues;   // number of values for key 
    DWORD    retCode;
    TCHAR    pvData[MAX_VALUE_NAME];
    DWORD    cbData = sizeof(TCHAR) * MAX_VALUE_NAME;
    TCHAR    targetValue[] = L"Identifier";

    // Get the value count. 
    retCode = RegQueryInfoKey(
        hKey,           // key handle 
        NULL,           
        NULL,           
        NULL,                    
        NULL,               
        NULL,            
        NULL,            
        &cValues,       // number of values for this key 
        NULL,            
        NULL,         
        NULL,   
        NULL);       

    // Get the key value. 
    if (cValues)
    {
        retCode = RegGetValue(hKey, NULL, targetValue, RRF_RT_REG_SZ, NULL, pvData, &cbData);
        if (retCode != ERROR_SUCCESS)
        {
            _tprintf(TEXT("RegGetValue fails with error: %d\n", retCode));
            return;
        }
        _tprintf(TEXT("%s: %s\n"), targetValue, pvData);
    }
}

void main(void)
{
    HKEY hTestKey;

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        TEXT("HARDWARE\\DEVICEMAP\\\Scsi\\Scsi Port 0\\Scsi Bus 0\\Target Id 0\\Logical Unit Id 0"),
        0,
        KEY_READ,
        &hTestKey) == ERROR_SUCCESS
        )
    {
        QueryKey(hTestKey);
    }

    RegCloseKey(hTestKey);
}
person Rita Han    schedule 22.04.2020