169 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| This file is part of Telegram Desktop,
 | |
| the official desktop application for the Telegram messaging service.
 | |
| 
 | |
| For license and copyright information please follow this link:
 | |
| https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | |
| */
 | |
| #include "platform/win/windows_dlls.h"
 | |
| 
 | |
| #include "base/platform/win/base_windows_safe_library.h"
 | |
| 
 | |
| #include <VersionHelpers.h>
 | |
| #include <QtCore/QSysInfo>
 | |
| 
 | |
| #include <d3d11.h>
 | |
| 
 | |
| #define LOAD_SYMBOL(lib, name) ::base::Platform::LoadMethod(lib, #name, name)
 | |
| 
 | |
| namespace Platform {
 | |
| namespace Dlls {
 | |
| 
 | |
| using base::Platform::SafeLoadLibrary;
 | |
| using base::Platform::LoadMethod;
 | |
| 
 | |
| void init() {
 | |
| 	static bool inited = false;
 | |
| 	if (inited) return;
 | |
| 	inited = true;
 | |
| 
 | |
| 	// Remove the current directory from the DLL search order.
 | |
| 	::SetDllDirectory(L"");
 | |
| 
 | |
| 	const auto list = {
 | |
| 		u"dbghelp.dll"_q,
 | |
| 		u"dbgcore.dll"_q,
 | |
| 		u"propsys.dll"_q,
 | |
| 		u"winsta.dll"_q,
 | |
| 		u"textinputframework.dll"_q,
 | |
| 		u"uxtheme.dll"_q,
 | |
| 		u"igdumdim32.dll"_q,
 | |
| 		u"amdhdl32.dll"_q,
 | |
| 		u"wtsapi32.dll"_q,
 | |
| 		u"propsys.dll"_q,
 | |
| 		u"combase.dll"_q,
 | |
| 		u"dwmapi.dll"_q,
 | |
| 		u"rstrtmgr.dll"_q,
 | |
| 		u"psapi.dll"_q,
 | |
| 		u"user32.dll"_q,
 | |
| 		u"d3d11.dll"_q,
 | |
| 		u"dxgi.dll"_q,
 | |
| 	};
 | |
| 	for (const auto &lib : list) {
 | |
| 		SafeLoadLibrary(lib);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // D3D11.DLL
 | |
| 
 | |
| HRESULT (__stdcall *D3D11CreateDevice)(
 | |
| 	_In_opt_ IDXGIAdapter* pAdapter,
 | |
| 	D3D_DRIVER_TYPE DriverType,
 | |
| 	HMODULE Software,
 | |
| 	UINT Flags,
 | |
| 	_In_reads_opt_(FeatureLevels) CONST D3D_FEATURE_LEVEL* pFeatureLevels,
 | |
| 	UINT FeatureLevels,
 | |
| 	UINT SDKVersion,
 | |
| 	_COM_Outptr_opt_ ID3D11Device** ppDevice,
 | |
| 	_Out_opt_ D3D_FEATURE_LEVEL* pFeatureLevel,
 | |
| 	_COM_Outptr_opt_ ID3D11DeviceContext** ppImmediateContext);
 | |
| 
 | |
| // DXGI.DLL
 | |
| 
 | |
| HRESULT (__stdcall *CreateDXGIFactory1)(
 | |
| 	REFIID riid,
 | |
| 	_COM_Outptr_ void **ppFactory);
 | |
| 
 | |
| void start() {
 | |
| 	init();
 | |
| 
 | |
| 	const auto LibShell32 = SafeLoadLibrary(u"shell32.dll"_q);
 | |
| 	LOAD_SYMBOL(LibShell32, SHAssocEnumHandlers);
 | |
| 	LOAD_SYMBOL(LibShell32, SHCreateItemFromParsingName);
 | |
| 	LOAD_SYMBOL(LibShell32, SHOpenWithDialog);
 | |
| 	LOAD_SYMBOL(LibShell32, OpenAs_RunDLL);
 | |
| 	LOAD_SYMBOL(LibShell32, SHQueryUserNotificationState);
 | |
| 	LOAD_SYMBOL(LibShell32, SHChangeNotify);
 | |
| 	LOAD_SYMBOL(LibShell32, SetCurrentProcessExplicitAppUserModelID);
 | |
| 
 | |
| 	const auto LibUxTheme = SafeLoadLibrary(u"uxtheme.dll"_q);
 | |
| 	LOAD_SYMBOL(LibUxTheme, SetWindowTheme);
 | |
| 	//if (IsWindows10OrGreater()) {
 | |
| 	//	static const auto kSystemVersion = QOperatingSystemVersion::current();
 | |
| 	//	static const auto kMinor = kSystemVersion.minorVersion();
 | |
| 	//	static const auto kBuild = kSystemVersion.microVersion();
 | |
| 	//	if (kMinor > 0 || (kMinor == 0 && kBuild >= 17763)) {
 | |
| 	//		if (kBuild < 18362) {
 | |
| 	//			LOAD_SYMBOL(LibUxTheme, AllowDarkModeForApp, 135);
 | |
| 	//		} else {
 | |
| 	//			LOAD_SYMBOL(LibUxTheme, SetPreferredAppMode, 135);
 | |
| 	//		}
 | |
| 	//		LOAD_SYMBOL(LibUxTheme, AllowDarkModeForWindow, 133);
 | |
| 	//		LOAD_SYMBOL(LibUxTheme, RefreshImmersiveColorPolicyState, 104);
 | |
| 	//		LOAD_SYMBOL(LibUxTheme, FlushMenuThemes, 136);
 | |
| 	//	}
 | |
| 	//}
 | |
| 
 | |
| 	if (IsWindowsVistaOrGreater()) {
 | |
| 		const auto LibWtsApi32 = SafeLoadLibrary(u"wtsapi32.dll"_q);
 | |
| 		LOAD_SYMBOL(LibWtsApi32, WTSRegisterSessionNotification);
 | |
| 		LOAD_SYMBOL(LibWtsApi32, WTSUnRegisterSessionNotification);
 | |
| 
 | |
| 		const auto LibPropSys = SafeLoadLibrary(u"propsys.dll"_q);
 | |
| 		LOAD_SYMBOL(LibPropSys, PropVariantToString);
 | |
| 		LOAD_SYMBOL(LibPropSys, PSStringFromPropertyKey);
 | |
| 
 | |
| 		const auto LibDwmApi = SafeLoadLibrary(u"dwmapi.dll"_q);
 | |
| 		LOAD_SYMBOL(LibDwmApi, DwmIsCompositionEnabled);
 | |
| 		LOAD_SYMBOL(LibDwmApi, DwmSetWindowAttribute);
 | |
| 	}
 | |
| 
 | |
| 	const auto LibPsApi = SafeLoadLibrary(u"psapi.dll"_q);
 | |
| 	LOAD_SYMBOL(LibPsApi, GetProcessMemoryInfo);
 | |
| 
 | |
| 	const auto LibUser32 = SafeLoadLibrary(u"user32.dll"_q);
 | |
| 	LOAD_SYMBOL(LibUser32, SetWindowCompositionAttribute);
 | |
| 
 | |
| 	const auto LibD3D11 = SafeLoadLibrary(u"d3d11.dll"_q);
 | |
| 	LOAD_SYMBOL(LibD3D11, D3D11CreateDevice);
 | |
| 
 | |
| 	const auto LibDXGI = SafeLoadLibrary(u"dxgi.dll"_q);
 | |
| 	LOAD_SYMBOL(LibDXGI, CreateDXGIFactory1);
 | |
| }
 | |
| 
 | |
| } // namespace Dlls
 | |
| } // namespace Platform
 | |
| 
 | |
| HRESULT WINAPI D3D11CreateDevice(
 | |
| 		_In_opt_ IDXGIAdapter* pAdapter,
 | |
| 		D3D_DRIVER_TYPE DriverType,
 | |
| 		HMODULE Software,
 | |
| 		UINT Flags,
 | |
| 		_In_reads_opt_(FeatureLevels) CONST D3D_FEATURE_LEVEL* pFeatureLevels,
 | |
| 		UINT FeatureLevels,
 | |
| 		UINT SDKVersion,
 | |
| 		_COM_Outptr_opt_ ID3D11Device** ppDevice,
 | |
| 		_Out_opt_ D3D_FEATURE_LEVEL* pFeatureLevel,
 | |
| 		_COM_Outptr_opt_ ID3D11DeviceContext** ppImmediateContext) {
 | |
| 	return Platform::Dlls::D3D11CreateDevice
 | |
| 		? Platform::Dlls::D3D11CreateDevice(
 | |
| 			pAdapter,
 | |
| 			DriverType,
 | |
| 			Software,
 | |
| 			Flags,
 | |
| 			pFeatureLevels,
 | |
| 			FeatureLevels,
 | |
| 			SDKVersion,
 | |
| 			ppDevice,
 | |
| 			pFeatureLevel,
 | |
| 			ppImmediateContext)
 | |
| 		: S_FALSE;
 | |
| }
 | |
| 
 | |
| HRESULT WINAPI CreateDXGIFactory1(
 | |
| 		REFIID riid,
 | |
| 		_COM_Outptr_ void **ppFactory) {
 | |
| 	return Platform::Dlls::CreateDXGIFactory1
 | |
| 		? Platform::Dlls::CreateDXGIFactory1(riid, ppFactory)
 | |
| 		: S_FALSE;
 | |
| }
 | 
