【问题标题】:How can I query the manufacturer of a drive in the Windows API?如何在 Windows API 中查询驱动器的制造商?
【发布时间】:2020-04-18 13:51:58
【问题描述】:

我对如何以编程方式检测连接到 Windows PC 的硬盘驱动器、SSD 等的制造商感兴趣。如果有什么不同,我可能会在 Windows 10 上使用 C++。

也许有多个级别,也许是注册表、Windows API、SATA、USB?

我需要一种适用于通过 USB 连接的外部驱动器的方法。我想我正在寻找可以查询硬件的 Windows API。

谷歌搜索我只能找到从控制台或某些应用程序查看此信息的方法,或者查询有关驱动器的其他信息而不是制造商的方法。

【问题讨论】:

  • 您可以使用 WMI 的 Win32_DiskDrive 类 docs.microsoft.com/en-us/windows/win32/cimwin32prov/… 。否则查询磁盘本身,但它更复杂:stackoverflow.com/questions/5070987/… 但是您会发现 WMI 的制造商字段通常填充有“(标准磁盘驱动器)”。对于其他 API,将一无所有。如果是这种情况,则意味着此信息根本不可用。您只会得到模型(通常包含一些提示,例如 Western Digital 的“WDC”)
  • 例如,设备管理器中列出的磁盘驱动器:Samsung SSD 850 EVO 500GB,您要获取的是制造商名称,如Samsung
  • @RitaHan-MSFT:是的。我不知道我是否必须解析这样的字符串,格式是否可靠,或者是否有一些低级二进制数可以在表中查找?
  • @hippietrail 这个答案对你有用吗?

标签: windows winapi drive usb-drive


【解决方案1】:

您会在以下注册表项中找到硬件磁盘制造商名称,例如:

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

有一个值名称“Identifier”似乎是您要查找的内容:

以下是使用Registry Functions查询该值的示例:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多