From 960fb0ff5b1ef8b26c5240b102ba6ec68a098e57 Mon Sep 17 00:00:00 2001 From: Utkarsh Dalal Date: Fri, 24 Apr 2026 20:46:32 +0530 Subject: [PATCH 1/3] added ntdll patches to avoid crashes on arm64ec wine --- android/patches/dlls_ntdll_loader_c.patch | 43 ++++++++++++++++++++-- android/patches/dlls_wow64_syscall_c.patch | 34 +++++++++++++++-- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/android/patches/dlls_ntdll_loader_c.patch b/android/patches/dlls_ntdll_loader_c.patch index fe8e4ef7f5ff..3663c03cd74b 100644 --- a/android/patches/dlls_ntdll_loader_c.patch +++ b/android/patches/dlls_ntdll_loader_c.patch @@ -1,8 +1,20 @@ diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c -index bc71fe0..ef39f34 100644 +index bc71fe0..b5d0539 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c -@@ -4429,7 +4429,7 @@ static void load_arm64ec_module(void) +@@ -4089,6 +4089,11 @@ void WINAPI LdrShutdownThread(void) + /* don't do any detach calls if process is exiting */ + if (process_detaching) return; + ++ if (NtCurrentTeb()->SkipThreadAttach) { ++ heap_thread_detach(); ++ return; ++ } ++ + RtlProcessFlsData( NtCurrentTeb()->FlsSlots, 1 ); + + RtlEnterCriticalSection( &loader_section ); +@@ -4429,7 +4434,7 @@ static void load_arm64ec_module(void) ULONG buffer[16]; KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer; UNICODE_STRING nameW = RTL_CONSTANT_STRING( L"\\Registry\\Machine\\Software\\Microsoft\\Wow64\\amd64" ); @@ -11,7 +23,7 @@ index bc71fe0..ef39f34 100644 OBJECT_ATTRIBUTES attr; WINE_MODREF *wm; NTSTATUS status; -@@ -4479,6 +4479,7 @@ static void build_wow64_main_module(void) +@@ -4479,6 +4484,7 @@ static void build_wow64_main_module(void) static void (WINAPI *pWow64LdrpInitialize)( CONTEXT *ctx ); void (WINAPI *pWow64PrepareForException)( EXCEPTION_RECORD *rec, CONTEXT *context ) = NULL; @@ -19,7 +31,7 @@ index bc71fe0..ef39f34 100644 static void init_wow64( CONTEXT *context ) { -@@ -4503,6 +4504,7 @@ static void init_wow64( CONTEXT *context ) +@@ -4503,6 +4509,7 @@ static void init_wow64( CONTEXT *context ) GET_PTR( Wow64LdrpInitialize ); GET_PTR( Wow64PrepareForException ); @@ -27,3 +39,26 @@ index bc71fe0..ef39f34 100644 #undef GET_PTR imports_fixup_done = TRUE; } +@@ -4598,6 +4605,8 @@ void loader_init( CONTEXT *context, void **entry ) + + if (process_detaching) NtTerminateThread( GetCurrentThread(), 0 ); + ++ if (NtCurrentTeb()->SkipLoaderInit) return; ++ + RtlEnterCriticalSection( &loader_section ); + + if (!imports_fixup_done) +@@ -4701,6 +4710,13 @@ void loader_init( CONTEXT *context, void **entry ) + #ifdef __arm64ec__ + arm64ec_thread_init(); + #endif ++ ++ if (NtCurrentTeb()->SkipThreadAttach) ++ { ++ RtlLeaveCriticalSection( &loader_section ); ++ return; ++ } ++ + wm = get_modref( NtCurrentTeb()->Peb->ImageBaseAddress ); + } + diff --git a/android/patches/dlls_wow64_syscall_c.patch b/android/patches/dlls_wow64_syscall_c.patch index 62d8d01c4bfd..5958471fe2d9 100644 --- a/android/patches/dlls_wow64_syscall_c.patch +++ b/android/patches/dlls_wow64_syscall_c.patch @@ -1,8 +1,16 @@ diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c -index d2a977e..fddd3c6 100644 +index d2a977e..dde24d8 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c -@@ -726,6 +726,29 @@ static HMODULE load_64bit_module( const WCHAR *name ) +@@ -102,6 +102,7 @@ static void (WINAPI *pBTCpuProcessInit)(void); + static NTSTATUS (WINAPI *pBTCpuSetContext)(HANDLE,HANDLE,void *,void *); + static void (WINAPI *pBTCpuThreadInit)(void); + static void (WINAPI *pBTCpuSimulate)(void) __attribute__((used)); ++static NTSTATUS (WINAPI *pBTCpuSuspendLocalThread)(HANDLE,ULONG *); + static void * (WINAPI *p__wine_get_unix_opcode)(void); + static void * (WINAPI *pKiRaiseUserExceptionDispatcher)(void); + void (WINAPI *pBTCpuFlushInstructionCache2)( const void *, SIZE_T ) = NULL; +@@ -726,6 +727,29 @@ static HMODULE load_64bit_module( const WCHAR *name ) return module; } @@ -32,7 +40,7 @@ index d2a977e..fddd3c6 100644 /********************************************************************** * get_cpu_dll_name -@@ -740,11 +763,17 @@ static const WCHAR *get_cpu_dll_name(void) +@@ -740,11 +764,17 @@ static const WCHAR *get_cpu_dll_name(void) HANDLE key; ULONG size; @@ -51,3 +59,23 @@ index d2a977e..fddd3c6 100644 break; case IMAGE_FILE_MACHINE_ARMNT: RtlInitUnicodeString( &nameW, L"\\Registry\\Machine\\Software\\Microsoft\\Wow64\\arm" ); +@@ -839,6 +869,7 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex + GET_PTR( BTCpuProcessInit ); + GET_PTR( BTCpuThreadInit ); + GET_PTR( BTCpuResetToConsistentState ); ++ GET_PTR( BTCpuSuspendLocalThread ); + GET_PTR( BTCpuSetContext ); + GET_PTR( BTCpuSimulate ); + GET_PTR( BTCpuFlushInstructionCache2 ); +@@ -1525,3 +1556,11 @@ NTSTATUS WINAPI Wow64RaiseException( int code, EXCEPTION_RECORD *rec ) + + return STATUS_SUCCESS; + } ++ ++/********************************************************************** ++ * Wow64SuspendLocalThread (wow64.@) ++ */ ++NTSTATUS WINAPI Wow64SuspendLocalThread( HANDLE thread, ULONG *count ) ++{ ++ return pBTCpuSuspendLocalThread( thread, count ); ++} From 285cb8951f8f4c2ecd580a5aad4488e1f37627b7 Mon Sep 17 00:00:00 2001 From: Utkarsh Dalal Date: Fri, 24 Apr 2026 21:18:34 +0530 Subject: [PATCH 2/3] removed duplicated function from patch --- android/patches/dlls_wow64_syscall_c.patch | 32 ++-------------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/android/patches/dlls_wow64_syscall_c.patch b/android/patches/dlls_wow64_syscall_c.patch index 5958471fe2d9..c679c30a7eb6 100644 --- a/android/patches/dlls_wow64_syscall_c.patch +++ b/android/patches/dlls_wow64_syscall_c.patch @@ -2,15 +2,7 @@ diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index d2a977e..dde24d8 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c -@@ -102,6 +102,7 @@ static void (WINAPI *pBTCpuProcessInit)(void); - static NTSTATUS (WINAPI *pBTCpuSetContext)(HANDLE,HANDLE,void *,void *); - static void (WINAPI *pBTCpuThreadInit)(void); - static void (WINAPI *pBTCpuSimulate)(void) __attribute__((used)); -+static NTSTATUS (WINAPI *pBTCpuSuspendLocalThread)(HANDLE,ULONG *); - static void * (WINAPI *p__wine_get_unix_opcode)(void); - static void * (WINAPI *pKiRaiseUserExceptionDispatcher)(void); - void (WINAPI *pBTCpuFlushInstructionCache2)( const void *, SIZE_T ) = NULL; -@@ -726,6 +727,29 @@ static HMODULE load_64bit_module( const WCHAR *name ) +@@ -726,6 +726,29 @@ static HMODULE load_64bit_module( const WCHAR *name ) return module; } @@ -40,7 +32,7 @@ index d2a977e..dde24d8 100644 /********************************************************************** * get_cpu_dll_name -@@ -740,11 +764,17 @@ static const WCHAR *get_cpu_dll_name(void) +@@ -740,11 +763,17 @@ static const WCHAR *get_cpu_dll_name(void) HANDLE key; ULONG size; @@ -59,23 +51,3 @@ index d2a977e..dde24d8 100644 break; case IMAGE_FILE_MACHINE_ARMNT: RtlInitUnicodeString( &nameW, L"\\Registry\\Machine\\Software\\Microsoft\\Wow64\\arm" ); -@@ -839,6 +869,7 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex - GET_PTR( BTCpuProcessInit ); - GET_PTR( BTCpuThreadInit ); - GET_PTR( BTCpuResetToConsistentState ); -+ GET_PTR( BTCpuSuspendLocalThread ); - GET_PTR( BTCpuSetContext ); - GET_PTR( BTCpuSimulate ); - GET_PTR( BTCpuFlushInstructionCache2 ); -@@ -1525,3 +1556,11 @@ NTSTATUS WINAPI Wow64RaiseException( int code, EXCEPTION_RECORD *rec ) - - return STATUS_SUCCESS; - } -+ -+/********************************************************************** -+ * Wow64SuspendLocalThread (wow64.@) -+ */ -+NTSTATUS WINAPI Wow64SuspendLocalThread( HANDLE thread, ULONG *count ) -+{ -+ return pBTCpuSuspendLocalThread( thread, count ); -+} From 4f1adc72ef1c11d975e619795053ce5502dd16d0 Mon Sep 17 00:00:00 2001 From: Utkarsh Dalal Date: Sat, 25 Apr 2026 00:02:57 +0530 Subject: [PATCH 3/3] added back wow64 syscall patch --- android/patches/dlls_wow64_syscall_c.patch | 32 +++++++++++++++++-- .../test-bylaws/dlls_wow64_process_c.patch | 15 --------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/android/patches/dlls_wow64_syscall_c.patch b/android/patches/dlls_wow64_syscall_c.patch index c679c30a7eb6..5958471fe2d9 100644 --- a/android/patches/dlls_wow64_syscall_c.patch +++ b/android/patches/dlls_wow64_syscall_c.patch @@ -2,7 +2,15 @@ diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index d2a977e..dde24d8 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c -@@ -726,6 +726,29 @@ static HMODULE load_64bit_module( const WCHAR *name ) +@@ -102,6 +102,7 @@ static void (WINAPI *pBTCpuProcessInit)(void); + static NTSTATUS (WINAPI *pBTCpuSetContext)(HANDLE,HANDLE,void *,void *); + static void (WINAPI *pBTCpuThreadInit)(void); + static void (WINAPI *pBTCpuSimulate)(void) __attribute__((used)); ++static NTSTATUS (WINAPI *pBTCpuSuspendLocalThread)(HANDLE,ULONG *); + static void * (WINAPI *p__wine_get_unix_opcode)(void); + static void * (WINAPI *pKiRaiseUserExceptionDispatcher)(void); + void (WINAPI *pBTCpuFlushInstructionCache2)( const void *, SIZE_T ) = NULL; +@@ -726,6 +727,29 @@ static HMODULE load_64bit_module( const WCHAR *name ) return module; } @@ -32,7 +40,7 @@ index d2a977e..dde24d8 100644 /********************************************************************** * get_cpu_dll_name -@@ -740,11 +763,17 @@ static const WCHAR *get_cpu_dll_name(void) +@@ -740,11 +764,17 @@ static const WCHAR *get_cpu_dll_name(void) HANDLE key; ULONG size; @@ -51,3 +59,23 @@ index d2a977e..dde24d8 100644 break; case IMAGE_FILE_MACHINE_ARMNT: RtlInitUnicodeString( &nameW, L"\\Registry\\Machine\\Software\\Microsoft\\Wow64\\arm" ); +@@ -839,6 +869,7 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex + GET_PTR( BTCpuProcessInit ); + GET_PTR( BTCpuThreadInit ); + GET_PTR( BTCpuResetToConsistentState ); ++ GET_PTR( BTCpuSuspendLocalThread ); + GET_PTR( BTCpuSetContext ); + GET_PTR( BTCpuSimulate ); + GET_PTR( BTCpuFlushInstructionCache2 ); +@@ -1525,3 +1556,11 @@ NTSTATUS WINAPI Wow64RaiseException( int code, EXCEPTION_RECORD *rec ) + + return STATUS_SUCCESS; + } ++ ++/********************************************************************** ++ * Wow64SuspendLocalThread (wow64.@) ++ */ ++NTSTATUS WINAPI Wow64SuspendLocalThread( HANDLE thread, ULONG *count ) ++{ ++ return pBTCpuSuspendLocalThread( thread, count ); ++} diff --git a/android/patches/test-bylaws/dlls_wow64_process_c.patch b/android/patches/test-bylaws/dlls_wow64_process_c.patch index 185d4371e483..4ae6e6c4835d 100644 --- a/android/patches/test-bylaws/dlls_wow64_process_c.patch +++ b/android/patches/test-bylaws/dlls_wow64_process_c.patch @@ -9,18 +9,3 @@ index 269843a..85a5006 100644 - return NtSuspendThread( handle, count ); + return RtlWow64SuspendThread( handle, count ); } - - -@@ -1146,3 +1146,12 @@ NTSTATUS WINAPI wow64_NtWow64QueryInformationProcess64( UINT *args ) - return STATUS_NOT_IMPLEMENTED; - } - } -+ -+ -+/********************************************************************** -+ * Wow64SuspendLocalThread (wow64.@) -+ */ -+NTSTATUS WINAPI Wow64SuspendLocalThread( HANDLE thread, ULONG *count ) -+{ -+ return NtSuspendThread( thread, count ); -+}