ntdll: empty APC queue before starting an application

Andrey Turkin andrey.turkin at gmail.com
Sat Aug 10 05:50:38 CDT 2013


---
 dlls/ntdll/loader.c   |  3 +++
 dlls/ntdll/ntdll.spec |  2 +-
 dlls/ntdll/sync.c     | 16 ++++++++++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index b3abad0..1eaa123 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2747,6 +2747,9 @@ void WINAPI LdrInitializeThunk( void *kernel_start, ULONG_PTR unknown2,
 
     virtual_release_address_space();
     virtual_clear_thread_stack();
+
+    NtTestAlert();
+
     wine_switch_to_stack( start_process, kernel_start, NtCurrentTeb()->Tib.StackBase );
 
 error:
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 6f592b4..a1195d4 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -358,7 +358,7 @@
 @ stdcall NtTerminateJobObject(long long)
 @ stdcall NtTerminateProcess(long long)
 @ stdcall NtTerminateThread(long long)
-@ stub NtTestAlert
+@ stdcall NtTestAlert()
 # @ stub NtTraceEvent
 # @ stub NtTranslateFilePath
 @ stdcall NtUnloadDriver(ptr)
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
index 58dde65..0950dba 100644
--- a/dlls/ntdll/sync.c
+++ b/dlls/ntdll/sync.c
@@ -1469,3 +1469,19 @@ VOID NTAPI RtlRunOnceInitialize(PRTL_RUN_ONCE initonce)
 {
     initonce->Ptr = NULL;
 }
+
+NTSTATUS WINAPI NtTestAlert()
+{
+    NTSTATUS status;
+
+    do {
+        LARGE_INTEGER timeout;
+        timeout.QuadPart = 0;
+        status = NTDLL_wait_for_multiple_objects( 0, NULL, SELECT_INTERRUPTIBLE | SELECT_ALERTABLE, &timeout, 0 );
+    } while (status == STATUS_USER_APC);
+
+    if (status == STATUS_TIMEOUT)
+        status = STATUS_SUCCESS;
+    return status;
+}
+
-- 
1.8.1.5





More information about the wine-patches mailing list