Module: wine Branch: master Commit: f680ccb898adf83ed10600a03d7c57f936362346 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f680ccb898adf83ed10600a03d...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Jul 26 11:29:24 2017 +0200
ntdll/tests: Test hardware breakpoints in newly created thread.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/tests/exception.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index bdca452..7cb704c 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -822,12 +822,21 @@ static DWORD int3_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD
static const BYTE int3_code[] = { 0xCC, 0xc3 }; /* int 3, ret */
+static DWORD WINAPI hw_reg_exception_thread( void *arg ) +{ + int expect = (ULONG_PTR)arg; + got_exception = 0; + run_exception_test( bpx_handler, NULL, dummy_code, sizeof(dummy_code), 0 ); + ok( got_exception == expect, "expected %u exceptions, got %d\n", expect, got_exception ); + return 0; +}
static void test_exceptions(void) { CONTEXT ctx; NTSTATUS res; struct dbgreg_test dreg_test; + HANDLE h;
if (!pNtGetContextThread || !pNtSetContextThread) { @@ -881,6 +890,33 @@ static void test_exceptions(void)
/* test int3 handling */ run_exception_test(int3_handler, NULL, int3_code, sizeof(int3_code), 0); + + /* test that hardware breakpoints are not inherited by created threads */ + res = pNtSetContextThread( GetCurrentThread(), &ctx ); + ok( res == STATUS_SUCCESS, "NtSetContextThread failed with %x\n", res ); + + h = CreateThread( NULL, 0, hw_reg_exception_thread, 0, 0, NULL ); + WaitForSingleObject( h, 10000 ); + CloseHandle( h ); + + h = CreateThread( NULL, 0, hw_reg_exception_thread, (void *)4, CREATE_SUSPENDED, NULL ); + ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS; + res = pNtGetContextThread( h, &ctx ); + ok( res == STATUS_SUCCESS, "NtGetContextThread failed with %x\n", res ); + ok( ctx.Dr0 == 0, "dr0 %x\n", ctx.Dr0 ); + todo_wine ok( ctx.Dr7 == 0, "dr7 %x\n", ctx.Dr7 ); + ctx.Dr0 = (DWORD)code_mem; + ctx.Dr7 = 3; + res = pNtSetContextThread( h, &ctx ); + ok( res == STATUS_SUCCESS, "NtSetContextThread failed with %x\n", res ); + ResumeThread( h ); + WaitForSingleObject( h, 10000 ); + CloseHandle( h ); + + ctx.Dr0 = 0; + ctx.Dr7 = 0; + res = pNtSetContextThread( GetCurrentThread(), &ctx ); + ok( res == STATUS_SUCCESS, "NtSetContextThread failed with %x\n", res ); }
static void test_debugger(void)