[PATCH v3 1/2] kernel32/tests: Add tests for ContinueDebugEvent with DBG_REPLY_LATER.

Rémi Bernon rbernon at codeweavers.com
Thu Feb 20 11:06:22 CST 2020


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/kernel32/tests/debugger.c | 62 +++++++++++++++++++++++++++++++++-
 1 file changed, 61 insertions(+), 1 deletion(-)

diff --git a/dlls/kernel32/tests/debugger.c b/dlls/kernel32/tests/debugger.c
index a2b5d1f410e..7fe4f872282 100644
--- a/dlls/kernel32/tests/debugger.c
+++ b/dlls/kernel32/tests/debugger.c
@@ -309,6 +309,56 @@ static void fetch_process_context(struct debugger_context *ctx)
 #define WAIT_EVENT_TIMEOUT 20000
 #define POLL_EVENT_TIMEOUT 200
 
+#define test_reply_later(a) test_reply_later_(__LINE__,a)
+static void test_reply_later_(unsigned int line, struct debugger_context *ctx)
+{
+    DEBUG_EVENT de0, de1;
+    HANDLE thread;
+    NTSTATUS status;
+
+    if (!ContinueDebugEvent(ctx->ev.dwProcessId, ctx->ev.dwThreadId, DBG_REPLY_LATER))
+        todo_wine win_skip("Skipping unsupported DBG_REPLY_LATER tests\n");
+    else
+    {
+        ok_(__FILE__,line)(WaitForDebugEvent(&de0, 50), "WaitForDebugEvent failed, last error:%u\n", GetLastError());
+        ok_(__FILE__,line)(ctx->ev.dwDebugEventCode == de0.dwDebugEventCode,
+           "delayed event differ, code:%x was:%x\n", de0.dwDebugEventCode, ctx->ev.dwDebugEventCode);
+        ok_(__FILE__,line)(ctx->ev.dwProcessId == de0.dwProcessId,
+           "delayed event differ, pid:%x was:%x\n", de0.dwProcessId, ctx->ev.dwProcessId);
+        ok_(__FILE__,line)(ctx->ev.dwThreadId == de0.dwThreadId,
+           "delayed event differ, tid:%x was:%x\n", de0.dwThreadId, ctx->ev.dwThreadId);
+
+        if (ctx->ev.dwDebugEventCode != CREATE_PROCESS_DEBUG_EVENT &&
+            ctx->ev.dwDebugEventCode != CREATE_THREAD_DEBUG_EVENT &&
+            ctx->ev.dwDebugEventCode != EXIT_THREAD_DEBUG_EVENT &&
+            ctx->ev.dwDebugEventCode != EXIT_PROCESS_DEBUG_EVENT)
+        {
+            thread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ctx->ev.dwThreadId);
+            ok_(__FILE__,line)(thread != INVALID_HANDLE_VALUE, "OpenThread failed, last error:%u\n", GetLastError());
+
+            status = NtSuspendThread(thread, NULL);
+            ok_(__FILE__,line)(!status, "NtSuspendThread failed, last error:%u\n", GetLastError());
+
+            ok_(__FILE__,line)(ContinueDebugEvent(ctx->ev.dwProcessId, ctx->ev.dwThreadId, DBG_REPLY_LATER),
+               "ContinueDebugEvent failed, last error:%u\n", GetLastError());
+
+            ok_(__FILE__,line)(!WaitForDebugEvent(&de1, 50), "WaitForDebugEvent succeeded.\n");
+            status = NtResumeThread(thread, NULL);
+
+            ok_(__FILE__,line)(!status, "NtResumeThread failed, last error:%u\n", GetLastError());
+            CloseHandle(thread);
+
+            ok_(__FILE__,line)(WaitForDebugEvent(&de1, 50), "WaitForDebugEvent failed, last error:%u\n", GetLastError());
+            ok_(__FILE__,line)(ctx->ev.dwDebugEventCode == de1.dwDebugEventCode,
+               "delayed event differ, code:%x was:%x\n", de1.dwDebugEventCode, ctx->ev.dwDebugEventCode);
+            ok_(__FILE__,line)(ctx->ev.dwProcessId == de1.dwProcessId,
+               "delayed event differ, pid:%x was:%x\n", de1.dwProcessId, ctx->ev.dwProcessId);
+            ok_(__FILE__,line)(ctx->ev.dwThreadId == de1.dwThreadId,
+               "delayed event differ, tid:%x was:%x\n", de1.dwThreadId, ctx->ev.dwThreadId);
+        }
+    }
+}
+
 #define next_event(a,b) next_event_(__LINE__,a,b)
 static void next_event_(unsigned line, struct debugger_context *ctx, unsigned timeout)
 {
@@ -1273,7 +1323,11 @@ static void test_debugger(const char *argv0)
     next_event(&ctx, WAIT_EVENT_TIMEOUT);
     ok(ctx.ev.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT, "dwDebugEventCode = %d\n", ctx.ev.dwDebugEventCode);
     wait_for_breakpoint(&ctx);
-    do next_event(&ctx, POLL_EVENT_TIMEOUT);
+    do
+    {
+        test_reply_later(&ctx);
+        next_event(&ctx, POLL_EVENT_TIMEOUT);
+    }
     while(ctx.ev.dwDebugEventCode != -1);
 
     mem = VirtualAllocEx(pi.hProcess, NULL, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
@@ -1297,6 +1351,7 @@ static void test_debugger(const char *argv0)
         debuggee_thread = get_debuggee_thread(&ctx, ctx.ev.dwThreadId);
 
         wait_for_breakpoint(&ctx);
+        test_reply_later(&ctx);
         fetch_thread_context(debuggee_thread);
         ok(ctx.ev.u.Exception.ExceptionRecord.ExceptionAddress == thread_proc,
            "ExceptionAddress = %p\n", ctx.ev.u.Exception.ExceptionRecord.ExceptionAddress);
@@ -1304,8 +1359,11 @@ static void test_debugger(const char *argv0)
            get_ip(&debuggee_thread->ctx));
 
         single_step(&ctx, debuggee_thread, thread_proc + 2);
+        test_reply_later(&ctx);
         single_step(&ctx, debuggee_thread, thread_proc + 3);
+        test_reply_later(&ctx);
         single_step(&ctx, debuggee_thread, thread_proc);
+        test_reply_later(&ctx);
 
         byte = 0xc3; /* ret */
         ret = WriteProcessMemory(pi.hProcess, thread_proc, &byte, 1, NULL);
@@ -1328,6 +1386,7 @@ static void test_debugger(const char *argv0)
         ok(thread != NULL, "CreateRemoteThread failed: %u\n", GetLastError());
         expect_event(&ctx, CREATE_THREAD_DEBUG_EVENT);
         expect_breakpoint_exception(&ctx, NULL);
+        test_reply_later(&ctx);
         expect_event(&ctx, EXIT_THREAD_DEBUG_EVENT);
 
         /* BREAKPOINT_PROMPT */
@@ -1422,6 +1481,7 @@ static void test_debugger(const char *argv0)
 
     do
     {
+        test_reply_later(&ctx);
         next_event(&ctx, WAIT_EVENT_TIMEOUT);
         ok (ctx.ev.dwDebugEventCode != EXCEPTION_DEBUG_EVENT, "got exception\n");
     }
-- 
2.25.0




More information about the wine-devel mailing list