天天操夜夜爱_天天插天天操天天干_黄色av地址_成人黄色在线观看_国内久久久久久_欧美国产日韩一区二区三区_国产精品久久久久久久久晋中

顯卡驅動在哪里

發布時間: 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;}
???展開全文
主站蜘蛛池模板: 久久精品一区 | 国产精品人人爱一区二区白浆 | 欧美白人猛性xxxxx交69 | 欧美国产一区二区三区 | 欧美性猛交xxxx乱大交高清 | 国产亚洲欧美日韩在线一区 | 亚洲 中文 欧美 日韩 在线 | 日本一区二区三区免费看 | 久久综合一区二区 | 日本一区视频在线播放 | 亚洲欧美中文日韩在线v日本 | 欧美一区二区视频 | 亚洲日本va中文字幕区 | 久久伊人中文字幕 | 人人弄| 精品亚洲欧美高清不卡高清 | 日韩中文字幕精品久久 | 黄色链接入口 | 日本午夜在线视频 | 香蕉碰碰人人a久久动漫精品 | 欧美成成人免费 | 一色网| 欧美精品视 | 狠狠色噜噜狠狠狠狠米奇777 | 新97人人模人人爽人人喊 | 国产精品一区二区在线观看 | 欧美高跟鞋free交 | 精品玖玖 | 欧美精品久久久久久久影视 | 青青草免费在线观看视频 | 秋霞理伦韩国在线 | 久久精品成人欧美大片免费 | www视频免费 | 欧美亚洲一区二区三区 | 国产图色 | 真实一级一级一片免费视频 | 青草影院天堂男人久久 | 亚洲一区二区在线视频 | 欧美成人免费在线视频 | jiz中国zz | aaa免费看 |