From d99107a919c97ffa237f633b5c29daf6f43ade26 Mon Sep 17 00:00:00 2001 From: "code@koerner-de.net" Date: Wed, 4 Apr 2012 19:10:38 +0000 Subject: [PATCH] preliminary result --- .gitattributes | 3 + uMod_DX10/uMod_DX10_dll.cpp | 405 +++++++++++++++++++ uMod_DX10/uMod_DX10_dll.h | 57 +++ uMod_DX9/uMod_DX9_dll.cpp | 51 +-- uMod_DXMain/makefile.gcc | 23 +- uMod_DXMain/uMod_DX10_dll_HOOK_INJECTION.def | 6 + uMod_DXMain/uMod_DXMain_dll.cpp | 102 ++++- uMod_DXMain/uMod_DXMain_dll.h | 6 +- uMod_DXMain/uMod_Main.h | 8 +- uMod_GUI/uMod_GUI.cpp | 6 +- uMod_GUI/uMod_Main.h | 37 +- 11 files changed, 622 insertions(+), 82 deletions(-) create mode 100644 uMod_DX10/uMod_DX10_dll.cpp create mode 100644 uMod_DX10/uMod_DX10_dll.h create mode 100644 uMod_DXMain/uMod_DX10_dll_HOOK_INJECTION.def diff --git a/.gitattributes b/.gitattributes index e391785..0192a8d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,6 +3,8 @@ /.project -text .settings/org.eclipse.cdt.codan.core.prefs -text /README.txt -text +uMod_DX10/uMod_DX10_dll.cpp -text +uMod_DX10/uMod_DX10_dll.h -text uMod_DX9/uMod_DX9_dll.cpp -text uMod_DX9/uMod_DX9_dll.h -text uMod_DX9/uMod_IDirect3D9.cpp -text @@ -25,6 +27,7 @@ uMod_DXMain/makefile.gcc -text uMod_DXMain/makefile.vc -text uMod_DXMain/uMod_ArrayHandler.cpp -text uMod_DXMain/uMod_ArrayHandler.h -text +uMod_DXMain/uMod_DX10_dll_HOOK_INJECTION.def -text uMod_DXMain/uMod_DX9_dll_DIRECT_INJECTION.def -text uMod_DXMain/uMod_DX9_dll_HOOK_INJECTION.def -text uMod_DXMain/uMod_DX9_dll_NO_INJECTION.def -text diff --git a/uMod_DX10/uMod_DX10_dll.cpp b/uMod_DX10/uMod_DX10_dll.cpp new file mode 100644 index 0000000..15539b8 --- /dev/null +++ b/uMod_DX10/uMod_DX10_dll.cpp @@ -0,0 +1,405 @@ +/* +This file is part of Universal Modding Engine. + + +Universal Modding Engine is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Universal Modding Engine is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Universal Modding Engine. If not, see . +*/ + +/* + + + NEVER USE THIS CODE FOR ILLEGAL PURPOSE + + +*/ + +#define number_of_byte 5 + +#include "uMod_DX10_dll.h" + +//#include "disasm-lib/cpu.c" +//#include "disasm-lib/disasm.c" +//#include "disasm-lib/disasm_x86.c" + +//#include "disasm-lib/misc.c" +//#include "mhook-lib/mhook.cpp" +//#include "mhook-lib/mhook.h" + +//#include "uMod_ID3D10Device.h" +//#include "uMod_ID3D10Device1.h" +//#include "uMod_IDXGISwapChain.h" + +//#include "detours.h" +//#include "detourxs/detourxs/detourxs.h" + +/* +#include "detourxs/detourxs/ADE32.cpp" +#include "detourxs/detourxs/detourxs.cpp" +*/ +/* + * global variable which are not linked external + */ +HINSTANCE gl_hOriginal_DX10_Dll = NULL; +HINSTANCE gl_hOriginal_DX101_Dll = NULL; + +typedef HRESULT (APIENTRY *D3D10CreateDeviceAndSwapChain_type)( IDXGIAdapter*, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC*, IDXGISwapChain**, ID3D10Device**); +typedef HRESULT (APIENTRY *D3D10CreateDeviceAndSwapChain1_type)( IDXGIAdapter*, D3D10_DRIVER_TYPE, HMODULE, UINT, D3D10_FEATURE_LEVEL1, UINT, DXGI_SWAP_CHAIN_DESC*, IDXGISwapChain**, ID3D10Device1**); + +#ifndef NO_INJECTION +D3D10CreateDeviceAndSwapChain_type D3D10CreateDeviceAndSwapChain_fn = NULL; +D3D10CreateDeviceAndSwapChain1_type D3D10CreateDeviceAndSwapChain1_fn = NULL; +#endif + + + + +/* + * global variable which are linked external + */ + +void InitDX10(void) +{ + LoadOriginal_DX10_Dll(); +/* + HRESULT ret = E_OUTOFMEMORY; + //IDXGIAdapter Adap;# + + D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type) GetProcAddress( gl_hOriginal_DX10_Dll, "D3D10CreateDeviceAndSwapChain"); + + IDXGISwapChain *pIDXGISwapChain_orig = NULL; + ID3D10Device *pID3D10Device_orig = NULL; + if (D3D10CreateDeviceAndSwapChain_fn!=NULL) + { + Message("PRE: create original device\n"); + ret = D3D10CreateDeviceAndSwapChain_fn( NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, D3D10_CREATE_DEVICE_SINGLETHREADED, + D3D10_SDK_VERSION, NULL, &pIDXGISwapChain_orig, &pID3D10Device_orig); + if (ret == S_OK ) + { + Message("PRE: created\n"); + pIDXGISwapChain_orig->Release(); + pID3D10Device_orig->Release(); + Message("PRE: released\n"); + } + else + { + Message("PRE: failed\n"); + } + } + else + { + Message("PRE: no function\n"); + } +*/ + + +#ifndef NO_INJECTION + // we detour the original D3D10CreateDeviceAndSwapChain to our uMod_D3D10CreateDeviceAndSwapChain + if (gl_hOriginal_DX10_Dll!=NULL) + { + D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type) GetProcAddress(gl_hOriginal_DX10_Dll, "D3D10CreateDeviceAndSwapChain"); + if (D3D10CreateDeviceAndSwapChain_fn!=NULL) + { + Message("Detour: D3D10CreateDeviceAndSwapChain\n"); + //D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type)DetourFunc( (BYTE*)D3D10CreateDeviceAndSwapChain_fn, (BYTE*)uMod_D3D10CreateDeviceAndSwapChain, number_of_byte); + + + //Mhook_SetHook((PVOID*)&D3D10CreateDeviceAndSwapChain_fn, uMod_D3D10CreateDeviceAndSwapChain); + D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type) DetourFunction( (BYTE*)D3D10CreateDeviceAndSwapChain_fn, (BYTE*)uMod_D3D10CreateDeviceAndSwapChain); + + //DetourTransactionBegin(); + //Messagebox_orig = (Messagebox_typ)DetourAttach(&(PVOID&)MessageBoxA, (PVOID)MyMessageBox); + //D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type) DetourAttach( (BYTE*)D3D10CreateDeviceAndSwapChain_fn, (BYTE*)uMod_D3D10CreateDeviceAndSwapChain); + //DetourTransactionCommit(); + } + } + if (gl_hOriginal_DX101_Dll!=NULL) + { + //D3D10CreateDeviceAndSwapChain1_fn = (D3D10CreateDeviceAndSwapChain1_type) GetProcAddress(gl_hOriginal_DX101_Dll, "D3D10CreateDeviceAndSwapChain1"); + if (D3D10CreateDeviceAndSwapChain1_fn!=NULL) + { + Message("Detour: D3D10CreateDeviceAndSwapChain1\n"); + D3D10CreateDeviceAndSwapChain1_fn = (D3D10CreateDeviceAndSwapChain1_type)DetourFunc( (BYTE*)D3D10CreateDeviceAndSwapChain1_fn, (BYTE*)uMod_D3D10CreateDeviceAndSwapChain1, 5); + } + } +#endif +} + +void ExitDX10(void) +{ + // Release the system's d3d9.dll + if (gl_hOriginal_DX10_Dll!=NULL) + { + FreeLibrary(gl_hOriginal_DX10_Dll); + gl_hOriginal_DX10_Dll = NULL; + } + + if (gl_hOriginal_DX101_Dll!=NULL) + { + FreeLibrary(gl_hOriginal_DX101_Dll); + gl_hOriginal_DX101_Dll = NULL; + } +} +void LoadOriginal_DX10_Dll(void) +{ + char buffer[MAX_PATH]; + + if (gl_hOriginal_DX10_Dll==NULL) + { + GetSystemDirectory(buffer,MAX_PATH); //get the system directory, we need to open the original d3d10.dll + + // Append dll name + strcat_s( buffer, MAX_PATH,"\\d3d10.dll"); + + // try to load the system's d3d10.dll + gl_hOriginal_DX10_Dll = LoadLibrary(buffer); + } + + if (gl_hOriginal_DX101_Dll==NULL) + { + GetSystemDirectory(buffer,MAX_PATH); + strcat_s( buffer, MAX_PATH,"\\d3d10_1.dll"); + gl_hOriginal_DX101_Dll = LoadLibrary(buffer); + } + +} + + +#ifdef NO_INJECTION +/* + * We do not inject, the game loads this dll by itself thus we must include the Direct3DCreate9 function + */ +/* +IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) +{ + Message("WINAPI Direct3DCreate9\n"); + + if (!gl_hOriginal_DX9_Dll) LoadOriginal_DX9_Dll(); // looking for the "right d3d9.dll" + + // find original function in original d3d9.dll + Direct3DCreate9_type D3DCreate9_fn = (Direct3DCreate9_type) GetProcAddress( gl_hOriginal_DX9_Dll, "Direct3DCreate9"); + + + if (!D3DCreate9_fn) + { + Message("Direct3DCreate9: original function not found in dll\n"); + return (NULL); + } + + + //Create originale IDirect3D9 object + IDirect3D9 *pIDirect3D9_orig = D3DCreate9_fn(SDKVersion); + + //create our uMod_IDirect3D9 object + uMod_IDirect3D9 *pIDirect3D9 = new uMod_IDirect3D9( pIDirect3D9_orig, gl_TextureServer); + + // Return pointer to our object instead of "real one" + return (pIDirect3D9); +} + +HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **ppD3D) +{ + Message("WINAPI Direct3DCreate9Ex\n"); + + if (!gl_hOriginal_DX9_Dll) LoadOriginal_DX9_Dll(); // looking for the "right d3d9.dll" + + // find original function in original d3d9.dll + Direct3DCreate9Ex_type D3DCreate9Ex_fn = (Direct3DCreate9Ex_type) GetProcAddress( gl_hOriginal_DX9_Dll, "Direct3DCreate9Ex"); + + + if (!D3DCreate9Ex_fn) + { + Message("Direct3DCreate9Ex: original function not found in dll\n"); + return (D3DERR_NOTAVAILABLE); + } + + + //Create originale IDirect3D9 object + IDirect3D9Ex *pIDirect3D9Ex_orig; + HRESULT ret = D3DCreate9Ex_fn( SDKVersion, &pIDirect3D9Ex_orig); + if (ret!=S_OK) return (ret); + + //create our uMod_IDirect3D9 object + uMod_IDirect3D9Ex *pIDirect3D9Ex = new uMod_IDirect3D9Ex( pIDirect3D9Ex_orig, gl_TextureServer); + + ppD3D = &pIDirect3D9Ex_orig; // Return pointer to our object instead of "real one" + return (ret); +} + +typedef IDirect3D9 *(APIENTRY *Direct3DCreate9_type)(UINT); +typedef HRESULT (APIENTRY *Direct3DCreate9Ex_type)(UINT SDKVersion, IDirect3D9Ex **ppD3D); + +typedef int (WINAPI *D3DPERF_BeginEvent_type)( D3DCOLOR , LPCWSTR ); +int WINAPI D3DPERF_BeginEvent( D3DCOLOR col, LPCWSTR wszName ) +{ + D3DPERF_BeginEvent_type fn = (D3DPERF_BeginEvent_type) GetProcAddress( gl_hOriginal_DX9_Dll, "D3DPERF_BeginEvent"); + return fn( col, wszName); +} + +typedef int (WINAPI *D3DPERF_EndEvent_type)( void ); +int WINAPI D3DPERF_EndEvent( void ) +{ + D3DPERF_EndEvent_type fn = (D3DPERF_EndEvent_type) GetProcAddress( gl_hOriginal_DX9_Dll, "D3DPERF_EndEvent"); + return fn(); +} + +typedef void (WINAPI *D3DPERF_SetMarker_type)( D3DCOLOR , LPCWSTR ); +void WINAPI D3DPERF_SetMarker( D3DCOLOR col, LPCWSTR wszName ) +{ + D3DPERF_SetMarker_type fn = (D3DPERF_SetMarker_type) GetProcAddress( gl_hOriginal_DX9_Dll, "D3DPERF_SetMarker"); + return fn( col, wszName); +} + +typedef void (WINAPI *D3DPERF_SetRegion_type)( D3DCOLOR, LPCWSTR ); +void WINAPI D3DPERF_SetRegion( D3DCOLOR col, LPCWSTR wszName ) +{ + D3DPERF_SetRegion_type fn = (D3DPERF_SetRegion_type) GetProcAddress( gl_hOriginal_DX9_Dll, "D3DPERF_SetRegion"); + return fn( col, wszName); +} + +typedef BOOL (WINAPI *D3DPERF_QueryRepeatFrame_type)( void ); +BOOL WINAPI D3DPERF_QueryRepeatFrame( void ) +{ + D3DPERF_QueryRepeatFrame_type fn = (D3DPERF_QueryRepeatFrame_type) GetProcAddress( gl_hOriginal_DX9_Dll, "D3DPERF_QueryRepeatFrame"); + return fn( ); +} + +typedef void (WINAPI *D3DPERF_SetOptions_type)( DWORD ); +void WINAPI D3DPERF_SetOptions( DWORD dwOptions ) +{ + D3DPERF_SetOptions_type fn = (D3DPERF_SetOptions_type) GetProcAddress( gl_hOriginal_DX9_Dll, "D3DPERF_SetOptions"); + return fn( dwOptions); +} + +typedef DWORD (WINAPI *D3DPERF_GetStatus_type)( void ); +DWORD WINAPI D3DPERF_GetStatus( void ) +{ + D3DPERF_GetStatus_type fn = (D3DPERF_GetStatus_type) GetProcAddress( gl_hOriginal_DX9_Dll, "D3DPERF_GetStatus"); + return fn( ); +} + +*/ +#else + +/* + * We inject the dll into the game, thus we retour the original Direct3DCreate9 function to our MyDirect3DCreate9 function + */ + +HRESULT uMod_D3D10CreateDeviceAndSwapChain( + IDXGIAdapter *pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + UINT SDKVersion, + DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, + IDXGISwapChain **ppSwapChain, + ID3D10Device **ppDevice +) +{ + Message("uMod_D3D10CreateDeviceAndSwapChain: bla original %lu, uMod %lu\n", D3D10CreateDeviceAndSwapChain_fn, uMod_D3D10CreateDeviceAndSwapChain); + + // in the Internet are many tutorials for detouring functions and all of them will work without the following 5 marked lines + // but somehow, for me it only works, if I retour the function and calling afterward the original function + + // BEGIN + + //LoadOriginal_DX10_Dll(); + + //RetourFunc((BYTE*) GetProcAddress( gl_hOriginal_DX9_Dll, "Direct3DCreate9"), (BYTE*)Direct3DCreate9_fn, 5); + //Direct3DCreate9_fn = (Direct3DCreate9_type) GetProcAddress( gl_hOriginal_DX9_Dll, "Direct3DCreate9"); + + RetourFunc((BYTE*) GetProcAddress( gl_hOriginal_DX10_Dll, "D3D10CreateDeviceAndSwapChain"), (BYTE*)D3D10CreateDeviceAndSwapChain_fn, number_of_byte); + D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type) GetProcAddress( gl_hOriginal_DX10_Dll, "D3D10CreateDeviceAndSwapChain"); + // END + + //DetourRemove( (BYTE*) GetProcAddress( gl_hOriginal_DX10_Dll, "D3D10CreateDeviceAndSwapChain"), (BYTE*)D3D10CreateDeviceAndSwapChain_fn); + //D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type) GetProcAddress( gl_hOriginal_DX10_Dll, "D3D10CreateDeviceAndSwapChain"); + + HRESULT ret = E_OUTOFMEMORY; + IDXGISwapChain *pIDXGISwapChain_orig = NULL; + ID3D10Device *pID3D10Device_orig = NULL; + if (D3D10CreateDeviceAndSwapChain_fn) + { + Message("create original device\n"); + ret = D3D10CreateDeviceAndSwapChain_fn(pAdapter,DriverType,Software,Flags,SDKVersion,pSwapChainDesc, &pIDXGISwapChain_orig, &pID3D10Device_orig); + } + /* + uMod_IDirect3D9 *pIDirect3D9; + if (pIDirect3D9_orig) + { + pIDirect3D9 = new uMod_IDirect3D9( pIDirect3D9_orig, gl_TextureServer); //creating our uMod_IDirect3D9 object + } + */ + + // we detour again + Message("detour again\n"); + //D3D10CreateDeviceAndSwapChain_fn = (D3D10CreateDeviceAndSwapChain_type)DetourFunc( (BYTE*)D3D10CreateDeviceAndSwapChain_fn, (BYTE*)uMod_D3D10CreateDeviceAndSwapChain, number_of_byte); + + + //*ppSwapChain = pIDXGISwapChain_orig; + //*ppDevice = pID3D10Device_orig; + Message("Fine\n"); + return (ret); +} + +HRESULT uMod_D3D10CreateDeviceAndSwapChain1( + IDXGIAdapter *pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + D3D10_FEATURE_LEVEL1 HardwareLevel, + UINT SDKVersion, + DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, + IDXGISwapChain **ppSwapChain, + ID3D10Device1 **ppDevice +) +{ + Message("uMod_D3D10CreateDeviceAndSwapChain1: original %lu, uMod %lu\n", D3D10CreateDeviceAndSwapChain1_fn, uMod_D3D10CreateDeviceAndSwapChain1); + + // in the Internet are many tutorials for detouring functions and all of them will work without the following 5 marked lines + // but somehow, for me it only works, if I retour the function and calling afterward the original function + + // BEGIN + + //LoadOriginal_DX10_Dll(); + + RetourFunc((BYTE*) GetProcAddress( gl_hOriginal_DX101_Dll, "D3D10CreateDeviceAndSwapChain1"), (BYTE*)D3D10CreateDeviceAndSwapChain1_fn, 5); + D3D10CreateDeviceAndSwapChain1_fn = (D3D10CreateDeviceAndSwapChain1_type) GetProcAddress( gl_hOriginal_DX101_Dll, "D3D10CreateDeviceAndSwapChain1"); + // END + + HRESULT ret = E_OUTOFMEMORY; + IDXGISwapChain *pIDXGISwapChain_orig = NULL; + ID3D10Device1 *pID3D10Device1_orig = NULL; + if (D3D10CreateDeviceAndSwapChain1_fn) + { + ret = D3D10CreateDeviceAndSwapChain1_fn(pAdapter,DriverType,Software,Flags,HardwareLevel,SDKVersion,pSwapChainDesc, &pIDXGISwapChain_orig, &pID3D10Device1_orig); + } + /* + uMod_IDirect3D9 *pIDirect3D9; + if (pIDirect3D9_orig) + { + pIDirect3D9 = new uMod_IDirect3D9( pIDirect3D9_orig, gl_TextureServer); //creating our uMod_IDirect3D9 object + } + */ + + // we detour again + D3D10CreateDeviceAndSwapChain1_fn = (D3D10CreateDeviceAndSwapChain1_type)DetourFunc( (BYTE*)D3D10CreateDeviceAndSwapChain1_fn, (BYTE*)uMod_D3D10CreateDeviceAndSwapChain1, 5); + //D3D10CreateDeviceAndSwapChain1_fn = (D3D10CreateDeviceAndSwapChain1_type)DetourFunc( (BYTE*)D3D10CreateDeviceAndSwapChain1_fn, (BYTE*)uMod_D3D10CreateDeviceAndSwapChain1, 5); + + + *ppSwapChain = pIDXGISwapChain_orig; + *ppDevice = pID3D10Device1_orig; + return (ret); +} + +#endif diff --git a/uMod_DX10/uMod_DX10_dll.h b/uMod_DX10/uMod_DX10_dll.h new file mode 100644 index 0000000..c217ecf --- /dev/null +++ b/uMod_DX10/uMod_DX10_dll.h @@ -0,0 +1,57 @@ +/* +This file is part of Universal Modding Engine. + + +Universal Modding Engine is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Universal Modding Engine is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Universal Modding Engine. If not, see . +*/ + + + +#ifndef uMod_DX10_DLL_H_ +#define uMod_DX10_DLL_H_ + +#include "../uMod_DXMain/uMod_Main.h" + +void LoadOriginal_DX10_Dll(void); +void InitDX10(); +void ExitDX10(); + +#ifndef NO_INJECTION + +HRESULT uMod_D3D10CreateDeviceAndSwapChain( + IDXGIAdapter *pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + UINT SDKVersion, + DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, + IDXGISwapChain **ppSwapChain, + ID3D10Device **ppDevice +); + +HRESULT uMod_D3D10CreateDeviceAndSwapChain1( + IDXGIAdapter *pAdapter, + D3D10_DRIVER_TYPE DriverType, + HMODULE Software, + UINT Flags, + D3D10_FEATURE_LEVEL1 HardwareLevel, + UINT SDKVersion, + DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, + IDXGISwapChain **ppSwapChain, + ID3D10Device1 **ppDevice +); + +#endif + +#endif diff --git a/uMod_DX9/uMod_DX9_dll.cpp b/uMod_DX9/uMod_DX9_dll.cpp index ec46e21..2096952 100644 --- a/uMod_DX9/uMod_DX9_dll.cpp +++ b/uMod_DX9/uMod_DX9_dll.cpp @@ -44,8 +44,8 @@ typedef IDirect3D9 *(APIENTRY *Direct3DCreate9_type)(UINT); typedef HRESULT (APIENTRY *Direct3DCreate9Ex_type)(UINT SDKVersion, IDirect3D9Ex **ppD3D); #ifndef NO_INJECTION -Direct3DCreate9_type Direct3DCreate9_fn; // we need to store the pointer to the original Direct3DCreate9 function after we have done a detour -Direct3DCreate9Ex_type Direct3DCreate9Ex_fn; // we need to store the pointer to the original Direct3DCreate9 function after we have done a detour +Direct3DCreate9_type Direct3DCreate9_fn = NULL; // we need to store the pointer to the original Direct3DCreate9 function after we have done a detour +Direct3DCreate9Ex_type Direct3DCreate9Ex_fn = NULL; // we need to store the pointer to the original Direct3DCreate9 function after we have done a detour #endif @@ -61,18 +61,21 @@ void InitDX9(void) #ifndef NO_INJECTION // we detour the original Direct3DCreate9 to our MyDirect3DCreate9 - Direct3DCreate9_fn = (Direct3DCreate9_type) GetProcAddress(gl_hOriginal_DX9_Dll, "Direct3DCreate9"); - if (Direct3DCreate9_fn!=NULL) + if (gl_hOriginal_DX9_Dll!=NULL) { - Message("Detour: Direct3DCreate9\n"); - Direct3DCreate9_fn = (Direct3DCreate9_type)DetourFunc( (BYTE*)Direct3DCreate9_fn, (BYTE*)uMod_Direct3DCreate9, 5); - } + Direct3DCreate9_fn = (Direct3DCreate9_type) GetProcAddress(gl_hOriginal_DX9_Dll, "Direct3DCreate9"); + if (Direct3DCreate9_fn!=NULL) + { + Message("Detour: Direct3DCreate9\n"); + Direct3DCreate9_fn = (Direct3DCreate9_type)DetourFunc( (BYTE*)Direct3DCreate9_fn, (BYTE*)uMod_Direct3DCreate9, 5); + } - Direct3DCreate9Ex_fn = (Direct3DCreate9Ex_type) GetProcAddress(gl_hOriginal_DX9_Dll, "Direct3DCreate9Ex"); - if (Direct3DCreate9Ex_fn!=NULL) - { - Message("Detour: Direct3DCreate9Ex\n"); - Direct3DCreate9Ex_fn = (Direct3DCreate9Ex_type)DetourFunc( (BYTE*)Direct3DCreate9Ex_fn, (BYTE*)uMod_Direct3DCreate9Ex, 7); + Direct3DCreate9Ex_fn = (Direct3DCreate9Ex_type) GetProcAddress(gl_hOriginal_DX9_Dll, "Direct3DCreate9Ex"); + if (Direct3DCreate9Ex_fn!=NULL) + { + Message("Detour: Direct3DCreate9Ex\n"); + Direct3DCreate9Ex_fn = (Direct3DCreate9Ex_type)DetourFunc( (BYTE*)Direct3DCreate9Ex_fn, (BYTE*)uMod_Direct3DCreate9Ex, 7); + } } #endif } @@ -89,17 +92,15 @@ void ExitDX9(void) void LoadOriginal_DX9_Dll(void) { char buffer[MAX_PATH]; - GetSystemDirectory(buffer,MAX_PATH); //get the system directory, we need to open the original d3d9.dll - - // Append dll name - strcat_s( buffer, MAX_PATH,"\\d3d9.dll"); - - // try to load the system's d3d9.dll, if pointer empty - if (!gl_hOriginal_DX9_Dll) gl_hOriginal_DX9_Dll = LoadLibrary(buffer); - - if (!gl_hOriginal_DX9_Dll) + if (gl_hOriginal_DX9_Dll==NULL) { - ExitProcess(0); // exit the hard way + GetSystemDirectory(buffer,MAX_PATH); //get the system directory, we need to open the original d3d9.dll + + // Append dll name + strcat_s( buffer, MAX_PATH,"\\d3d9.dll"); + + // try to load the system's d3d9.dll + gl_hOriginal_DX9_Dll = LoadLibrary(buffer); } } @@ -113,7 +114,8 @@ IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) { Message("WINAPI Direct3DCreate9\n"); - if (!gl_hOriginal_DX9_Dll) LoadOriginal_DX9_Dll(); // looking for the "right d3d9.dll" + if (gl_hOriginal_DX9_Dll==NULL) LoadOriginal_DX9_Dll(); // looking for the "original d3d9.dll" + if (gl_hOriginal_DX9_Dll==NULL) return (NULL); // find original function in original d3d9.dll Direct3DCreate9_type D3DCreate9_fn = (Direct3DCreate9_type) GetProcAddress( gl_hOriginal_DX9_Dll, "Direct3DCreate9"); @@ -140,7 +142,8 @@ HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **ppD3D) { Message("WINAPI Direct3DCreate9Ex\n"); - if (!gl_hOriginal_DX9_Dll) LoadOriginal_DX9_Dll(); // looking for the "right d3d9.dll" + if (gl_hOriginal_DX9_Dll==NULL) LoadOriginal_DX9_Dll(); // looking for the "original d3d9.dll" + if (gl_hOriginal_DX9_Dll==NULL) return (NULL); // find original function in original d3d9.dll Direct3DCreate9Ex_type D3DCreate9Ex_fn = (Direct3DCreate9Ex_type) GetProcAddress( gl_hOriginal_DX9_Dll, "Direct3DCreate9Ex"); diff --git a/uMod_DXMain/makefile.gcc b/uMod_DXMain/makefile.gcc index ade310e..ec1f457 100644 --- a/uMod_DXMain/makefile.gcc +++ b/uMod_DXMain/makefile.gcc @@ -59,9 +59,10 @@ endif CXX = cl CLINK = link.exe DEFINES = /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "_WINDLL" /D "_MBCS" $(DX_XX_Flag) -CFLAGS = /I "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include" /nologo /W3 /WX- /O2 ${DEFINES} ${precompiler_flag} /Gm- /EHsc /MT /GS /fp:precise /Zc:wchar_t +#CFLAGS = /I "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include" /nologo /W3 /WX- /O2 ${DEFINES} ${precompiler_flag} /Gm- /EHsc /MT /GS /fp:precise /Zc:wchar_t +CFLAGS = /I "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include" /nologo /W3 /WX- /O2 /Oi /Oy- /GL ${DEFINES} ${precompiler_flag} /Gm- /EHsc /MT /Gy- /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TP /analyze- LFLAGS = /INCREMENTAL:NO /NOLOGO /LIBPATH:"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86" /DLL "Winmm.lib" "d3dx9.lib" "d3dx10.lib" "dxguid.lib" "user32.lib" "Kernel32.lib" ${def_file} /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT:NO /MACHINE:X86 - + #/nologo /W3 /WX- /O2 /Oi /Oy- /GL /D WIN32 /D NDEBUG /D _WINDOWS /D _USRDLL /D D3DSTARTERKIT_EXPORTS /D _WINDLL /D _UNICODE /D UNICODE /Gm- /EHsc /MT /GS- /Gy- /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Release\\" /Fd"Release\vc100.pdb" /Gd /TP /analyze- obj = obj bin = bin @@ -80,7 +81,16 @@ objects = \ ${obj}\uMod_IDirect3DDevice9Ex.${obj_suff} \ ${obj}\uMod_IDirect3DTexture9.${obj_suff} \ ${obj}\uMod_IDirect3DVolumeTexture9.${obj_suff} \ - ${obj}\uMod_IDirect3DCubeTexture9.${obj_suff} + ${obj}\uMod_IDirect3DCubeTexture9.${obj_suff} \ + \ + ${obj}\uMod_DX10_dll.${obj_suff} + #\ + #${obj}\cpu.obj \ + #${obj}\disasm.obj \ + #${obj}\disasm_x86.obj \ + #${obj}\mhook.obj \ + #${obj}\misc.obj + headers = uMod_Main.h \ uMod_DXMain_dll.h \ @@ -98,7 +108,9 @@ DX9_headers = \ ..\uMod_DX9\uMod_IDirect3DTexture9.h \ ..\uMod_DX9\uMod_IDirect3DVolumeTexture9.h \ ..\uMod_DX9\uMod_IDirect3DCubeTexture9.h - + +DX10_headers = \ + ..\uMod_DX10\uMod_DX10_dll.h ${bin}\d3d9.dll: ${objects} ${CLINK} ${LFLAGS} ${objects} /OUT:${bin}\${dll} @@ -149,5 +161,8 @@ ${obj}\uMod_IDirect3DCubeTexture9.${obj_suff}: ..\uMod_DX9\uMod_IDirect3DCubeTex ${CXX} ${CFLAGS} /c $< /Fo$@ +${obj}\uMod_DX10_dll.${obj_suff}: ..\uMod_DX10\uMod_DX10_dll.cpp ${headers} ${DX10_headers} + ${CXX} ${CFLAGS} /c $< /Fo$@ + clean: del ${objects} ${bin}\${dll} \ No newline at end of file diff --git a/uMod_DXMain/uMod_DX10_dll_HOOK_INJECTION.def b/uMod_DXMain/uMod_DX10_dll_HOOK_INJECTION.def new file mode 100644 index 0000000..0da9f7d --- /dev/null +++ b/uMod_DXMain/uMod_DX10_dll_HOOK_INJECTION.def @@ -0,0 +1,6 @@ +LIBRARY "uMod_d3d10_Hook" +EXPORTS + uMod_D3D10CreateDeviceAndSwapChain @1 + uMod_D3D10CreateDeviceAndSwapChain1 @2 + InstallHook @3 + RemoveHook @4 \ No newline at end of file diff --git a/uMod_DXMain/uMod_DXMain_dll.cpp b/uMod_DXMain/uMod_DXMain_dll.cpp index e05a647..c9eec1d 100644 --- a/uMod_DXMain/uMod_DXMain_dll.cpp +++ b/uMod_DXMain/uMod_DXMain_dll.cpp @@ -97,7 +97,7 @@ void InitInstance(HINSTANCE hModule) gl_hThisInstance = (HINSTANCE) hModule; wchar_t game[MAX_PATH]; - if (HookThisProgram( game)) //ask if we need to hook this program + if (HookThisProgram( game, MAX_PATH)) //ask if we need to hook this program { OpenMessage(); Message("InitInstance: %lu\n", hModule); @@ -107,6 +107,9 @@ void InitInstance(HINSTANCE hModule) #ifdef DEF_USE_DX9 InitDX9(); #endif +#ifdef DEF_USE_DX10 + InitDX10(); +#endif if (gl_TextureServer->OpenPipe(game)) //open the pipe and send the name+path of this executable @@ -141,25 +144,47 @@ void ExitInstance() #ifdef DEF_USE_DX9 ExitDX9(); #endif +#ifdef DEF_USE_DX10 + ExitDX10(); +#endif CloseMessage(); } -bool HookThisProgram( wchar_t *ret) +bool HookThisProgram( wchar_t *ret, const int ret_len) { - wchar_t Executable[MAX_PATH]; - wchar_t Game[MAX_PATH]; - GetModuleFileNameW( GetModuleHandle( NULL ), Executable, MAX_PATH ); //ask for name and path of this executable + const unsigned int max_len = ret_len < MAX_PATH ? MAX_PATH : ret_len; + wchar_t *Executable = NULL; + wchar_t *Game = NULL; + if (GetMemory( Executable, max_len)) + { + ret[0]=0; + return false; + } + if (GetMemory( Game, max_len)) + { + delete [] Executable; + ret[0]=0; + return false; + } + GetModuleFileNameW( GetModuleHandle( NULL ), Executable, max_len ); //ask for name and path of this executable #ifdef HOOK_INJECTION //we use the gloabal hook FILE* file; wchar_t *app_path = _wgetenv( L"APPDATA"); //asc for the user application directory - wchar_t file_name[MAX_PATH]; - swprintf_s( file_name, MAX_PATH, L"%ls\\%ls\\%ls", app_path, uMod_APP_DIR, uMod_APP_DX9); + wchar_t *file_name = NULL; + if (GetMemory( file_name, max_len)) + { + delete [] Executable; + delete [] Game; + ret[0]=0; + return false; + } + swprintf_s( file_name, max_len, L"%ls\\%ls\\%ls", app_path, uMod_APP_DIR, uMod_APP_DX9); if (_wfopen_s( &file, file_name, L"rt,ccs=UTF-16LE")) return (false); // open the file in utf-16 LE mode @@ -170,48 +195,97 @@ bool HookThisProgram( wchar_t *ret) { //MessageBoxW( NULL, Game, L"test", 0); int len = 0; - while (Game[len]) + while (len #include "../uMod_DX9/uMod_DX9_dll.h" #endif +#ifdef DEF_USE_DX10 +#include "../uMod_DX10/uMod_DX10_dll.h" +#endif + void InitInstance(HINSTANCE hModule); void ExitInstance(void); -bool HookThisProgram( wchar_t *ret); +bool HookThisProgram( wchar_t *ret, const int max_len); DWORD WINAPI ServerThread( LPVOID lpParam); diff --git a/uMod_DXMain/uMod_Main.h b/uMod_DXMain/uMod_Main.h index e76d971..d4babe3 100644 --- a/uMod_DXMain/uMod_Main.h +++ b/uMod_DXMain/uMod_Main.h @@ -37,11 +37,17 @@ along with Universal Modding Engine. If not, see #include #include - +#include +#include +#include +#include +//#include "detours.h" #include "../uMod_GlobalDefines.h" #include "../uMod_Error.h" +#include "../uMod_Utils.h" + #include "uMod_Defines.h" #include "uMod_DXMain_dll.h" //#include "uMod_TextureFunction.h" diff --git a/uMod_GUI/uMod_GUI.cpp b/uMod_GUI/uMod_GUI.cpp index 293fce1..19fa517 100644 --- a/uMod_GUI/uMod_GUI.cpp +++ b/uMod_GUI/uMod_GUI.cpp @@ -636,7 +636,8 @@ void uMod_Frame::OnMenuStartGame(wxCommandEvent& event) wxString dll = wxGetCwd(); - dll.Append( L"\\" uMod_d3d9_DI_dll); + //dll.Append( L"\\" uMod_d3d9_DI_dll); + dll.Append( L"\\uMod_d3d10_DI.dll"); Inject(pi.hProcess, dll.wc_str(), "Nothing"); ResumeThread(pi.hThread); @@ -962,7 +963,8 @@ void uMod_Frame::InstallHook(void) { if (H_DX9_DLL==NULL) { - H_DX9_DLL = LoadLibraryW(uMod_d3d9_Hook_dll); + //H_DX9_DLL = LoadLibraryW(uMod_d3d9_Hook_dll); + H_DX9_DLL = LoadLibraryW(L"uMod_d3d10_HI.dll"); if (H_DX9_DLL!=NULL) { typedef void (*fkt_typ)(void); diff --git a/uMod_GUI/uMod_Main.h b/uMod_GUI/uMod_Main.h index 20ed801..4865e02 100644 --- a/uMod_GUI/uMod_Main.h +++ b/uMod_GUI/uMod_Main.h @@ -69,6 +69,7 @@ along with Universal Modding Engine. If not, see #include "../uMod_GlobalDefines.h" #include "../uMod_Error.h" +#include "../uMod_Utils.h" class uMod_Frame; @@ -120,40 +121,4 @@ enum #include "uMod_DirectInjection.h" #include "uMod_GUI.h" - -template -int GetMemory(T* &array, int num) -{ - if (array!=(T*)0) delete [] array; - try {array = new T[num];} - catch (...) {array = (T*) 0; return -1;} - return 0; -} - -template -int GetMemory(T* &array, int num, T init) -{ - if (array!=(T*)0) delete [] array; - try {array = new T[num];} - catch (...) {array = (T*) 0; return -1;} - for (int i=0; i -int GetMoreMemory(T* &old_array, int old_num, int new_num) -{ - if (new_num<=old_num) return 0; - T* new_array; - try {new_array = new T[new_num];} - catch (...) {return -1;} - if (old_array!=(T*)0) - { - for (int i=0; i