diff options
-rw-r--r-- | cli/cli_trace.cpp | 9 | ||||
-rw-r--r-- | inject/injectee.cpp | 37 |
2 files changed, 32 insertions, 14 deletions
diff --git a/cli/cli_trace.cpp b/cli/cli_trace.cpp index a01b389b..e5b0cfdc 100644 --- a/cli/cli_trace.cpp +++ b/cli/cli_trace.cpp @@ -137,14 +137,9 @@ traceProgram(trace::API api, #if defined(_WIN32) /* * Use DLL injection method on Windows, even for APIs that don't stricly - * need it. Except when tracing OpenGL on Windows 8, as the injection - * method seems to have troubles tracing the internal - * gdi32.dll!SwapBuffers -> opengl32.dll!wglSwapBuffer calls, per github - * issue #172. + * need it. */ - if (api != trace::API_GL || !IsWindows8OrGreater()) { - useInject = true; - } + useInject = true; if (useInject) { args.push_back("inject"); diff --git a/inject/injectee.cpp b/inject/injectee.cpp index 0e0f132b..4d512134 100644 --- a/inject/injectee.cpp +++ b/inject/injectee.cpp @@ -292,6 +292,19 @@ static unsigned numReplacements = 0; static Replacement replacements[32]; +static void +hookLibraryLoaderFunctions(HMODULE hModule, + const char *szModule, + const char *pszDllName) +{ + hookFunction(hModule, szModule, pszDllName, "LoadLibraryA", (LPVOID)MyLoadLibraryA); + hookFunction(hModule, szModule, pszDllName, "LoadLibraryW", (LPVOID)MyLoadLibraryW); + hookFunction(hModule, szModule, pszDllName, "LoadLibraryExA", (LPVOID)MyLoadLibraryExA); + hookFunction(hModule, szModule, pszDllName, "LoadLibraryExW", (LPVOID)MyLoadLibraryExW); + hookFunction(hModule, szModule, pszDllName, "GetProcAddress", (LPVOID)MyGetProcAddress); +} + + /* Set of previously hooked modules */ static std::set<HMODULE> g_hHookedModules; @@ -310,36 +323,46 @@ hookModule(HMODULE hModule, return; } + /* Never hook this module */ if (hModule == g_hThisModule) { return; } + /* Don't hook our replacement modules (based on HMODULE) */ for (unsigned i = 0; i < numReplacements; ++i) { if (hModule == replacements[i].hReplaceModule) { return; } } - hookFunction(hModule, szModule, "kernel32.dll", "LoadLibraryA", (LPVOID)MyLoadLibraryA); - hookFunction(hModule, szModule, "kernel32.dll", "LoadLibraryW", (LPVOID)MyLoadLibraryW); - hookFunction(hModule, szModule, "kernel32.dll", "LoadLibraryExA", (LPVOID)MyLoadLibraryExA); - hookFunction(hModule, szModule, "kernel32.dll", "LoadLibraryExW", (LPVOID)MyLoadLibraryExW); - hookFunction(hModule, szModule, "kernel32.dll", "GetProcAddress", (LPVOID)MyGetProcAddress); - const char *szBaseName = getBaseName(szModule); + + /* Don't hook our replacement modules (based on MODULE name) */ for (unsigned i = 0; i < numReplacements; ++i) { if (stricmp(szBaseName, replacements[i].szMatchModule) == 0) { return; } } + /* Leave these modules alone */ + if (stricmp(szBaseName, "kernel32.dll") == 0 || + stricmp(szBaseName, "ConEmuHk.dll") == 0) { + return; + } + + /* Hook library loader functions */ + hookLibraryLoaderFunctions(hModule, szModule, "kernel32.dll"); + hookLibraryLoaderFunctions(hModule, szModule, "api-ms-win-core-libraryloader-l1-1-1.dll"); + hookLibraryLoaderFunctions(hModule, szModule, "api-ms-win-core-libraryloader-l1-2-0.dll"); + /* Don't hook internal dependencies */ if (stricmp(szBaseName, "d3d10core.dll") == 0 || stricmp(szBaseName, "d3d10level9.dll") == 0 || stricmp(szBaseName, "d3d10sdklayers.dll") == 0 || stricmp(szBaseName, "d3d10_1core.dll") == 0 || stricmp(szBaseName, "d3d11sdklayers.dll") == 0 || - stricmp(szBaseName, "d3d11_1sdklayers.dll") == 0) { + stricmp(szBaseName, "d3d11_1sdklayers.dll") == 0 || + stricmp(szBaseName, "d3d11_2sdklayers.dll") == 0) { return; } |