通过windows注册表 获取设备驱动版本号

下面以获取intel显卡(Intel(R) UHD Graphics 630)驱动版本为例进行说明:

1.首先下在任务管理中获取到对应设备的class id。如下图

通过windows注册表 获取设备驱动版本号_第1张图片

 

2.打开对应的注册表

string strVer="";
HKEY hKey = NULL;
if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}", 0, KEY_READ , &hKey) == ERROR_SUCCESS)
{
     WriteLogE("OPen Regedit Err!");
    return "";
}

3.获取子节点个数:

char  szClassname[255];//类名
    DWORD dwClassnameLength;//装载类名缓冲区的长度            
    DWORD dwsubsum;//保存这个项的子项数量
    DWORD dwMaxSubKeyLen;//装载这个项最长一个子项的长度 
    DWORD dwMaxClassLen;//装载这个项之子项的最长一个类名的长度  
    DWORD dwValues;//用于装载这个项的设置值数量的一个变量
    DWORD dwMaxValueNameLen;//装载这个项之子项的最长一个值名的长度        
    DWORD dwMaxValueLen;//装载容下这个项最长一个值数据所需的缓冲区长度               
    DWORD dwSecurityDescriptor;//装载值安全描述符长度的一个变量      
    FILETIME strftLastWriteTime;//指定一个结构,用于容纳该项的上一次修改时间

    // 获取类名和数量
    DWORD dwret = RegQueryInfoKeyA(
        hKey,                    // 键的句柄
        szClassname,             //  类名 
        &dwClassnameLength,      // 类名长度 
        NULL,                    // 保留
        &dwsubsum,               // 子键的数量
        &dwMaxSubKeyLen,         // 子键长度
        &dwMaxClassLen,          // 类长度
        &dwValues,               // 子键键值数量
        &dwMaxValueNameLen,      // 子键名长度
        &dwMaxValueLen,          // 键值长度
        &dwSecurityDescriptor,   // 安全描述符
        &strftLastWriteTime);    // 最后写时间 

4.循环遍历查找所有子节点的DriverDesc的值是否包含“Graphics 630”,若包含再获取DrivrVersion的键值就是对应的版本号

5.需要用RegCloseKey关闭所有打开的注册表句柄。

char szKeyvalue[255];
    DWORD dwKeyvalueLen;
    if (dwsubsum != 0)
    {
        for (int i = 0; i < dwsubsum; i++)
        {
            memset(szKeyvalue, 0, sizeof(szKeyvalue));
            dwKeyvalueLen = 255;
            dwret = RegEnumKeyExA(
                hKey,
                i,//欲获取的子项的索引。第一个子项的索引编号为零
                szKeyvalue,//用于装载指定索引处项名的一个缓冲区
                &dwKeyvalueLen, //装载szKeyvalue的实际长度
                NULL,
                NULL,
                NULL,
                &strftLastWriteTime);
            if (dwret == ERROR_SUCCESS)
            {
                HKEY hSubKey;
                LSTATUS lRet = RegOpenKeyExA(hKey, szKeyvalue, 0L, KEY_QUERY_VALUE, &hSubKey);
                DWORD dwType = 1;//定义数据类型
                DWORD dwLen = MAX_PATH;
                char data[MAX_PATH];

                if (ERROR_SUCCESS == lRet)
                {
                    if (ERROR_SUCCESS == RegQueryValueExA(hSubKey, "DriverDesc", NULL, &dwType, (LPBYTE)data, &dwLen))
                    {
                        if (strstr(data, "Graphics 630"))
                        {
                            if (ERROR_SUCCESS == RegQueryValueExA(hSubKey, "DriverVersion", NULL, &dwType, (LPBYTE)data, &dwLen))
                            {
                                strVer = data;
                                RegCloseKey(hSubKey);
                                break;
                            }
                        }
                    }
                }
                RegCloseKey(hSubKey);
            }
        }
    }

 

你可能感兴趣的:(VC,获取驱动版本号)