source: trunk/Utilities/Miscellaneous/CoCreateInstance02/CoCreateInstance02.cpp @ 939

Last change on this file since 939 was 810, checked in by roman, 6 years ago

Added minhook

  • Property svn:mime-type set to application/octet-stream
File size: 13.7 KB
Line 
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
22typedef 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
42D3D11CREATEDEVICE g_pD3D11CreateDevice = NULL;
43
44#endif // defined(MINHOOK)
45
46HRESULT 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
73int 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
Note: See TracBrowser for help on using the repository browser.