D3DKMTOpenAdapterFromDeviceName和DeviceName

时间:2014-11-20 17:50:15

标签: 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?我试图在设备管理器中使用我的VideoCard属性中的一半GUID,并始终得到 - "STATUS_INVALID_PARAMETER"

1 个答案:

答案 0 :(得分:0)

{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,这是您在设备管理器中找到的字符串;考虑到确保它是您当前正在使用的图形卡,因为可能有多个图形卡。