亚洲一级簧片_性 毛片_国产乱子视频_久久影城_强伦女教师视频_成人精品久久

顯卡驅動在哪里

發布時間: 2023-07-18 16:55 閱讀: 文章來源:轉載

上篇講到英偉達在github上提供其顯卡DLSS功能的SDK,因分析問題,就對其提供的庫大概看了下,發現它內置了兩種查詢顯卡驅動存儲路徑的方法,第一種是在Windows 10 1803以上使用gdi32.dll中提供的函數來查詢,第二種是在Windows 10 1607到vista之間用常見的setupAPI來查詢,由此可見有些知識需要更新了,用這么多年setupAPI,也許在未來真的不管用了呢。

我們來看下gdi32.dll方式,它主要是使用gdi32.dll中的導出函數D3DKMTEnumAdapters2和D3DKMTQueryAdapterInfo實現的,它需要d3dkmthk.h頭文件(19041 SDK),如果沒有可能就要自行聲明許多用的到結構了:

std::wstring GetDriverStorePathFromQAI(int device_id){	std::wstring driver_store_path;	HMODULE gdi_h = NULL;	PFN_D3DKMTENUMADAPTERS2 pfnD3DKMTEnumAdapters2;	PFN_D3DKMTQUERYADAPTERINFO pfnD3DKMTQueryAdapterInfo;	gdi_h = LoadLibrary(_T("gdi32.dll"));	if (gdi_h) {		pfnD3DKMTEnumAdapters2 = (PFN_D3DKMTENUMADAPTERS2)GetProcAddress(gdi_h, "D3DKMTEnumAdapters2");		pfnD3DKMTQueryAdapterInfo = (PFN_D3DKMTQUERYADAPTERINFO)GetProcAddress(gdi_h, "D3DKMTQueryAdapterInfo");		if (!pfnD3DKMTEnumAdapters2 || !pfnD3DKMTQueryAdapterInfo)			return driver_store_path;		D3DKMT_ENUMADAPTERS2 enum_adapters = { 0 };		enum_adapters.NumAdapters = 0;		enum_adapters.pAdapters = NULL;		if (pfnD3DKMTEnumAdapters2(&enum_adapters) != 0)			return driver_store_path;		enum_adapters.pAdapters = new D3DKMT_ADAPTERINFO[enum_adapters.NumAdapters];		if (!enum_adapters.pAdapters)			return driver_store_path;		memset(enum_adapters.pAdapters, 0, sizeof(D3DKMT_ADAPTERINFO) * enum_adapters.NumAdapters);		if (pfnD3DKMTEnumAdapters2(&enum_adapters) == 0) {			for (ULONG i = 0; i < enum_adapters.NumAdapters; i++) {				D3DKMT_ADAPTERINFO* adapter_info_ptr = (D3DKMT_ADAPTERINFO*)&enum_adapters.pAdapters[i];				D3DKMT_QUERYADAPTERINFO	query_info = { 0 };				char					private_data[28] = { 0 };				query_info.hAdapter = adapter_info_ptr->hAdapter;				query_info.Type = KMTQAITYPE_PHYSICALADAPTERDEVICEIDS;				query_info.PrivateDriverDataSize = 28;				query_info.pPrivateDriverData = private_data;				if (pfnD3DKMTQueryAdapterInfo(&query_info) == 0) {					//nvidia = 0x10de, amd = 0x1002					if (*((DWORD*)private_data + 1) == device_id) {						D3DDDI_QUERYREGISTRY_INFO* reg_info_ptr;						//the size 0x432 is from nvidia's dll						reg_info_ptr = (D3DDDI_QUERYREGISTRY_INFO*)new char[0x432];						memset(reg_info_ptr, 0, 0x432);						reg_info_ptr->QueryType = D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH;						query_info.hAdapter = adapter_info_ptr->hAdapter;						query_info.Type = KMTQAITYPE_QUERYREGISTRY;						query_info.pPrivateDriverData = reg_info_ptr;						query_info.PrivateDriverDataSize = 0x432;						NTSTATUS status = pfnD3DKMTQueryAdapterInfo(&query_info);						if (status == 0) {							driver_store_path = ReplaceSystemroot(reg_info_ptr->OutputString);							delete[]reg_info_ptr;							break;						}						delete[]reg_info_ptr;					}				}			}		}		if (enum_adapters.pAdapters)			delete[]enum_adapters.pAdapters;	}	return driver_store_path;}

再有就是setupAPI的方式,這個大家應該相當熟悉了:

std::wstring GetDriverStorePath(const std::wstring& device_id){	std::wstring infPath;	HDEVINFO deviceInfoSet = SetupDiGetClassDevs(&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT);	if (deviceInfoSet == INVALID_HANDLE_VALUE)		return infPath;	SP_DEVINFO_DATA deviceInfoData;	deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);	for (DWORD index = 0; SetupDiEnumDeviceInfo(deviceInfoSet, index, &deviceInfoData); ++index)	{		DWORD propertyType;		WCHAR buffer[1024];		deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);		if (SetupDiGetDeviceRegistryProperty(deviceInfoSet, &deviceInfoData, SPDRP_HARDWAREID, &propertyType,			reinterpret_cast(buffer), sizeof(buffer), NULL))		{			if (wcsstr(buffer, device_id.c_str()) != NULL) // NVIDIA vendor ID			{				DWORD req_size = 0;				if (SetupDiGetDeviceProperty(deviceInfoSet, &deviceInfoData, &DEVPKEY_Device_DriverInfPath, &propertyType,					reinterpret_cast(buffer), sizeof(buffer), &req_size, 0))				{					infPath = buffer;										if (SetupGetInfDriverStoreLocation(infPath.c_str(), NULL, NULL, buffer, sizeof(buffer), &req_size)) {						PathRemoveFileSpecW(buffer);						infPath = buffer;					}					else {						infPath.clear();					}				}			}		}	}	SetupDiDestroyDeviceInfoList(deviceInfoSet);	return infPath;}
???展開全文
主站蜘蛛池模板: 国产成人精品免高潮在线观看 | a亚洲天堂| www中文字幕 | 国产精品网址 | 一区二区三区av | 日本精品一区 | 激情国产| 一区二区网站 | 91成人精品 | 精品一区二区三区免费视频 | 天堂av一区二区三区在线播放 | 国产精品日韩在线观看 | 久久综合色婷婷 | 欧美性猛交xxxx黑人交 | 91亚洲国产成人久久精品网站 | 亚洲国产精品一区 | 国产经典一区二区三区 | 成人精品电影 | 黄色成人在线看 | 中文日产幕无线码一区二区 | 午夜国产 | 曰韩在线 | 亚洲美女一区 | 国产999精品久久久 99re这里只有精品在线 | 午夜精品久久久久 | 少妇又紧又色又爽又刺激视频 | 亚洲成色999久久网站 | 欧美日韩亚洲一区二区 | 狠狠操操| 三级av网站 | 91精品国产日韩91久久久久久 | 欧美 日韩 国产 成人 在线 | 久久综合一区 | 91精品国产91久久综合桃花 | 国产综合久久久久 | 精品96久久久久久中文字幕无 | 99seav| 蜜桃精品久久久久久久免费影院 | 中文字幕一区二区三区精彩视频 | 日韩在线精品 | 五月婷婷综合网 |