summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/cli_trace.cpp9
-rw-r--r--inject/injectee.cpp37
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;
}