Zebediah Figura : ntdll/tests: Add basic tests for thread-id alert functions.

Alexandre Julliard julliard at winehq.org
Wed Nov 17 16:27:59 CST 2021


Module: wine
Branch: master
Commit: 6d19056a8cc3debd08d0a45fbd538c70d896bf11
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6d19056a8cc3debd08d0a45fbd538c70d896bf11

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Tue Nov 16 21:50:42 2021 -0600

ntdll/tests: Add basic tests for thread-id alert functions.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/sync.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)

diff --git a/dlls/ntdll/tests/sync.c b/dlls/ntdll/tests/sync.c
index f2499ea648a..f930767a8b0 100644
--- a/dlls/ntdll/tests/sync.c
+++ b/dlls/ntdll/tests/sync.c
@@ -26,6 +26,7 @@
 #include "winternl.h"
 #include "wine/test.h"
 
+static NTSTATUS (WINAPI *pNtAlertThreadByThreadId)( HANDLE );
 static NTSTATUS (WINAPI *pNtClose)( HANDLE );
 static NTSTATUS (WINAPI *pNtCreateEvent) ( PHANDLE, ACCESS_MASK, const OBJECT_ATTRIBUTES *, EVENT_TYPE, BOOLEAN);
 static NTSTATUS (WINAPI *pNtCreateKeyedEvent)( HANDLE *, ACCESS_MASK, const OBJECT_ATTRIBUTES *, ULONG );
@@ -43,6 +44,7 @@ static NTSTATUS (WINAPI *pNtReleaseMutant)( HANDLE, LONG * );
 static NTSTATUS (WINAPI *pNtReleaseSemaphore)( HANDLE, ULONG, ULONG * );
 static NTSTATUS (WINAPI *pNtResetEvent)( HANDLE, LONG * );
 static NTSTATUS (WINAPI *pNtSetEvent)( HANDLE, LONG * );
+static NTSTATUS (WINAPI *pNtWaitForAlertByThreadId)( void *, const LARGE_INTEGER * );
 static NTSTATUS (WINAPI *pNtWaitForKeyedEvent)( HANDLE, const void *, BOOLEAN, const LARGE_INTEGER * );
 static BOOLEAN  (WINAPI *pRtlAcquireResourceExclusive)( RTL_RWLOCK *, BOOLEAN );
 static BOOLEAN  (WINAPI *pRtlAcquireResourceShared)( RTL_RWLOCK *, BOOLEAN );
@@ -754,10 +756,98 @@ static void test_resource(void)
     pRtlDeleteResource(&resource);
 }
 
+static DWORD WINAPI tid_alert_thread( void *arg )
+{
+    NTSTATUS ret;
+
+    ret = pNtAlertThreadByThreadId( arg );
+    ok(!ret, "got %#x\n", ret);
+
+    ret = pNtWaitForAlertByThreadId( (void *)0x123, NULL );
+    ok(ret == STATUS_ALERTED, "got %#x\n", ret);
+
+    return 0;
+}
+
+static void test_tid_alert( char **argv )
+{
+    LARGE_INTEGER timeout = {{0}};
+    char cmdline[MAX_PATH];
+    STARTUPINFOA si = {0};
+    PROCESS_INFORMATION pi;
+    HANDLE thread;
+    NTSTATUS ret;
+    DWORD tid;
+
+    if (!pNtWaitForAlertByThreadId)
+    {
+        win_skip("NtWaitForAlertByThreadId is not available\n");
+        return;
+    }
+
+    ret = pNtWaitForAlertByThreadId( (void *)0x123, &timeout );
+    ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+    ret = pNtAlertThreadByThreadId( 0 );
+    ok(ret == STATUS_INVALID_CID, "got %#x\n", ret);
+
+    ret = pNtAlertThreadByThreadId( (HANDLE)0xdeadbeef );
+    ok(ret == STATUS_INVALID_CID, "got %#x\n", ret);
+
+    ret = pNtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)GetCurrentThreadId() );
+    ok(!ret, "got %#x\n", ret);
+
+    ret = pNtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)GetCurrentThreadId() );
+    ok(!ret, "got %#x\n", ret);
+
+    ret = pNtWaitForAlertByThreadId( (void *)0x123, &timeout );
+    ok(ret == STATUS_ALERTED, "got %#x\n", ret);
+
+    ret = pNtWaitForAlertByThreadId( (void *)0x123, &timeout );
+    ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+    ret = pNtWaitForAlertByThreadId( (void *)0x321, &timeout );
+    ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+    thread = CreateThread( NULL, 0, tid_alert_thread, (HANDLE)(DWORD_PTR)GetCurrentThreadId(), 0, &tid );
+    timeout.QuadPart = -1000 * 10000;
+    ret = pNtWaitForAlertByThreadId( (void *)0x123, &timeout );
+    ok(ret == STATUS_ALERTED, "got %#x\n", ret);
+
+    ret = WaitForSingleObject( thread, 100 );
+    ok(ret == WAIT_TIMEOUT, "got %d\n", ret);
+    ret = pNtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)tid );
+    ok(!ret, "got %#x\n", ret);
+
+    ret = WaitForSingleObject( thread, 1000 );
+    ok(!ret, "got %d\n", ret);
+
+    ret = pNtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)tid );
+    ok(!ret, "got %#x\n", ret);
+
+    CloseHandle(thread);
+
+    sprintf( cmdline, "%s %s subprocess", argv[0], argv[1] );
+    ret = CreateProcessA( NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+    ok(ret, "failed to create process, error %u\n", GetLastError());
+    ret = pNtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)pi.dwThreadId );
+    todo_wine ok(ret == STATUS_ACCESS_DENIED, "got %#x\n", ret);
+    ok(!WaitForSingleObject( pi.hProcess, 1000 ), "wait failed\n");
+    CloseHandle( pi.hProcess );
+    CloseHandle( pi.hThread );
+}
+
 START_TEST(sync)
 {
     HMODULE module = GetModuleHandleA("ntdll.dll");
+    char **argv;
+    int argc;
+
+    argc = winetest_get_mainargs( &argv );
+
+    if (argc > 2) return;
 
+    pNtAlertThreadByThreadId        = (void *)GetProcAddress(module, "NtAlertThreadByThreadId");
     pNtClose                        = (void *)GetProcAddress(module, "NtClose");
     pNtCreateEvent                  = (void *)GetProcAddress(module, "NtCreateEvent");
     pNtCreateKeyedEvent             = (void *)GetProcAddress(module, "NtCreateKeyedEvent");
@@ -775,6 +865,7 @@ START_TEST(sync)
     pNtReleaseSemaphore             = (void *)GetProcAddress(module, "NtReleaseSemaphore");
     pNtResetEvent                   = (void *)GetProcAddress(module, "NtResetEvent");
     pNtSetEvent                     = (void *)GetProcAddress(module, "NtSetEvent");
+    pNtWaitForAlertByThreadId       = (void *)GetProcAddress(module, "NtWaitForAlertByThreadId");
     pNtWaitForKeyedEvent            = (void *)GetProcAddress(module, "NtWaitForKeyedEvent");
     pRtlAcquireResourceExclusive    = (void *)GetProcAddress(module, "RtlAcquireResourceExclusive");
     pRtlAcquireResourceShared       = (void *)GetProcAddress(module, "RtlAcquireResourceShared");
@@ -792,4 +883,5 @@ START_TEST(sync)
     test_semaphore();
     test_keyed_events();
     test_resource();
+    test_tid_alert( argv );
 }




More information about the wine-cvs mailing list