c - D3DKMTOpenAdapterFromDeviceName 和 DeviceName

标签 c winapi device guid gdi

我正在寻找与显示驱动程序通信的方式,并找到了这个函数,它在 msdn 中的文档有点少。我需要使用它,因为它会返回句柄,稍后我可以用它来显示我的应用程序中的 gpu 负载。但是有一个问题,我所做的是查看我的设备管理器,并在我的 gpu 属性中复制“设备实例的路径”的值。看起来像这样:

PCI\VEN_1002&DEV_6798&SUBSYS_04481043&REV_00\4&72ACCB3&0&0008

这是我发现的 D3DKMTOpenAdapterFromDeviceName 示例:

 D3DKMT_OPENADAPTERFROMDEVICENAME name = { _T("\\\\?\\pci#ven_10de&dev_0a2b&subsys_9072104d&rev_a2#4&12796cb&0&0008#{1ca05180-a699-450a-9a0c-de4fbe3ddd89}") };
   HMODULE hGdi32 = LoadLibrary(_T("gdi32.dll"));
   PD3DKMTOpenAdapterFromDeviceName D3DKMTOpenAdapterFromDeviceName = (PD3DKMTOpenAdapterFromDeviceName)GetProcAddress(hGdi32, "D3DKMTOpenAdapterFromDeviceName");
   NTSTATUS status = D3DKMTOpenAdapterFromDeviceName(&name);

在此示例中,他们在设备 #{1ca05180-a699-450a-9a0c-de4fbe3ddd89} 末尾有一些 GUID。那么我应该使用我的 GPU 的设备管理器属性中的哪个 GUID?我尝试在设备管理器中使用我的视频卡属性中的一半 GUID,但总是得到 - "STATUS_INVALID_PARAMETER"

最佳答案

{1ca05180-a699-450a-9a0c-de4fbe3ddd89}GUID_DISPLAY_DEVICE_ARRIVAL 的标识符

所以你可以这样写你的名字:

"\\\\?\\"+ deviceName + "#{1ca05180-a699-450a-9a0c-de4fbe3ddd89}"

用“\”代替#;以你为例:

"\\\\?\\" + "PCI#VEN_1002&DEV_6798&SUBSYS_04481043&REV_00#4&72ACCB3&0&0008"+"#{1ca05180-a699-450a-9a0c-de4fbe3ddd89}"

然后要以编程方式找到它,您可以像这样进行 COM 搜索:

hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t("SELECT * FROM Win32_VideoController"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);

并获取 PNPDeviceID,这是您在设备管理器中找到的字符串;请考虑确保它是您当前使用的图形卡,因为可能有多个图形卡。

关于c - D3DKMTOpenAdapterFromDeviceName 和 DeviceName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27046223/

相关文章:

C:为什么 print 语句改变了我的结构成员的值?

c - 如何在 C 中定义/使用 2 维字符串数组(3 维字符?)?

c++ - 嵌套对话过程

c++ - 差异 : Environment Variables & Registry Keys

linux - 构建内置内核模块的步骤?

c - 直接在终端上读取

c - C 中的多重条件检查

c++ - SetWindowsHookEx 没有调用我的回调?

linux - 字符设备权限问题

android - 应用程序未在 Android 设备上运行