From 6fee78fb3ee07527768df495cffb79768faadc95 Mon Sep 17 00:00:00 2001 From: Nicklas Lindgren Date: Thu, 22 Dec 2016 20:29:33 +0100 Subject: [PATCH] Replace Detours with MinHook This change removes the dependency on the proprietary Microsoft Detours and replaces it with MinHook, which is BSD licensed. This will allow making releases in accordance with the GPL. Also, DSfix will be a bit easier to build. --- DSfix.sln | 2 -- DSfix.vcxproj | 18 ++++++---- Detouring.cpp | 93 +++++++++++++++++++++++++++++++-------------------- Detouring.h | 2 +- 4 files changed, 68 insertions(+), 47 deletions(-) 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;