6 #pragma data_seg (".d3d9_shared")
7 TraceDirect3DSwapChain9* gl_pmyIDirect3DSwapChain9;
8 TraceDirect3DDevice9* gl_pmyIDirect3DDevice9;
9 TraceDirect3D9* gl_pmyIDirect3D9;
10 HINSTANCE gl_hOriginalDll;
11 HINSTANCE gl_hThisInstance;
14 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
16 // to avoid compiler lvl4 warnings
17 LPVOID lpDummy = lpReserved;
20 switch (ul_reason_for_call)
22 case DLL_PROCESS_ATTACH: InitInstance(hModule); break;
23 case DLL_PROCESS_DETACH: ExitInstance(); break;
25 case DLL_THREAD_ATTACH: break;
26 case DLL_THREAD_DETACH: break;
31 // Exported function (faking d3d9.dll's one-and-only export)
32 IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion)
34 if (!gl_hOriginalDll) LoadOriginalDll(); // looking for the "right d3d9.dll"
36 // Hooking IDirect3D Object from Original Library
37 typedef IDirect3D9 *(WINAPI* D3D9_Type)(UINT SDKVersion);
38 D3D9_Type D3DCreate9_fn = (D3D9_Type) GetProcAddress( gl_hOriginalDll, "Direct3DCreate9");
43 OutputDebugString(_T("PROXYDLL: Pointer to original D3DCreate9 function not received ERROR ****\r\n"));
44 ::ExitProcess(0); // exit the hard way
47 // Request pointer from Original Dll.
48 IDirect3D9 *pIDirect3D9_orig = D3DCreate9_fn(SDKVersion);
50 // Create my IDirect3D8 object and store pointer to original object there.
51 // note: the object will delete itself once Ref count is zero (similar to COM objects)
52 gl_pmyIDirect3D9 = new TraceDirect3D9(pIDirect3D9_orig);
54 // Return pointer to hooking Object instead of "real one"
55 return (gl_pmyIDirect3D9);
58 void InitInstance(HANDLE hModule) {
59 OutputDebugString(_T("PROXYDLL: InitInstance called.\r\n"));
62 gl_hOriginalDll = NULL;
63 gl_hThisInstance = NULL;
64 gl_pmyIDirect3D9 = NULL;
65 gl_pmyIDirect3DDevice9 = NULL;
66 gl_pmyIDirect3DSwapChain9 = NULL;
68 // Storing Instance handle into global var
69 gl_hThisInstance = (HINSTANCE) hModule;
72 void LoadOriginalDll(void) {
73 TCHAR buffer[MAX_PATH];
75 // Getting path to system dir and to d3d8.dll
76 ::GetSystemDirectory(buffer, MAX_PATH);
79 _tcscat(buffer, _T("\\d3d9.dll"));
81 // try to load the system's d3d9.dll, if pointer empty
83 gl_hOriginalDll = ::LoadLibrary(buffer);
86 if (!gl_hOriginalDll) {
87 OutputDebugString(_T("PROXYDLL: Original d3d9.dll not loaded ERROR ****\r\n"));
88 ::ExitProcess(0); // exit the hard way
93 OutputDebugString(_T("PROXYDLL: ExitInstance called.\r\n"));
95 // Release the system's d3d9.dll
96 if (gl_hOriginalDll) {
97 ::FreeLibrary(gl_hOriginalDll);
98 gl_hOriginalDll = NULL;