Module: wine Branch: master Commit: ae0f18544ed574d0b33478098c624f3d947638fb URL: https://gitlab.winehq.org/wine/wine/-/commit/ae0f18544ed574d0b33478098c624f3...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jul 11 15:46:27 2024 +0200
wow64: Add NtTerminateProcess CPU backend notifications.
---
dlls/ntdll/tests/wow64.c | 20 ++++++++++++++++++++ dlls/wow64/process.c | 7 ++++++- dlls/wow64/syscall.c | 2 ++ dlls/wow64/wow64_private.h | 1 + 4 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/tests/wow64.c b/dlls/ntdll/tests/wow64.c index 94420cdab4a..b8b1c11bb7d 100644 --- a/dlls/ntdll/tests/wow64.c +++ b/dlls/ntdll/tests/wow64.c @@ -1841,6 +1841,26 @@ static void test_notifications( HMODULE module, CROSS_PROCESS_WORK_LIST *list ) WriteProcessMemory( GetCurrentProcess(), ptr, old_code, sizeof(old_code), NULL ); }
+ if ((ptr = hook_notification_function( module, "BTCpuProcessTerm", "ProcessTerm" ))) + { + struct expected_notification expect[2] = + { + { 3, { 0, 0, 0 } }, + { 3, { 0, 1, 0 } } + }; + + reset_results( results ); + status = NtTerminateProcess( (HANDLE)0xdead, 0xbeef ); + ok( status == STATUS_INVALID_HANDLE, "NtTerminateProcess failed %lx\n", status ); + expect_notifications( results, 0, NULL ); + + status = NtTerminateProcess( 0, 0xbeef ); + ok( !status, "NtTerminateProcess failed %lx\n", status ); + expect_notifications( results, 2, expect ); + + WriteProcessMemory( GetCurrentProcess(), ptr, old_code, sizeof(old_code), NULL ); + } + NtClose( mapping ); NtClose( file ); VirtualFree( code, 0, MEM_RELEASE ); diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index 9b80d885b6a..d117c158096 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -1061,7 +1061,12 @@ NTSTATUS WINAPI wow64_NtTerminateProcess( UINT *args ) HANDLE handle = get_handle( &args ); LONG exit_code = get_ulong( &args );
- return NtTerminateProcess( handle, exit_code ); + NTSTATUS status; + + if (!handle && pBTCpuProcessTerm) pBTCpuProcessTerm( handle, FALSE, 0 ); + status = NtTerminateProcess( handle, exit_code ); + if (!handle && pBTCpuProcessTerm) pBTCpuProcessTerm( handle, TRUE, status ); + return status; }
diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 5ddd46ba7b9..55433f13569 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -115,6 +115,7 @@ void (WINAPI *pBTCpuNotifyReadFile)( HANDLE, void *, SIZE_T, BOOL, NTSTATUS void (WINAPI *pBTCpuNotifyUnmapViewOfSection)( void *, BOOL, NTSTATUS ) = NULL; NTSTATUS (WINAPI *pBTCpuResetToConsistentState)( EXCEPTION_POINTERS * ) = NULL; void (WINAPI *pBTCpuUpdateProcessorInformation)( SYSTEM_CPU_INFORMATION * ) = NULL; +void (WINAPI *pBTCpuProcessTerm)( HANDLE, BOOL, NTSTATUS ) = NULL; void (WINAPI *pBTCpuThreadTerm)( HANDLE, LONG ) = NULL;
BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved ) @@ -814,6 +815,7 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex GET_PTR( BTCpuNotifyReadFile ); GET_PTR( BTCpuNotifyUnmapViewOfSection ); GET_PTR( BTCpuUpdateProcessorInformation ); + GET_PTR( BTCpuProcessTerm ); GET_PTR( BTCpuThreadTerm ); GET_PTR( __wine_get_unix_opcode );
diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h index d5278443d5d..deca72d445c 100644 --- a/dlls/wow64/wow64_private.h +++ b/dlls/wow64/wow64_private.h @@ -49,6 +49,7 @@ extern void (WINAPI *pBTCpuNotifyMemoryProtect)( void *, SIZE_T, ULONG, BOOL extern void (WINAPI *pBTCpuNotifyReadFile)( HANDLE, void *, SIZE_T, BOOL, NTSTATUS ); extern void (WINAPI *pBTCpuNotifyUnmapViewOfSection)( void *, BOOL, NTSTATUS ); extern void (WINAPI *pBTCpuUpdateProcessorInformation)( SYSTEM_CPU_INFORMATION * ); +extern void (WINAPI *pBTCpuProcessTerm)( HANDLE, BOOL, NTSTATUS ); extern void (WINAPI *pBTCpuThreadTerm)( HANDLE, LONG );
struct object_attr64