Jacek Caban : ntdll/tests: Don't assume 32-bit test module base.
Alexandre Julliard
julliard at winehq.org
Fri Jan 22 15:59:15 CST 2021
Module: wine
Branch: master
Commit: fadd22ed5a844525ad1c9f3fa99980d732f5098b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fadd22ed5a844525ad1c9f3fa99980d732f5098b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Jan 22 15:18:32 2021 +0100
ntdll/tests: Don't assume 32-bit test module base.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/tests/exception.c | 41 ++++++++++++++++-------------------------
1 file changed, 16 insertions(+), 25 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 202a939b76f..06d8246a566 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -3867,22 +3867,20 @@ static void test_kiuserexceptiondispatcher(void)
0x48, 0x8d, 0x8c, 0x24, 0xf0, 0x04, 0x00, 0x00,
/* lea 0x4f0(%rsp),%rcx */
0x4c, 0x89, 0x22, /* mov %r12,(%rdx) */
- 0xff, 0x14, 0x25,
- /* offset: 17 bytes */
- 0x00, 0x00, 0x00, 0x00, /* callq *addr */ /* call hook implementation. */
+ 0x48, 0xb8, /* movabs hook_KiUserExceptionDispatcher,%rax */
+ 0,0,0,0,0,0,0,0, /* offset 16 */
+ 0xff, 0xd0, /* callq *rax */
0x48, 0x31, 0xc9, /* xor %rcx, %rcx */
0x48, 0x31, 0xd2, /* xor %rdx, %rdx */
-
- 0xff, 0x24, 0x25,
- /* offset: 30 bytes */
- 0x00, 0x00, 0x00, 0x00, /* jmpq *addr */ /* jump to original function. */
+ 0x48, 0xb8, /* movabs pKiUserExceptionDispatcher,%rax */
+ 0,0,0,0,0,0,0,0, /* offset 34 */
+ 0xff, 0xe0, /* jmpq *rax */
};
- void *phook_KiUserExceptionDispatcher = hook_KiUserExceptionDispatcher;
BYTE patched_KiUserExceptionDispatcher_bytes[12];
- DWORD old_protect1, old_protect2;
+ void *bpt_address, *trampoline_ptr;
EXCEPTION_RECORD record;
- void *bpt_address;
+ DWORD old_protect;
CONTEXT ctx;
LONG pass;
BYTE *ptr;
@@ -3898,19 +3896,14 @@ static void test_kiuserexceptiondispatcher(void)
*(ULONG64 *)(except_code + 2) = (ULONG64)&test_kiuserexceptiondispatcher_regs;
*(ULONG64 *)(except_code + 0x2a) = (ULONG64)&test_kiuserexceptiondispatcher_regs.new_rax;
- ok(((ULONG64)&phook_KiUserExceptionDispatcher & 0xffffffff) == ((ULONG64)&phook_KiUserExceptionDispatcher),
- "Address is too long.\n");
- ok(((ULONG64)&pKiUserExceptionDispatcher & 0xffffffff) == ((ULONG64)&pKiUserExceptionDispatcher),
- "Address is too long.\n");
-
- *(unsigned int *)(hook_trampoline + 17) = (unsigned int)(ULONG_PTR)&phook_KiUserExceptionDispatcher;
- *(unsigned int *)(hook_trampoline + 30) = (unsigned int)(ULONG_PTR)&pKiUserExceptionDispatcher;
-
- ret = VirtualProtect(hook_trampoline, ARRAY_SIZE(hook_trampoline), PAGE_EXECUTE_READWRITE, &old_protect1);
- ok(ret, "Got unexpected ret %#x, GetLastError() %u.\n", ret, GetLastError());
+ *(ULONG_PTR *)(hook_trampoline + 16) = (ULONG_PTR)hook_KiUserExceptionDispatcher;
+ *(ULONG_PTR *)(hook_trampoline + 34) = (ULONG_PTR)pKiUserExceptionDispatcher;
+ trampoline_ptr = (char *)code_mem + 1024;
+ memcpy(trampoline_ptr, hook_trampoline, sizeof(hook_trampoline));
+ ok(((ULONG64)trampoline_ptr & 0xffffffff) == (ULONG64)trampoline_ptr, "Address is too long.\n");
ret = VirtualProtect(pKiUserExceptionDispatcher, sizeof(saved_KiUserExceptionDispatcher_bytes),
- PAGE_EXECUTE_READWRITE, &old_protect2);
+ PAGE_EXECUTE_READWRITE, &old_protect);
ok(ret, "Got unexpected ret %#x, GetLastError() %u.\n", ret, GetLastError());
memcpy(saved_KiUserExceptionDispatcher_bytes, pKiUserExceptionDispatcher,
@@ -3919,7 +3912,7 @@ static void test_kiuserexceptiondispatcher(void)
/* mov hook_trampoline, %rax */
*ptr++ = 0x48;
*ptr++ = 0xb8;
- *(void **)ptr = hook_trampoline;
+ *(void **)ptr = trampoline_ptr;
ptr += sizeof(ULONG64);
/* jmp *rax */
*ptr++ = 0xff;
@@ -4042,9 +4035,7 @@ static void test_kiuserexceptiondispatcher(void)
RemoveVectoredExceptionHandler(vectored_handler);
ret = VirtualProtect(pKiUserExceptionDispatcher, sizeof(saved_KiUserExceptionDispatcher_bytes),
- old_protect2, &old_protect2);
- ok(ret, "Got unexpected ret %#x, GetLastError() %u.\n", ret, GetLastError());
- ret = VirtualProtect(hook_trampoline, ARRAY_SIZE(hook_trampoline), old_protect1, &old_protect1);
+ old_protect, &old_protect);
ok(ret, "Got unexpected ret %#x, GetLastError() %u.\n", ret, GetLastError());
}
More information about the wine-cvs
mailing list