aboutsummaryrefslogtreecommitdiff
path: root/lib/interception/interception_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/interception/interception_win.cc')
-rw-r--r--lib/interception/interception_win.cc20
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/interception/interception_win.cc b/lib/interception/interception_win.cc
index a60c741cb3de..abbab24970cd 100644
--- a/lib/interception/interception_win.cc
+++ b/lib/interception/interception_win.cc
@@ -14,22 +14,23 @@
#ifdef _WIN32
+#include "interception.h"
#include <windows.h>
namespace __interception {
-bool GetRealFunctionAddress(const char *func_name, void **func_addr) {
+bool GetRealFunctionAddress(const char *func_name, uptr *func_addr) {
const char *DLLS[] = {
"msvcr80.dll",
"msvcr90.dll",
"kernel32.dll",
NULL
};
- *func_addr = NULL;
- for (size_t i = 0; *func_addr == NULL && DLLS[i]; ++i) {
- *func_addr = GetProcAddress(GetModuleHandleA(DLLS[i]), func_name);
+ *func_addr = 0;
+ for (size_t i = 0; *func_addr == 0 && DLLS[i]; ++i) {
+ *func_addr = (uptr)GetProcAddress(GetModuleHandleA(DLLS[i]), func_name);
}
- return (*func_addr != NULL);
+ return (*func_addr != 0);
}
// FIXME: internal_str* and internal_mem* functions should be moved from the
@@ -55,7 +56,7 @@ static void WriteJumpInstruction(char *jmp_from, char *to) {
*(ptrdiff_t*)(jmp_from + 1) = offset;
}
-bool OverrideFunction(void *old_func, void *new_func, void **orig_old_func) {
+bool OverrideFunction(uptr old_func, uptr new_func, uptr *orig_old_func) {
#ifdef _WIN64
# error OverrideFunction was not tested on x64
#endif
@@ -125,20 +126,21 @@ bool OverrideFunction(void *old_func, void *new_func, void **orig_old_func) {
// Now put the "jump to trampoline" instruction into the original code.
DWORD old_prot, unused_prot;
- if (!VirtualProtect(old_func, head, PAGE_EXECUTE_READWRITE, &old_prot))
+ if (!VirtualProtect((void*)old_func, head, PAGE_EXECUTE_READWRITE,
+ &old_prot))
return false;
// Put the needed instructions into the trampoline bytes.
_memcpy(trampoline, old_bytes, head);
WriteJumpInstruction(trampoline + head, old_bytes + head);
- *orig_old_func = trampoline;
+ *orig_old_func = (uptr)trampoline;
pool_used += head + 5;
// Intercept the 'old_func'.
WriteJumpInstruction(old_bytes, (char*)new_func);
_memset(old_bytes + 5, 0xCC /* int 3 */, head - 5);
- if (!VirtualProtect(old_func, head, old_prot, &unused_prot))
+ if (!VirtualProtect((void*)old_func, head, old_prot, &unused_prot))
return false; // not clear if this failure bothers us.
return true;