[3/3] server: Add support for NtTerminateProcess(0). Resend.

Dmitry Timoshkov dmitry at baikal.ru
Fri Apr 12 04:02:08 CDT 2013


This patch fixes the problem reported in the bug 33331.
---
 dlls/kernel32/process.c      |  2 ++
 dlls/kernel32/tests/loader.c | 15 ++-------------
 server/process.c             | 13 ++++++++-----
 3 files changed, 12 insertions(+), 18 deletions(-)

diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index 7abb732..399c44b 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -2630,6 +2630,7 @@ __ASM_STDCALL_FUNC( ExitProcess, 4, /* Shrinker depend on this particular ExitPr
 
 void WINAPI process_ExitProcess( DWORD status )
 {
+    NtTerminateProcess(0, status);
     LdrShutdownProcess();
     NtTerminateProcess(GetCurrentProcess(), status);
     exit(status);
@@ -2639,6 +2640,7 @@ void WINAPI process_ExitProcess( DWORD status )
 
 void WINAPI ExitProcess( DWORD status )
 {
+    NtTerminateProcess(0, status);
     LdrShutdownProcess();
     NtTerminateProcess(GetCurrentProcess(), status);
     exit(status);
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index 61ec904..f707b26 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -1107,12 +1107,7 @@ static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
             ret = GetExitCodeThread(attached_thread[i], &code);
             trace("dll: GetExitCodeThread(%u) => %d,%u\n", i, ret, code);
             ok(ret == 1, "GetExitCodeThread returned %d, expected 1\n", ret);
-            /* FIXME: remove once Wine is fixed */
-            if (expected_code == STILL_ACTIVE || expected_code == 196)
-                ok(code == expected_code, "expected thread exit code %u, got %u\n", expected_code, code);
-            else
-            todo_wine
-                ok(code == expected_code, "expected thread exit code %u, got %u\n", expected_code, code);
+            ok(code == expected_code, "expected thread exit code %u, got %u\n", expected_code, code);
         }
 
         if (test_dll_phase == 2)
@@ -1232,7 +1227,6 @@ static void child_process(const char *dll_name, DWORD target_offset)
         ok(!ret, "RtlDllShutdownInProgress returned %d\n", ret);
 
         status = pNtTerminateProcess(0, 195);
-    todo_wine
         ok(!status, "NtTerminateProcess error %#x\n", status);
 
         ret = pRtlDllShutdownInProgress();
@@ -1285,12 +1279,7 @@ static void child_process(const char *dll_name, DWORD target_offset)
         ret = GetExitCodeThread(attached_thread[i], &code);
         trace("child: GetExitCodeThread(%u) => %d,%u\n", i, ret, code);
         ok(ret == 1, "GetExitCodeThread returned %d, expected 1\n", ret);
-        /* FIXME: remove once Wine is fixed */
-        if (expected_code == STILL_ACTIVE || expected_code == 196)
-            ok(code == expected_code, "expected thread exit code %u, got %u\n", expected_code, code);
-        else
-        todo_wine
-            ok(code == expected_code, "expected thread exit code %u, got %u\n", expected_code, code);
+        ok(code == expected_code, "expected thread exit code %u, got %u\n", expected_code, code);
     }
 
     *child_failures = winetest_get_failures();
diff --git a/server/process.c b/server/process.c
index 4f04a23..c4e358f 100644
--- a/server/process.c
+++ b/server/process.c
@@ -1080,14 +1080,17 @@ DECL_HANDLER(open_process)
 /* terminate a process */
 DECL_HANDLER(terminate_process)
 {
-    struct process *process;
+    struct process *process = NULL;
 
-    if ((process = get_process_from_handle( req->handle, PROCESS_TERMINATE )))
+    if (req->handle)
     {
-        reply->self = (current->process == process);
-        terminate_process( process, current, req->exit_code );
-        release_object( process );
+        process = get_process_from_handle( req->handle, PROCESS_TERMINATE );
+        if (!process) return;
     }
+
+    reply->self = (current->process == process);
+    terminate_process( process ? process : current->process, current, req->exit_code );
+    if (process) release_object( process );
 }
 
 /* fetch information about a process */
-- 
1.8.2.1




More information about the wine-patches mailing list