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

顯卡驅(qū)動(dòng)在哪里

發(fā)布時(shí)間: 2023-07-18 16:55 閱讀: 文章來(lái)源:轉(zhuǎn)載

上篇講到英偉達(dá)在github上提供其顯卡DLSS功能的SDK,因分析問(wèn)題,就對(duì)其提供的庫(kù)大概看了下,發(fā)現(xiàn)它內(nèi)置了兩種查詢顯卡驅(qū)動(dòng)存儲(chǔ)路徑的方法,第一種是在Windows 10 1803以上使用gdi32.dll中提供的函數(shù)來(lái)查詢,第二種是在Windows 10 1607到vista之間用常見(jiàn)的setupAPI來(lái)查詢,由此可見(jiàn)有些知識(shí)需要更新了,用這么多年setupAPI,也許在未來(lái)真的不管用了呢。

我們來(lái)看下gdi32.dll方式,它主要是使用gdi32.dll中的導(dǎo)出函數(shù)D3DKMTEnumAdapters2和D3DKMTQueryAdapterInfo實(shí)現(xiàn)的,它需要d3dkmthk.h頭文件(19041 SDK),如果沒(méi)有可能就要自行聲明許多用的到結(jié)構(gòu)了:

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的方式,這個(gè)大家應(yīng)該相當(dāng)熟悉了:

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;}
???展開(kāi)全文
相關(guān)文章
主站蜘蛛池模板: 国产片一区二区 | 色一乱一伦一图一区二区精品 | 国产高清视频在线 | 欧美性大战久久久久久久蜜臀 | 91精品入口 | 亚洲综合国产 | 久久99精品久久久久久噜噜 | 久久色av| 精品国产91久久久久久 | 亚州国产精品 | 男女xx| 亚洲精品在线免费 | 成人天堂资源www在线 | 亚洲国产精品久久人人爱 | 三级av网址 | 国产成人99久久亚洲综合精品 | 久久人人爽人人爽人人片av不 | 久久综合久 | 热99视频| 黄色日韩| 91一区二区在线观看 | 午夜视频www | 精品天堂 | 人人澡人人添人人爽一区二区 | 色网站免费在线 | 一级毛片观看 | 9999精品 | 久久久久久久久久影视 | 999这里只有精品 | 国产二区在线播放 | 国产一区中文字幕 | 综合日韩欧美 | 色爱区综合| 久久69精品久久久久久久电影好 | 欧美一区二区三区四区在线观看 | 国产精品高清一区二区 | 精品国产一区二区三区日日嗨 | 免费色网站 | 日韩免费一区二区 | 国产在线精品一区 | 成人在线视频一区 |