Alexandre Julliard : ntdll: Implement NtTestAlert().

Alexandre Julliard julliard at winehq.org
Tue May 25 16:08:15 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May 25 13:15:16 2021 +0200

ntdll: Implement NtTestAlert().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/sync.c      | 20 ++++++++++++++++++++
 dlls/ntdll/ntdll.spec           |  4 ++--
 dlls/ntdll/unix/server.c        | 14 ++++++++++++++
 dlls/ntdll/unix/signal_x86_64.c |  2 +-
 4 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c
index bde3e15fe26..827f4c53aa0 100644
--- a/dlls/kernel32/tests/sync.c
+++ b/dlls/kernel32/tests/sync.c
@@ -64,6 +64,7 @@ static PSLIST_ENTRY (__fastcall *pRtlInterlockedPushListSList)(PSLIST_HEADER lis
 static PSLIST_ENTRY (WINAPI *pRtlInterlockedPushListSListEx)(PSLIST_HEADER list, PSLIST_ENTRY first,
                                                              PSLIST_ENTRY last, ULONG count);
 static NTSTATUS (WINAPI *pNtQueueApcThread)(HANDLE,PNTAPCFUNC,ULONG_PTR,ULONG_PTR,ULONG_PTR);
+static NTSTATUS (WINAPI *pNtTestAlert)(void);
 
 #ifdef __i386__
 
@@ -2712,8 +2713,11 @@ static DWORD WINAPI thread_proc(LPVOID unused)
     return 0;
 }
 
+static int apc_count;
+
 static void CALLBACK user_apc(ULONG_PTR unused)
 {
+    apc_count++;
 }
 
 static void CALLBACK call_user_apc(ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3)
@@ -2726,6 +2730,7 @@ static void test_QueueUserAPC(void)
 {
     HANDLE thread;
     DWORD tid, ret;
+    NTSTATUS status;
 
     thread = CreateThread(NULL, 0, thread_proc, NULL, CREATE_SUSPENDED, &tid);
     ok(thread != NULL, "CreateThread error %u\n", GetLastError());
@@ -2748,15 +2753,29 @@ static void test_QueueUserAPC(void)
 
     CloseHandle(thread);
 
+    apc_count = 0;
     ret = QueueUserAPC(user_apc, GetCurrentThread(), 0);
     ok(ret, "QueueUserAPC failed err %u\n", GetLastError());
+    ok(!apc_count, "APC count %u\n", apc_count);
     ret = SleepEx( 100, TRUE );
     ok( ret == WAIT_IO_COMPLETION, "SleepEx returned %u\n", ret);
+    ok(apc_count == 1, "APC count %u\n", apc_count);
 
     ret = pNtQueueApcThread( GetCurrentThread(), NULL, 0, 0, 0 );
     ok( !ret, "got %#x\n", ret);
     ret = SleepEx( 100, TRUE );
     ok( ret == WAIT_OBJECT_0, "SleepEx returned %u\n", ret);
+
+    apc_count = 0;
+    ret = QueueUserAPC(user_apc, GetCurrentThread(), 0);
+    ok(ret, "QueueUserAPC failed err %u\n", GetLastError());
+    ok(!apc_count, "APC count %u\n", apc_count);
+    status = pNtTestAlert();
+    ok(!status, "got %x\n", status);
+    ok(apc_count == 1, "APC count %u\n", apc_count);
+    status = pNtTestAlert();
+    ok(!status, "got %x\n", status);
+    ok(apc_count == 1, "APC count %u\n", apc_count);
 }
 
 START_TEST(sync)
@@ -2790,6 +2809,7 @@ START_TEST(sync)
     pRtlInterlockedPushListSList = (void *)GetProcAddress(hntdll, "RtlInterlockedPushListSList");
     pRtlInterlockedPushListSListEx = (void *)GetProcAddress(hntdll, "RtlInterlockedPushListSListEx");
     pNtQueueApcThread = (void *)GetProcAddress(hntdll, "NtQueueApcThread");
+    pNtTestAlert = (void *)GetProcAddress(hntdll, "NtTestAlert");
 
     argc = winetest_get_mainargs( &argv );
     if (argc >= 3)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 4eb7aec1aa5..c092e7a9d78 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -412,7 +412,7 @@
 @ stdcall -syscall NtTerminateJobObject(long long)
 @ stdcall -syscall NtTerminateProcess(long long)
 @ stdcall -syscall NtTerminateThread(long long)
-@ stub NtTestAlert
+@ stdcall -syscall NtTestAlert()
 # @ stub NtTraceEvent
 # @ stub NtTranslateFilePath
 @ stdcall -syscall NtUnloadDriver(ptr)
@@ -1425,7 +1425,7 @@
 @ stdcall -private -syscall ZwTerminateJobObject(long long) NtTerminateJobObject
 @ stdcall -private -syscall ZwTerminateProcess(long long) NtTerminateProcess
 @ stdcall -private -syscall ZwTerminateThread(long long) NtTerminateThread
-@ stub ZwTestAlert
+@ stdcall -private -syscall ZwTestAlert() NtTestAlert
 # @ stub ZwTraceEvent
 # @ stub ZwTranslateFilePath
 @ stdcall -private -syscall ZwUnloadDriver(ptr) NtUnloadDriver
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index e30f2dd683d..c0cf13b3cb4 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -720,6 +720,20 @@ NTSTATUS WINAPI NtContinue( CONTEXT *context, BOOLEAN alertable )
 }
 
 
+/***********************************************************************
+ *              NtTestAlert  (NTDLL.@)
+ */
+NTSTATUS WINAPI NtTestAlert(void)
+{
+    user_apc_t apc;
+    NTSTATUS status;
+
+    status = server_select( NULL, 0, SELECT_INTERRUPTIBLE | SELECT_ALERTABLE, 0, NULL, NULL, &apc );
+    if (status == STATUS_USER_APC) invoke_user_apc( NULL, &apc, STATUS_SUCCESS );
+    return STATUS_SUCCESS;
+}
+
+
 /***********************************************************************
  *           server_queue_process_apc
  */
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 5897e793b3e..0b7dde1b931 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -1973,7 +1973,7 @@ static void setup_exception( ucontext_t *sigcontext, EXCEPTION_RECORD *rec )
  */
 struct apc_stack_layout * WINAPI setup_user_apc_dispatcher_stack( CONTEXT *context,
                                                                   struct apc_stack_layout *stack,
-                                                                  NSTATUS status )
+                                                                  NTSTATUS status )
 {
     CONTEXT c;
 




More information about the wine-cvs mailing list