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