如何在安装驱动程序之前在 C++ 中获取 GPU 信息

Posted

技术标签:

【中文标题】如何在安装驱动程序之前在 C++ 中获取 GPU 信息【英文标题】:How to get GPU information in C++ before the drivers are installed 【发布时间】:2012-05-09 12:48:42 【问题描述】:

我们有一款软件可以在多种不同的显卡上运行,包括 ATI 和 NVIDIA。在安装驱动程序之前,我需要能够确定显卡的设备 ID 或型号名称,以便我可以创建一个可以使用我们支持的任何显卡启动的硬盘驱动器映像,拥有它首次启动时检测显卡,安装驱动程序然后重新启动。目标平台是 WinXP。

我尝试使用 WMI,但它只能检索有关显示适配器的信息,其中不包括设备 ID,并且在安装驱动程序之前,显示适配器将只有通用数据,如“视频控制器 (VGA)”名字等等。

在安装驱动程序之前,EnumDisplayDevices 无法检测到该设备。

这一定是可能的,因为当新硬件向导打开时它知道显卡的名称,但我就是找不到方法。

有什么想法吗?

编辑 - 这是查询

ExecQuery(bstr_t("WQL"),bstr_t("SELECT * FROM Win32_PnPEntity WHERE DeviceID LIKE 'PCI\\VEN'"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);

【问题讨论】:

您在 WMI 中查询什么 - 您是否从通用 PNP 设备列表中获得更多信息?例如在 PowerShell 中Get-WmiObject Win32_PNPEntity |Where$_.DeviceID.StartsWith("PCI\VEN_10DE") -or $_.DeviceID.StartsWith("PCI\VEN_1002") 我试过:ExecQuery(bstr_t("WQL"),bstr_t("SELECT * FROM Win32_PnPEntity WHERE DeviceID LIKE 'PCI\\VEN'"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);但这没有返回任何结果(即查询返回 0 后对 Next() 的调用)所以我认为这仅在安装驱动程序后才有效。 但这应该会为其他 PCI 设备返回大量结果。有一些注释on this list of WMI examples on MSDN 说您应该能够检测到缺少驱动程序的 PCI 设备(如果不是 USB 设备) 好的,但我的意思是,如果您在干净的 XP 安装中进入设备管理器,您将已经设置了许多 PCI 设备,例如所有从 CD 上的捆绑包中安装了驱动程序的 USB 主机。因此,如果您的查询没有返回任何内容,我猜这是错误的。抱歉,我已经很多年没有做过 WQL,所以我不能告诉你是什么。 既然你已经解决了这个问题,我就不麻烦发布解决方案了;然而这只是一个仅供参考,这可以通过 EnumDeviceDrivers 和 SetupAPI 在没有 WMI 的情况下完成。 【参考方案1】:

为了其他用户的未来参考,我将添加我自己的答案。

与我在帖子中所说的相反,WMI 实际上可以检测到已卸载的设备,通过查询 Win32_PNPEntity 您可以获得他们的设备 ID。

【讨论】:

以上是关于如何在安装驱动程序之前在 C++ 中获取 GPU 信息的主要内容,如果未能解决你的问题,请参考以下文章

如何确保 DirectX 11 应用程序在带有 C++ 的双 GPU 笔记本电脑上使用独立 GPU?

如何在 C++ 中急切提交分配的内存?

C++ AMP 如何在 GPU 内存中返回值?

CUDA编程 C++指引

如何在 regedit 中知道有关 DirectX 的 GPU 值?

从 GPU 获取 OpenCL 程序代码