ntdll/tests: Test DEP exceptions on x86-64.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
19a3bb2725
commit
f63474b6d5
|
@ -2426,6 +2426,59 @@ static void test_prot_fault(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LONG CALLBACK dpe_handler(EXCEPTION_POINTERS *info)
|
||||||
|
{
|
||||||
|
EXCEPTION_RECORD *rec = info->ExceptionRecord;
|
||||||
|
DWORD old_prot;
|
||||||
|
|
||||||
|
trace("vect. handler %08x addr:%p\n", rec->ExceptionCode, rec->ExceptionAddress);
|
||||||
|
|
||||||
|
got_exception++;
|
||||||
|
|
||||||
|
ok(rec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION,
|
||||||
|
"got %#x\n", rec->ExceptionCode);
|
||||||
|
ok(rec->NumberParameters == 2, "got %u params\n", rec->NumberParameters);
|
||||||
|
ok(rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT,
|
||||||
|
"got %#lx\n", rec->ExceptionInformation[0]);
|
||||||
|
ok((void *)rec->ExceptionInformation[1] == code_mem,
|
||||||
|
"got %p\n", (void *)rec->ExceptionInformation[1]);
|
||||||
|
|
||||||
|
VirtualProtect(code_mem, 1, PAGE_EXECUTE_READWRITE, &old_prot);
|
||||||
|
|
||||||
|
return EXCEPTION_CONTINUE_EXECUTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_dpe_exceptions(void)
|
||||||
|
{
|
||||||
|
static const BYTE ret[] = {0xc3};
|
||||||
|
DWORD (CDECL *func)(void) = code_mem;
|
||||||
|
DWORD old_prot;
|
||||||
|
void *handler;
|
||||||
|
|
||||||
|
memcpy(code_mem, ret, sizeof(ret));
|
||||||
|
|
||||||
|
handler = pRtlAddVectoredExceptionHandler(TRUE, &dpe_handler);
|
||||||
|
ok(!!handler, "RtlAddVectoredExceptionHandler failed\n");
|
||||||
|
|
||||||
|
VirtualProtect(code_mem, 1, PAGE_NOACCESS, &old_prot);
|
||||||
|
|
||||||
|
got_exception = 0;
|
||||||
|
func();
|
||||||
|
ok(got_exception == 1, "got %u exceptions\n", got_exception);
|
||||||
|
|
||||||
|
VirtualProtect(code_mem, 1, old_prot, &old_prot);
|
||||||
|
|
||||||
|
VirtualProtect(code_mem, 1, PAGE_READWRITE, &old_prot);
|
||||||
|
|
||||||
|
got_exception = 0;
|
||||||
|
func();
|
||||||
|
ok(got_exception == 1, "got %u exceptions\n", got_exception);
|
||||||
|
|
||||||
|
VirtualProtect(code_mem, 1, old_prot, &old_prot);
|
||||||
|
|
||||||
|
pRtlRemoveVectoredExceptionHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __x86_64__ */
|
#endif /* __x86_64__ */
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
@ -3021,6 +3074,7 @@ START_TEST(exception)
|
||||||
test___C_specific_handler();
|
test___C_specific_handler();
|
||||||
test_restore_context();
|
test_restore_context();
|
||||||
test_prot_fault();
|
test_prot_fault();
|
||||||
|
test_dpe_exceptions();
|
||||||
|
|
||||||
if (pRtlAddFunctionTable && pRtlDeleteFunctionTable && pRtlInstallFunctionTableCallback && pRtlLookupFunctionEntry)
|
if (pRtlAddFunctionTable && pRtlDeleteFunctionTable && pRtlInstallFunctionTableCallback && pRtlLookupFunctionEntry)
|
||||||
test_dynamic_unwind();
|
test_dynamic_unwind();
|
||||||
|
|
Loading…
Reference in New Issue