diff --git a/DSfix.sln b/DSfix.sln index 8548d66..88a5022 100644 --- a/DSfix.sln +++ b/DSfix.sln @@ -12,8 +12,6 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {E004A114-54E0-B15C-BDA5-46681084E257}.Debug|Win32.ActiveCfg = Debug|Win32 {E004A114-54E0-B15C-BDA5-46681084E257}.Debug|Win32.Build.0 = Debug|Win32 - {E004A114-54E0-B15C-BDA5-46681084E257}.Debug|x64.ActiveCfg = Debug|x64 - {E004A114-54E0-B15C-BDA5-46681084E257}.Debug|x64.Build.0 = Debug|x64 {E004A114-54E0-B15C-BDA5-46681084E257}.Release|Win32.ActiveCfg = Release|Win32 {E004A114-54E0-B15C-BDA5-46681084E257}.Release|Win32.Build.0 = Release|Win32 {E004A114-54E0-B15C-BDA5-46681084E257}.Release|x64.ActiveCfg = Release|x64 diff --git a/DSfix.vcxproj b/DSfix.vcxproj index ce32a8a..de4b79f 100644 --- a/DSfix.vcxproj +++ b/DSfix.vcxproj @@ -1,4 +1,4 @@ - + @@ -75,16 +75,18 @@ .\Debug\ .\Debug\ false - false - C:\dev\OculusSDK\LibOVR\Include;C:\dev\Detours Express 3.0\include;$(IncludePath) - E:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;..\minhook\include;$(IncludePath) DINPUT8 d3d9 DINPUT8 d3d9 - C:\dev\OculusSDK\LibOVR\Lib\Win32;C:\Program Files (x86)\Microsoft DirectX SDK (August 2009)\Lib\x86;C:\dev\Detours Express 3.0\lib.X86;$(LibraryPath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;lib\Debug;$(Configuration);$(LibraryPath) + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;..\minhook\include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;lib\Debug;$(Configuration);$(LibraryPath) @@ -112,7 +114,7 @@ MachineX86 E:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;%(AdditionalLibraryDirectories) DINPUT8.def - winmm.lib;detours.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;psapi.lib;%(AdditionalDependencies) + winmm.lib;libMinHook.x86.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;psapi.lib;%(AdditionalDependencies) Default @@ -187,6 +189,8 @@ true MachineX86 C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;%(AdditionalLibraryDirectories) + DINPUT8.def + winmm.lib;libMinHook.x86.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) _DEBUG;%(PreprocessorDefinitions) @@ -346,4 +350,4 @@ - \ No newline at end of file + diff --git a/Detouring.cpp b/Detouring.cpp index ac2b7c8..8141f17 100644 --- a/Detouring.cpp +++ b/Detouring.cpp @@ -74,49 +74,68 @@ HRESULT WINAPI DetouredD3DXCompileShader(_In_ LPCSTR pSrcData, _In_ UINT srcData return res; } +void hookFunction(const char* name, const char* dllname, void** ppTarget, void* const pDetour, void** ppOriginal) { + HMODULE dllHandle = GetModuleHandle(dllname); + *ppTarget = GetProcAddress(dllHandle, name); + MH_STATUS ret = MH_CreateHook(*ppTarget, pDetour, ppOriginal); + if (ret == MH_OK) { + SDLOG(2, "MH_CreateHook for %s in %s succeeded\n", name, dllname); + } + else { + SDLOG(0, "MH_CreateHook for %s in %s failed\n", name, dllname); + SDLOG(0, "dllHandle = %p\n", dllHandle); + SDLOG(0, "*ppTarget = %p\n", *ppTarget); + } + ret = MH_EnableHook(*ppTarget); + if (ret == MH_OK) { + SDLOG(2, "MH_EnableHook succeeded\n"); + } + else { + SDLOG(0, "MH_EnableHook failed\n"); + } +} + +namespace { + void* TargetDirect3DCreate9; + void* TargetQueryPerformanceCounter; + void* TargetD3DXCreateTextureFromFileInMemory; + void* TargetD3DXCreateTextureFromFileInMemoryEx; +} + void earlyDetour() { QueryPerformanceFrequency(&countsPerSec); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&)oDirect3DCreate9, hkDirect3DCreate9); - DetourTransactionCommit(); + MH_Initialize(); + hookFunction("Direct3DCreate9", + "d3d9.dll", + &TargetDirect3DCreate9, + &hkDirect3DCreate9, + reinterpret_cast(&oDirect3DCreate9)); } -void startDetour() { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - //DetourAttach(&(PVOID&)TrueSleepEx, DetouredSleepEx); - //DetourAttach(&(PVOID&)TrueTimeGetTime, DetouredTimeGetTime); - if(Settings::get().getSkipIntro()) DetourAttach(&(PVOID&)TrueQueryPerformanceCounter, DetouredQueryPerformanceCounter); - //TrueD3DXCreateTexture = (D3DXCreateTexture_FNType)DetourFindFunction("d3dx9_43.dll", "D3DXCreateTexture"); - TrueD3DXCreateTextureFromFileInMemory = (D3DXCreateTextureFromFileInMemory_FNType)DetourFindFunction("d3dx9_43.dll", "D3DXCreateTextureFromFileInMemory"); - TrueD3DXCreateTextureFromFileInMemoryEx = (D3DXCreateTextureFromFileInMemoryEx_FNType)DetourFindFunction("d3dx9_43.dll", "D3DXCreateTextureFromFileInMemoryEx"); - //DetourAttach(&(PVOID&)TrueD3DXCreateTexture, DetouredD3DXCreateTexture); - DetourAttach(&(PVOID&)TrueD3DXCreateTextureFromFileInMemory, DetouredD3DXCreateTextureFromFileInMemory); - DetourAttach(&(PVOID&)TrueD3DXCreateTextureFromFileInMemoryEx, DetouredD3DXCreateTextureFromFileInMemoryEx); - //TrueD3DXCompileShader = (D3DXCompileShader_FNType)DetourFindFunction("d3dx9_43.dll", "D3DXCompileShader"); - //SDLOG(0, "Detouring: compile shader: %p\n", TrueD3DXCompileShader); - //DetourAttach(&(PVOID&)TrueD3DXCompileShader, DetouredD3DXCompileShader); - - if(DetourTransactionCommit() == NO_ERROR) { - SDLOG(0, "Detouring: Detoured successfully\n"); - } else { - SDLOG(0, "Detouring: Error detouring\n"); +void startDetour() { + if (Settings::get().getSkipIntro()) { + hookFunction("QueryPerformanceCounter", + "kernel32.dll", + &TargetQueryPerformanceCounter, + &DetouredQueryPerformanceCounter, + reinterpret_cast(&TrueQueryPerformanceCounter)); } + hookFunction("D3DXCreateTextureFromFileInMemory", + "d3dx9_43.dll", + &TargetD3DXCreateTextureFromFileInMemory, + &DetouredD3DXCreateTextureFromFileInMemory, + reinterpret_cast(&TrueD3DXCreateTextureFromFileInMemory)); + hookFunction("D3DXCreateTextureFromFileInMemoryEx", + "d3dx9_43.dll", + &TargetD3DXCreateTextureFromFileInMemoryEx, + &DetouredD3DXCreateTextureFromFileInMemoryEx, + reinterpret_cast(&TrueD3DXCreateTextureFromFileInMemoryEx)); } void endDetour() { - //if(Settings::get().getSkipIntro()) { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - //DetourDetach(&(PVOID&)TrueSleepEx, DetouredSleepEx); - //DetourDetach(&(PVOID&)TrueTimeGetTime, DetouredTimeGetTime); - if(Settings::get().getSkipIntro()) DetourDetach(&(PVOID&)TrueQueryPerformanceCounter, DetouredQueryPerformanceCounter); - //DetourDetach(&(PVOID&)TrueD3DXCreateTexture, DetouredD3DXCreateTexture); - DetourDetach(&(PVOID&)TrueD3DXCreateTextureFromFileInMemory, DetouredD3DXCreateTextureFromFileInMemory); - DetourDetach(&(PVOID&)TrueD3DXCreateTextureFromFileInMemoryEx, DetouredD3DXCreateTextureFromFileInMemoryEx); - DetourDetach(&(PVOID&)oDirect3DCreate9, hkDirect3DCreate9); - //DetourDetach(&(PVOID&)TrueD3DXCompileShader, DetouredD3DXCompileShader); - DetourTransactionCommit(); - //} + MH_RemoveHook(TargetDirect3DCreate9); + MH_RemoveHook(TargetQueryPerformanceCounter); + MH_RemoveHook(TargetD3DXCreateTextureFromFileInMemory); + MH_RemoveHook(TargetD3DXCreateTextureFromFileInMemoryEx); + MH_Uninitialize(); } diff --git a/Detouring.h b/Detouring.h index ebd5f7a..943d5a2 100644 --- a/Detouring.h +++ b/Detouring.h @@ -2,7 +2,7 @@ #include "main.h" -#include +#include static DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable) = SleepEx;