1 | #include <winsdkver.h> |
---|
2 | #include <sdkddkver.h> |
---|
3 | #include <mfapi.h> |
---|
4 | #include <mftransform.h> |
---|
5 | #include <stdio.h> |
---|
6 | #include <tchar.h> |
---|
7 | #include <atlbase.h> |
---|
8 | #include <atlcom.h> |
---|
9 | |
---|
10 | #pragma comment(lib, "mfuuid.lib") |
---|
11 | #pragma comment(lib, "mfplat.lib") |
---|
12 | |
---|
13 | #include <dxgi1_3.h> |
---|
14 | #include <d3d11.h> |
---|
15 | |
---|
16 | #pragma comment(lib, "dxgi.lib") |
---|
17 | #pragma comment(lib, "d3d11.lib") |
---|
18 | |
---|
19 | //#define EASYHOOK |
---|
20 | #define MINHOOK |
---|
21 | |
---|
22 | typedef 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); |
---|
23 | |
---|
24 | #if defined(EASYHOOK) |
---|
25 | |
---|
26 | #include <easyhook.h> |
---|
27 | |
---|
28 | #if defined(_WIN64) |
---|
29 | #pragma comment(lib, "EasyHook64.lib") |
---|
30 | #else |
---|
31 | #pragma comment(lib, "EasyHook32.lib") |
---|
32 | #endif |
---|
33 | |
---|
34 | #endif // defined(EASYHOOK) |
---|
35 | |
---|
36 | #if defined(MINHOOK) |
---|
37 | |
---|
38 | #include <minhook.h> |
---|
39 | |
---|
40 | #pragma comment(lib, "libMinHook-x64-v141-mdd.lib") |
---|
41 | |
---|
42 | D3D11CREATEDEVICE g_pD3D11CreateDevice = NULL; |
---|
43 | |
---|
44 | #endif // defined(MINHOOK) |
---|
45 | |
---|
46 | HRESULT WINAPI Hook_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) |
---|
47 | { |
---|
48 | ATLTRACE(atlTraceGeneral, 4, _T("pAdapter 0x%p, DriverType %d, Software 0x%p, Flags 0x%X, pFeatureLevels 0x%p, FeatureLevels %d, SDKVersion 0x%04X, ppDevice 0x%p, pFeatureLevel 0x%p, ppImmediateContext 0x%p\n"), pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext); |
---|
49 | ATLASSERT(!pAdapter && DriverType == D3D_DRIVER_TYPE_HARDWARE); |
---|
50 | CComPtr<IDXGIFactory2> pDxgiFactory; |
---|
51 | ATLVERIFY(SUCCEEDED(CreateDXGIFactory2(0, __uuidof(IDXGIFactory2), (VOID**) &pDxgiFactory))); |
---|
52 | CComPtr<IDXGIAdapter> pDxgiAdapter; |
---|
53 | ATLVERIFY(SUCCEEDED(pDxgiFactory->EnumAdapters(1, &pDxgiAdapter))); |
---|
54 | DXGI_ADAPTER_DESC AdapterDescription; |
---|
55 | ATLVERIFY(SUCCEEDED(pDxgiAdapter->GetDesc(&AdapterDescription))); |
---|
56 | ATLTRACE(atlTraceGeneral, 4, _T("AdapterDescription.Description \"%ls\"\n"), AdapterDescription.Description); |
---|
57 | D3D11CREATEDEVICE pD3D11CreateDevice; |
---|
58 | #if defined(EASYHOOK) |
---|
59 | pD3D11CreateDevice = &D3D11CreateDevice; |
---|
60 | #endif // defined(EASYHOOK) |
---|
61 | #if defined(MINHOOK) |
---|
62 | pD3D11CreateDevice = g_pD3D11CreateDevice; |
---|
63 | #endif // defined(MINHOOK) |
---|
64 | ATLASSERT(pD3D11CreateDevice); |
---|
65 | const HRESULT nResult = pD3D11CreateDevice( |
---|
66 | //pAdapter, DriverType, |
---|
67 | pDxgiAdapter, D3D_DRIVER_TYPE_UNKNOWN, |
---|
68 | Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext); |
---|
69 | ATLTRACE(atlTraceGeneral, 4, _T("nResult 0x%08X\n"), nResult); |
---|
70 | return nResult; |
---|
71 | } |
---|
72 | |
---|
73 | int main() |
---|
74 | { |
---|
75 | #if defined(_DEBUG) |
---|
76 | CTrace::SetLevel(4); |
---|
77 | #endif // defined(_DEBUG) |
---|
78 | ATLVERIFY(SUCCEEDED(CoInitialize(NULL))); |
---|
79 | ATLVERIFY(SUCCEEDED(MFStartup(MF_VERSION))); |
---|
80 | { |
---|
81 | VOID* pD3D11CreateDevice = GetProcAddress(GetModuleHandle(_T("d3d11.dll")), "D3D11CreateDevice"); |
---|
82 | #if defined(EASYHOOK) |
---|
83 | // NOTE: EasyHook - Manually adding EasyHook to your C++ project https://easyhook.github.io/tutorials/nativemanuallyaddref.html |
---|
84 | HOOK_TRACE_INFO hHook = { }; |
---|
85 | ATLVERIFY(SUCCEEDED(LhInstallHook(pD3D11CreateDevice, &Hook_D3D11CreateDevice, NULL, &hHook))); |
---|
86 | ULONG pAclEntries[] = { 0 }; |
---|
87 | ATLVERIFY(SUCCEEDED(LhSetInclusiveACL(pAclEntries, _countof(pAclEntries), &hHook))); |
---|
88 | #endif // defined(EASYHOOK) |
---|
89 | #if defined(MINHOOK) |
---|
90 | // NOTE: https://www.codeproject.com/Articles/44326/MinHook-The-Minimalistic-x-x-API-Hooking-Libra |
---|
91 | ATLVERIFY(MH_Initialize() == MH_OK); |
---|
92 | ATLASSERT(!g_pD3D11CreateDevice); |
---|
93 | ATLVERIFY(MH_CreateHook(pD3D11CreateDevice, &Hook_D3D11CreateDevice, reinterpret_cast<LPVOID*>(&g_pD3D11CreateDevice)) == MH_OK); |
---|
94 | ATLVERIFY(MH_EnableHook(pD3D11CreateDevice) == MH_OK); |
---|
95 | #endif // defined(MINHOOK) |
---|
96 | |
---|
97 | if(FALSE) |
---|
98 | { |
---|
99 | D3D_FEATURE_LEVEL pFeatureLevels[] = { D3D_FEATURE_LEVEL_10_0 }; |
---|
100 | CComPtr<ID3D11Device> pDevice; |
---|
101 | D3D_FEATURE_LEVEL FeatureLevel; |
---|
102 | CComPtr<ID3D11DeviceContext> pDeviceContext; |
---|
103 | const HRESULT nResult = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_UNKNOWN, NULL, 0, pFeatureLevels, _countof(pFeatureLevels), D3D11_SDK_VERSION, &pDevice, &FeatureLevel, &pDeviceContext); |
---|
104 | } |
---|
105 | |
---|
106 | class __declspec(uuid("{60F44560-5A20-4857-BFEF-D29773CB8040}")) CFoo; // NVIDIA H.264 Encoder MFT |
---|
107 | CComPtr<IMFTransform> pTransform; |
---|
108 | const HRESULT nCoCreateInstanceResult = pTransform.CoCreateInstance(__uuidof(CFoo)); |
---|
109 | _tprintf(_T("nCoCreateInstanceResult 0x%08X\n"), nCoCreateInstanceResult); |
---|
110 | |
---|
111 | if(FAILED(nCoCreateInstanceResult)) |
---|
112 | { |
---|
113 | const HMODULE hModule = LoadLibrary(_T("nvEncMFTH264.dll")); |
---|
114 | _tprintf(_T("hModule 0x%p\n"), hModule); |
---|
115 | typedef HRESULT (STDMETHODCALLTYPE *DLLGETCLASSOBJECT)(__in REFCLSID ClassIdentifier, __in REFIID InterfaceIdentifier, __out VOID** ppvObject); |
---|
116 | const DLLGETCLASSOBJECT pDllGetClassObject = (DLLGETCLASSOBJECT) GetProcAddress(hModule, "DllGetClassObject"); |
---|
117 | CComPtr<IClassFactory> pClassFactory; |
---|
118 | const HRESULT nDllGetClassObjectResult = (pDllGetClassObject)(__uuidof(CFoo), __uuidof(IClassFactory), (VOID**) &pClassFactory); |
---|
119 | _tprintf(_T("nDllGetClassObjectResult 0x%08X\n"), nDllGetClassObjectResult); |
---|
120 | ATLASSERT(pClassFactory); |
---|
121 | const HRESULT nCreateInstanceResult = pClassFactory->CreateInstance(NULL, __uuidof(IMFTransform), (VOID**) &pTransform.p); |
---|
122 | _tprintf(_T("nCreateInstanceResult 0x%08X\n"), nCreateInstanceResult); |
---|
123 | pTransform.Release(); |
---|
124 | FreeLibrary(hModule); |
---|
125 | } |
---|
126 | |
---|
127 | if(pTransform) |
---|
128 | { |
---|
129 | CComPtr<IMFAttributes> pAttributes; |
---|
130 | ATLVERIFY(SUCCEEDED(pTransform->GetAttributes(&pAttributes))); |
---|
131 | UINT32 nCount; |
---|
132 | ATLVERIFY(SUCCEEDED(pAttributes->GetCount(&nCount))); |
---|
133 | for(UINT32 nIndex = 0; nIndex < nCount; nIndex++) |
---|
134 | { |
---|
135 | GUID Key; |
---|
136 | PROPVARIANT vValue; |
---|
137 | PropVariantInit(&vValue); |
---|
138 | ATLVERIFY(SUCCEEDED(pAttributes->GetItemByIndex(nIndex, &Key, &vValue))); |
---|
139 | WCHAR pszKey[64] = { 0 }; |
---|
140 | ATLVERIFY(StringFromGUID2(Key, pszKey, _countof(pszKey))); |
---|
141 | _tprintf(_T("pszKey %ls, vValue 0x%X %ls\n"), pszKey, vValue.vt, (vValue.vt == VT_LPWSTR) ? vValue.pwszVal : L""); |
---|
142 | ATLVERIFY(SUCCEEDED(PropVariantClear(&vValue))); |
---|
143 | } |
---|
144 | } |
---|
145 | |
---|
146 | #if defined(EASYHOOK) |
---|
147 | ATLVERIFY(SUCCEEDED(LhUninstallHook(&hHook))); |
---|
148 | ATLVERIFY(SUCCEEDED(LhWaitForPendingRemovals())); |
---|
149 | #endif // defined(EASYHOOK) |
---|
150 | #if defined(MINHOOK) |
---|
151 | ATLASSERT(g_pD3D11CreateDevice); |
---|
152 | ATLVERIFY(MH_DisableHook(pD3D11CreateDevice) == MH_OK); |
---|
153 | g_pD3D11CreateDevice = NULL; |
---|
154 | ATLVERIFY(MH_Uninitialize() == MH_OK); |
---|
155 | #endif // defined(MINHOOK) |
---|
156 | } |
---|
157 | ATLVERIFY(SUCCEEDED(MFShutdown())); |
---|
158 | CoUninitialize(); |
---|
159 | return 0; |
---|
160 | } |
---|
161 | |
---|