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

Dmitry Timoshkov dmitry at baikal.ru
Thu Apr 11 04:16:07 CDT 2013


---
 dlls/kernel32/process.c      | 12 +++++++++++-
 dlls/kernel32/tests/loader.c |  3 ---
 server/process.c             | 13 ++++++++-----
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index 93c0267..399c44b 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -2593,7 +2593,15 @@ DWORD WINAPI LoadModule( LPCSTR name, LPVOID paramBlock )
  */
 BOOL WINAPI TerminateProcess( HANDLE handle, DWORD exit_code )
 {
-    NTSTATUS status = NtTerminateProcess( handle, exit_code );
+    NTSTATUS status;
+
+    if (!handle)
+    {
+        SetLastError( ERROR_INVALID_HANDLE );
+        return FALSE;
+    }
+
+    status = NtTerminateProcess( handle, exit_code );
     if (status) SetLastError( RtlNtStatusToDosError(status) );
     return !status;
 }
@@ -2622,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);
@@ -2631,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 521aafc..16c5179 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -1073,7 +1073,6 @@ 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);
-        todo_wine
             ok(code == 195, "expected thread exit code 195, got %u\n", code);
         }
         break;
@@ -1164,7 +1163,6 @@ static void child_process(const char *dll_name, DWORD target_offset)
     ok(GetLastError() == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     status = pNtTerminateProcess(0, 195);
-todo_wine
     ok(!status, "NtTerminateProcess error %#x\n", status);
 
     Sleep(100);
@@ -1174,7 +1172,6 @@ todo_wine
         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);
-todo_wine
         ok(code == 195, "expected thread exit code 195, got %u\n", code);
     }
 
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