[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