Как я могу запросить производителя диска в Windows API? - PullRequest
0 голосов
/ 18 апреля 2020

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

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

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

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

1 Ответ

1 голос
/ 22 апреля 2020

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

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

Существует значение «Identifier», которое выглядит так, как вы ищете. for:

enter image description here

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

#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);
}
...