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;