[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