[PATCH v2 2/3] ntdll/tests: Add tests for ContinueDebugEvent with DBG_REPLY_LATER status.

Rémi Bernon rbernon at codeweavers.com
Mon Feb 10 10:48:31 CST 2020


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntdll/tests/exception.c | 39 +++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 07e05e45c90..71bca51a31f 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -974,7 +974,8 @@ static void test_debugger(void)
     char cmdline[MAX_PATH];
     PROCESS_INFORMATION pi;
     STARTUPINFOA si = { 0 };
-    DEBUG_EVENT de;
+    DEBUG_EVENT de, de0, de1;
+    HANDLE thread;
     DWORD continuestatus;
     PVOID code_mem_address = NULL;
     NTSTATUS status;
@@ -1004,6 +1005,42 @@ static void test_debugger(void)
         ok(!ret, "ContinueDebugEvent unexpectedly succeeded\n");
         ok(GetLastError() == ERROR_INVALID_PARAMETER, "Unexpected last error: %u\n", GetLastError());
 
+        if (!ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_REPLY_LATER))
+            todo_wine win_skip("Skipping unsupported DBG_REPLY_LATER tests\n");
+        else
+        {
+            ok(WaitForDebugEvent(&de0, 50), "WaitForDebugEvent failed, last error:%u\n", GetLastError());
+            ok(de.dwDebugEventCode == de0.dwDebugEventCode, "delayed event differ, code:%x was:%x\n", de0.dwDebugEventCode, de.dwDebugEventCode);
+            ok(de.dwProcessId == de0.dwProcessId, "delayed event differ, pid:%x was:%x\n", de0.dwProcessId, de.dwProcessId);
+            ok(de.dwThreadId == de0.dwThreadId, "delayed event differ, tid:%x was:%x\n", de0.dwThreadId, de.dwThreadId);
+
+            if (de.dwDebugEventCode != CREATE_PROCESS_DEBUG_EVENT &&
+                de.dwDebugEventCode != CREATE_THREAD_DEBUG_EVENT &&
+                de.dwDebugEventCode != EXIT_THREAD_DEBUG_EVENT &&
+                de.dwDebugEventCode != EXIT_PROCESS_DEBUG_EVENT)
+            {
+                thread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, de.dwThreadId);
+                ok(thread != INVALID_HANDLE_VALUE, "OpenThread failed, last error:%u\n", GetLastError());
+
+                status = NtSuspendThread(thread, NULL);
+                ok(!status, "NtSuspendThread failed, last error:%u\n", GetLastError());
+
+                ok(ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_REPLY_LATER),
+                   "ContinueDebugEvent failed, last error:%u\n", GetLastError());
+
+                ok(!WaitForDebugEvent(&de1, 50), "WaitForDebugEvent succeeded.\n");
+                status = NtResumeThread(thread, NULL);
+
+                ok(!status, "NtResumeThread failed, last error:%u\n", GetLastError());
+                CloseHandle(thread);
+
+                ok(WaitForDebugEvent(&de1, 50), "WaitForDebugEvent failed, last error:%u\n", GetLastError());
+                ok(de.dwDebugEventCode == de1.dwDebugEventCode, "delayed event differ, code:%x was:%x\n", de1.dwDebugEventCode, de.dwDebugEventCode);
+                ok(de.dwProcessId == de1.dwProcessId, "delayed event differ, pid:%x was:%x\n", de1.dwProcessId, de.dwProcessId);
+                ok(de.dwThreadId == de1.dwThreadId, "delayed event differ, tid:%x was:%x\n", de1.dwThreadId, de.dwThreadId);
+            }
+        }
+
         if (de.dwThreadId != pi.dwThreadId)
         {
             trace("event %d not coming from main thread, ignoring\n", de.dwDebugEventCode);
-- 
2.25.0




More information about the wine-devel mailing list