From 5f641e2a2594fc222d8fd3750b4223eb76faa447 Mon Sep 17 00:00:00 2001 From: Benjamin Oldenburg Date: Fri, 20 Mar 2026 17:04:58 +0700 Subject: [PATCH] winnt.h: fix ARM64 CONTEXT struct layout mismatch The fallback CONTEXT struct for ARM64 had multiple structural issues: - ContextFlags was DWORD64 (8 bytes) instead of ULONG (4 bytes) - Missing Cpsr field entirely - Missing DECLSPEC_ALIGN(16) attribute - X registers as simple array X[29] instead of union with named struct X[31] These mismatches caused incorrect struct size and field offsets, leading to register corruption when used with Windows APIs like GetThreadContext or RtlRestoreContext. The fallback struct now matches the official ARM64_NT_CONTEXT layout exactly, ensuring binary compatibility with Windows ARM64 system calls. --- win32/include/winapi/winnt.h | 44 ++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/win32/include/winapi/winnt.h b/win32/include/winapi/winnt.h index 37d55483..e4714f62 100644 --- a/win32/include/winapi/winnt.h +++ b/win32/include/winapi/winnt.h @@ -2072,11 +2072,45 @@ typedef DWORD LCID; #if defined(__aarch64__) && !defined(_ARM64_CONTEXT_DECLARED) #define _ARM64_CONTEXT_DECLARED - typedef struct _CONTEXT { - DWORD64 ContextFlags; - DWORD64 X[29]; - DWORD64 Fp; - DWORD64 Lr; + typedef struct DECLSPEC_ALIGN(16) _CONTEXT { + ULONG ContextFlags; + ULONG Cpsr; + union { + struct { + DWORD64 X0; + DWORD64 X1; + DWORD64 X2; + DWORD64 X3; + DWORD64 X4; + DWORD64 X5; + DWORD64 X6; + DWORD64 X7; + DWORD64 X8; + DWORD64 X9; + DWORD64 X10; + DWORD64 X11; + DWORD64 X12; + DWORD64 X13; + DWORD64 X14; + DWORD64 X15; + DWORD64 X16; + DWORD64 X17; + DWORD64 X18; + DWORD64 X19; + DWORD64 X20; + DWORD64 X21; + DWORD64 X22; + DWORD64 X23; + DWORD64 X24; + DWORD64 X25; + DWORD64 X26; + DWORD64 X27; + DWORD64 X28; + DWORD64 Fp; + DWORD64 Lr; + } DUMMYSTRUCTNAME; + DWORD64 X[31]; + } DUMMYUNIONNAME; DWORD64 Sp; DWORD64 Pc; ARM64_NT_NEON128 V[32];