widl: Update to Wine 6.12

This allows picking up the target CPU from a tool name prefix,
and allows using -m32/-m64 on arm/aarch64.

Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-tools/widl/VERSION b/mingw-w64-tools/widl/VERSION
index 2e75a15..01f38bd 100644
--- a/mingw-w64-tools/widl/VERSION
+++ b/mingw-w64-tools/widl/VERSION
@@ -1 +1 @@
-WIDL version 6.4
+WIDL version 6.12
diff --git a/mingw-w64-tools/widl/configure b/mingw-w64-tools/widl/configure
index 75cf93f..7be7336 100755
--- a/mingw-w64-tools/widl/configure
+++ b/mingw-w64-tools/widl/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for widl 6.4.
+# Generated by GNU Autoconf 2.71 for widl 6.12.
 #
 # Report bugs to <mingw-w64-public@lists.sourceforge.net>.
 #
@@ -610,8 +610,8 @@
 # Identity of this package.
 PACKAGE_NAME='widl'
 PACKAGE_TARNAME='widl'
-PACKAGE_VERSION='6.4'
-PACKAGE_STRING='widl 6.4'
+PACKAGE_VERSION='6.12'
+PACKAGE_STRING='widl 6.12'
 PACKAGE_BUGREPORT='mingw-w64-public@lists.sourceforge.net'
 PACKAGE_URL=''
 
@@ -1316,7 +1316,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures widl 6.4 to adapt to many kinds of systems.
+\`configure' configures widl 6.12 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1388,7 +1388,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of widl 6.4:";;
+     short | recursive ) echo "Configuration of widl 6.12:";;
    esac
   cat <<\_ACEOF
 
@@ -1490,7 +1490,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-widl configure 6.4
+widl configure 6.12
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1902,7 +1902,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by widl $as_me 6.4, which was
+It was created by widl $as_me 6.12, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3293,7 +3293,7 @@
 
 # Define the identity of the package.
  PACKAGE='widl'
- VERSION='6.4'
+ VERSION='6.12'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -5767,7 +5767,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by widl $as_me 6.4, which was
+This file was extended by widl $as_me 6.12, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5835,7 +5835,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-widl config.status 6.4
+widl config.status 6.12
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/mingw-w64-tools/widl/include/winbase.h b/mingw-w64-tools/widl/include/winbase.h
index 651da6d..2928385 100644
--- a/mingw-w64-tools/widl/include/winbase.h
+++ b/mingw-w64-tools/widl/include/winbase.h
@@ -679,6 +679,7 @@
 #define PROFILE_USER                      0x10000000
 #define PROFILE_KERNEL                    0x20000000
 #define PROFILE_SERVER                    0x40000000
+#define CREATE_IGNORE_SYSTEM_DEFAULT      0x80000000
 
 #define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000
 
@@ -2274,6 +2275,7 @@
 WINBASEAPI VOID        WINAPI GetStartupInfoW(LPSTARTUPINFOW);
 #define                       GetStartupInfo WINELIB_NAME_AW(GetStartupInfo)
 WINBASEAPI HANDLE      WINAPI GetStdHandle(DWORD);
+WINBASEAPI BOOL        WINAPI GetSystemCpuSetInformation(SYSTEM_CPU_SET_INFORMATION*,ULONG,ULONG*,HANDLE,ULONG);
 WINBASEAPI UINT        WINAPI GetSystemDirectoryA(LPSTR,UINT);
 WINBASEAPI UINT        WINAPI GetSystemDirectoryW(LPWSTR,UINT);
 #define                       GetSystemDirectory WINELIB_NAME_AW(GetSystemDirectory)
@@ -2747,6 +2749,7 @@
 WINBASEAPI LPVOID      WINAPI VirtualAlloc2(HANDLE,LPVOID,SIZE_T,DWORD,DWORD,MEM_EXTENDED_PARAMETER*,ULONG);
 WINBASEAPI LPVOID      WINAPI VirtualAllocEx(HANDLE,LPVOID,SIZE_T,DWORD,DWORD);
 WINBASEAPI LPVOID      WINAPI VirtualAllocExNuma(HANDLE,void*,SIZE_T,DWORD,DWORD,DWORD);
+WINBASEAPI LPVOID      WINAPI VirtualAllocFromApp(LPVOID,SIZE_T,DWORD,DWORD);
 WINBASEAPI BOOL        WINAPI VirtualFree(LPVOID,SIZE_T,DWORD);
 WINBASEAPI BOOL        WINAPI VirtualFreeEx(HANDLE,LPVOID,SIZE_T,DWORD);
 WINBASEAPI BOOL        WINAPI VirtualLock(LPVOID,SIZE_T);
@@ -2885,9 +2888,11 @@
     return strcat( dst, src );
 }
 
-/* strncpy doesn't do what you think, don't use it */
+/* strncpy/wcsncpy don't do what you think, don't use them */
 #undef strncpy
+#undef wcsncpy
 #define strncpy(d,s,n) error do_not_use_strncpy_use_lstrcpynA_or_memcpy_instead
+#define wcsncpy(d,s,n) error do_not_use_wcsncpy_use_lstrcpynW_or_memcpy_instead
 
 #endif /* !defined(__WINESRC__) || defined(WINE_NO_INLINE_STRING) */
 
diff --git a/mingw-w64-tools/widl/include/winerror.h b/mingw-w64-tools/widl/include/winerror.h
index 86f7aac..f22b24f 100644
--- a/mingw-w64-tools/widl/include/winerror.h
+++ b/mingw-w64-tools/widl/include/winerror.h
@@ -410,6 +410,7 @@
 #define ERROR_THREAD_MODE_NOT_BACKGROUND                   401
 #define ERROR_PROCESS_MODE_ALREADY_BACKGROUND              402
 #define ERROR_PROCESS_MODE_NOT_BACKGROUND                  403
+#define ERROR_NO_SUCH_DEVICE                               433
 #define ERROR_PNP_QUERY_REMOVE_DEVICE_TIMEOUT              480
 #define ERROR_PNP_QUERY_REMOVE_RELATED_DEVICE_TIMEOUT      481
 #define ERROR_PNP_QUERY_REMOVE_UNRELATED_DEVICE_TIMEOUT    482
@@ -3638,6 +3639,29 @@
 #define DWM_E_ADAPTER_NOT_FOUND                            _HRESULT_TYPEDEF_(0x80263005)
 #define DWM_S_GDI_REDIRECTION_SURFACE                      _HRESULT_TYPEDEF_(0x00263005)
 
+#define TBS_E_INTERNAL_ERROR                               _HRESULT_TYPEDEF_(0x80284001)
+#define TBS_E_BAD_PARAMETER                                _HRESULT_TYPEDEF_(0x80284002)
+#define TBS_E_INVALID_OUTPUT_POINTER                       _HRESULT_TYPEDEF_(0x80284003)
+#define TBS_E_INVALID_CONTEXT                              _HRESULT_TYPEDEF_(0x80284004)
+#define TBS_E_INSUFFICIENT_BUFFER                          _HRESULT_TYPEDEF_(0x80284005)
+#define TBS_E_IOERROR                                      _HRESULT_TYPEDEF_(0x80284006)
+#define TBS_E_INVALID_CONTEXT_PARAM                        _HRESULT_TYPEDEF_(0x80284007)
+#define TBS_E_SERVICE_NOT_RUNNING                          _HRESULT_TYPEDEF_(0x80284008)
+#define TBS_E_TOO_MANY_TBS_CONTEXTS                        _HRESULT_TYPEDEF_(0x80284009)
+#define TBS_E_TOO_MANY_RESOURCES                           _HRESULT_TYPEDEF_(0x8028400a)
+#define TBS_E_SERVICE_START_PENDING                        _HRESULT_TYPEDEF_(0x8028400b)
+#define TBS_E_PPI_NOT_SUPPORTED                            _HRESULT_TYPEDEF_(0x8028400c)
+#define TBS_E_COMMAND_CANCELED                             _HRESULT_TYPEDEF_(0x8028400d)
+#define TBS_E_BUFFER_TOO_LARGE                             _HRESULT_TYPEDEF_(0x8028400e)
+#define TBS_E_TPM_NOT_FOUND                                _HRESULT_TYPEDEF_(0x8028400f)
+#define TBS_E_SERVICE_DISABLED                             _HRESULT_TYPEDEF_(0x80284010)
+#define TBS_E_NO_EVENT_LOG                                 _HRESULT_TYPEDEF_(0x80284011)
+#define TBS_E_ACCESS_DENIED                                _HRESULT_TYPEDEF_(0x80284012)
+#define TBS_E_PROVISIONING_NOT_ALLOWED                     _HRESULT_TYPEDEF_(0x80284013)
+#define TBS_E_PPI_FUNCTION_UNSUPPORTED                     _HRESULT_TYPEDEF_(0x80284014)
+#define TBS_E_OWNERAUTH_NOT_FOUND                          _HRESULT_TYPEDEF_(0x80284015)
+#define TBS_E_PROVISIONING_INCOMPLETE                      _HRESULT_TYPEDEF_(0x80284016)
+
 #define UI_E_CREATE_FAILED                                 _HRESULT_TYPEDEF_(0x802a0001)
 #define UI_E_SHUTDOWN_CALLED                               _HRESULT_TYPEDEF_(0x802a0002)
 #define UI_E_ILLEGAL_REENTRANCY                            _HRESULT_TYPEDEF_(0x802a0003)
diff --git a/mingw-w64-tools/widl/include/winnt.h b/mingw-w64-tools/widl/include/winnt.h
index 9025e96..b83f588 100644
--- a/mingw-w64-tools/widl/include/winnt.h
+++ b/mingw-w64-tools/widl/include/winnt.h
@@ -291,7 +291,7 @@
 #undef __C89_NAMELESSUNIONNAME7
 #undef __C89_NAMELESSUNIONNAME8
 
-#if !defined(__WINESRC__) && !defined(WINE_NO_NAMELESS_EXTENSION)
+#if !defined(WINE_NO_NAMELESS_EXTENSION)
 # ifdef __GNUC__
    /* Anonymous structs support starts with gcc 2.96/g++ 2.95 */
 #  if (__GNUC__ > 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ > 95) || ((__GNUC_MINOR__ == 95) && defined(__cplusplus))))
@@ -369,7 +369,7 @@
 
 /* Alignment macros */
 
-#if defined(_WIN64) || (defined(_MSC_VER) && defined(_M_ALPHA)) || defined(__alpha__)
+#ifdef _WIN64
 #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
 #define MEMORY_ALLOCATION_ALIGNMENT 16
 #else
@@ -977,22 +977,13 @@
 
 #include <excpt.h>
 
-struct _CONTEXT;
-struct _EXCEPTION_POINTERS;
-struct _EXCEPTION_RECORD;
-
-typedef EXCEPTION_DISPOSITION WINAPI EXCEPTION_ROUTINE(struct _EXCEPTION_RECORD*,PVOID,
-                                                       struct _CONTEXT*,PVOID);
-typedef EXCEPTION_ROUTINE *PEXCEPTION_ROUTINE;
-
 /* The Win32 register context */
 
 /* i386 context definitions */
-#ifdef __i386__
 
-#define SIZE_OF_80387_REGISTERS      80
+#define I386_SIZE_OF_80387_REGISTERS      80
 
-typedef struct _FLOATING_SAVE_AREA
+typedef struct _I386_FLOATING_SAVE_AREA
 {
     DWORD   ControlWord;
     DWORD   StatusWord;
@@ -1001,13 +992,14 @@
     DWORD   ErrorSelector;
     DWORD   DataOffset;
     DWORD   DataSelector;
-    BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
+    BYTE    RegisterArea[I386_SIZE_OF_80387_REGISTERS];
     DWORD   Cr0NpxState;
-} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
+} I386_FLOATING_SAVE_AREA, WOW64_FLOATING_SAVE_AREA, *PWOW64_FLOATING_SAVE_AREA;
 
-#define MAXIMUM_SUPPORTED_EXTENSION     512
+#define I386_MAXIMUM_SUPPORTED_EXTENSION     512
 
-typedef struct _CONTEXT
+#include "pshpack4.h"
+typedef struct _I386_CONTEXT
 {
     DWORD   ContextFlags;  /* 000 */
 
@@ -1020,7 +1012,7 @@
     DWORD   Dr7;           /* 018 */
 
     /* These are selected by CONTEXT_FLOATING_POINT */
-    FLOATING_SAVE_AREA FloatSave; /* 01c */
+    I386_FLOATING_SAVE_AREA FloatSave; /* 01c */
 
     /* These are selected by CONTEXT_SEGMENTS */
     DWORD   SegGs;         /* 08c */
@@ -1044,27 +1036,39 @@
     DWORD   Esp;           /* 0c4 */
     DWORD   SegSs;         /* 0c8 */
 
-    BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];  /* 0xcc */
-} CONTEXT, *PCONTEXT;
+    BYTE    ExtendedRegisters[I386_MAXIMUM_SUPPORTED_EXTENSION];  /* 0xcc */
+} I386_CONTEXT, WOW64_CONTEXT, *PWOW64_CONTEXT;
+#include "poppack.h"
 
-#define CONTEXT_X86       0x00010000
-#define CONTEXT_i386      CONTEXT_X86
-#define CONTEXT_i486      CONTEXT_X86
+#define CONTEXT_i386      0x00010000
+#define CONTEXT_i486      0x00010000
 
-#define CONTEXT_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
-#define CONTEXT_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
-#define CONTEXT_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
-#define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x0008) /* 387 state */
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010) /* DB 0-3,6,7 */
-#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x0020)
-#define CONTEXT_XSTATE             (CONTEXT_i386 | 0x0040)
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
-#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
-        CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)
+#define CONTEXT_I386_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
+#define CONTEXT_I386_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
+#define CONTEXT_I386_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
+#define CONTEXT_I386_FLOATING_POINT  (CONTEXT_i386 | 0x0008) /* 387 state */
+#define CONTEXT_I386_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010) /* DB 0-3,6,7 */
+#define CONTEXT_I386_EXTENDED_REGISTERS (CONTEXT_i386 | 0x0020)
+#define CONTEXT_I386_XSTATE             (CONTEXT_i386 | 0x0040)
+#define CONTEXT_I386_FULL (CONTEXT_I386_CONTROL | CONTEXT_I386_INTEGER | CONTEXT_I386_SEGMENTS)
+#define CONTEXT_I386_ALL (CONTEXT_I386_FULL | CONTEXT_I386_FLOATING_POINT | CONTEXT_I386_DEBUG_REGISTERS | CONTEXT_I386_EXTENDED_REGISTERS)
 
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
+#ifdef __i386__
+
+#define CONTEXT_CONTROL CONTEXT_I386_CONTROL
+#define CONTEXT_INTEGER CONTEXT_I386_INTEGER
+#define CONTEXT_SEGMENTS CONTEXT_I386_SEGMENTS
+#define CONTEXT_FLOATING_POINT CONTEXT_I386_FLOATING_POINT
+#define CONTEXT_DEBUG_REGISTERS CONTEXT_I386_DEBUG_REGISTERS
+#define CONTEXT_EXTENDED_REGISTERS CONTEXT_I386_EXTENDED_REGISTERS
+#define CONTEXT_XSTATE CONTEXT_I386_XSTATE
+#define CONTEXT_FULL CONTEXT_I386_FULL
+#define CONTEXT_ALL CONTEXT_I386_ALL
+#define SIZE_OF_80387_REGISTERS I386_SIZE_OF_80387_REGISTERS
+#define MAXIMUM_SUPPORTED_EXTENSION I386_MAXIMUM_SUPPORTED_EXTENSION
+
+typedef I386_FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
+typedef I386_CONTEXT CONTEXT, *PCONTEXT;
 
 #endif  /* __i386__ */
 
@@ -1118,26 +1122,28 @@
 } XSAVE_FORMAT, *PXSAVE_FORMAT;
 
 /* x86-64 context definitions */
-#if defined(__x86_64__)
+
+typedef struct _AMD64_RUNTIME_FUNCTION
+{
+    DWORD BeginAddress;
+    DWORD EndAddress;
+    DWORD UnwindData;
+} AMD64_RUNTIME_FUNCTION;
 
 #define CONTEXT_AMD64   0x00100000
 
-#define CONTEXT_CONTROL   (CONTEXT_AMD64 | 0x0001)
-#define CONTEXT_INTEGER   (CONTEXT_AMD64 | 0x0002)
-#define CONTEXT_SEGMENTS  (CONTEXT_AMD64 | 0x0004)
-#define CONTEXT_FLOATING_POINT  (CONTEXT_AMD64 | 0x0008)
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x0010)
-#define CONTEXT_XSTATE          (CONTEXT_AMD64 | 0x0040)
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
-#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
-
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
+#define CONTEXT_AMD64_CONTROL   (CONTEXT_AMD64 | 0x0001)
+#define CONTEXT_AMD64_INTEGER   (CONTEXT_AMD64 | 0x0002)
+#define CONTEXT_AMD64_SEGMENTS  (CONTEXT_AMD64 | 0x0004)
+#define CONTEXT_AMD64_FLOATING_POINT  (CONTEXT_AMD64 | 0x0008)
+#define CONTEXT_AMD64_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x0010)
+#define CONTEXT_AMD64_XSTATE          (CONTEXT_AMD64 | 0x0040)
+#define CONTEXT_AMD64_FULL (CONTEXT_AMD64_CONTROL | CONTEXT_AMD64_INTEGER | CONTEXT_AMD64_FLOATING_POINT)
+#define CONTEXT_AMD64_ALL (CONTEXT_AMD64_CONTROL | CONTEXT_AMD64_INTEGER | CONTEXT_AMD64_SEGMENTS | CONTEXT_AMD64_FLOATING_POINT | CONTEXT_AMD64_DEBUG_REGISTERS)
 
 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
 
-typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
+typedef struct DECLSPEC_ALIGN(16) _AMD64_CONTEXT {
     DWORD64 P1Home;          /* 000 */
     DWORD64 P2Home;          /* 008 */
     DWORD64 P3Home;          /* 010 */
@@ -1222,35 +1228,21 @@
     DWORD64 LastBranchFromRip;    /* 4b8 */
     DWORD64 LastExceptionToRip;   /* 4c0 */
     DWORD64 LastExceptionFromRip; /* 4c8 */
-} CONTEXT, *PCONTEXT;
+} AMD64_CONTEXT;
 
-typedef struct _RUNTIME_FUNCTION
-{
-    DWORD BeginAddress;
-    DWORD EndAddress;
-    DWORD UnwindData;
-} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
+#ifdef __x86_64__
 
-#define UNWIND_HISTORY_TABLE_SIZE 12
+#define CONTEXT_CONTROL CONTEXT_AMD64_CONTROL
+#define CONTEXT_INTEGER CONTEXT_AMD64_INTEGER
+#define CONTEXT_SEGMENTS CONTEXT_AMD64_SEGMENTS
+#define CONTEXT_FLOATING_POINT CONTEXT_AMD64_FLOATING_POINT
+#define CONTEXT_DEBUG_REGISTERS CONTEXT_AMD64_DEBUG_REGISTERS
+#define CONTEXT_XSTATE CONTEXT_AMD64_XSTATE
+#define CONTEXT_FULL CONTEXT_AMD64_FULL
+#define CONTEXT_ALL CONTEXT_AMD64_ALL
 
-typedef struct _UNWIND_HISTORY_TABLE_ENTRY
-{
-    ULONG64 ImageBase;
-    PRUNTIME_FUNCTION FunctionEntry;
-} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
-
-#define UNWIND_HISTORY_TABLE_NONE 0
-#define UNWIND_HISTORY_TABLE_GLOBAL 1
-#define UNWIND_HISTORY_TABLE_LOCAL 2
-
-typedef struct _UNWIND_HISTORY_TABLE
-{
-    ULONG Count;
-    UCHAR Search;
-    ULONG64 LowAddress;
-    ULONG64 HighAddress;
-    UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
-} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
+typedef AMD64_CONTEXT CONTEXT, *PCONTEXT;
+typedef AMD64_RUNTIME_FUNCTION RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
 
 typedef struct _KNONVOLATILE_CONTEXT_POINTERS
 {
@@ -1303,31 +1295,6 @@
     } DUMMYUNIONNAME2;
 } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
 
-typedef struct _DISPATCHER_CONTEXT
-{
-    ULONG64               ControlPc;
-    ULONG64               ImageBase;
-    PRUNTIME_FUNCTION     FunctionEntry;
-    ULONG64               EstablisherFrame;
-    ULONG64               TargetIp;
-    PCONTEXT              ContextRecord;
-    PEXCEPTION_ROUTINE    LanguageHandler;
-    PVOID                 HandlerData;
-    PUNWIND_HISTORY_TABLE HistoryTable;
-    DWORD                 ScopeIndex;
-    DWORD                 Fill0;
-} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
-
-typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,PVOID);
-typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,PVOID);
-
-NTSYSAPI PVOID WINAPI RtlVirtualUnwind(ULONG,ULONG64,ULONG64,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,ULONG64*,KNONVOLATILE_CONTEXT_POINTERS*);
-
-#define UNW_FLAG_NHANDLER  0
-#define UNW_FLAG_EHANDLER  1
-#define UNW_FLAG_UHANDLER  2
-#define UNW_FLAG_CHAININFO 4
-
 #endif /* __x86_64__ */
 
 #define XSTATE_LEGACY_FLOATING_POINT 0
@@ -1416,440 +1383,18 @@
 #endif
 } CONTEXT_EX, *PCONTEXT_EX;
 
-/* IA64 context definitions */
-#ifdef __ia64__
-
-#define CONTEXT_IA64                  0x00080000
-#define CONTEXT_CONTROL               (CONTEXT_IA64 | 0x00000001)
-#define CONTEXT_LOWER_FLOATING_POINT  (CONTEXT_IA64 | 0x00000002)
-#define CONTEXT_HIGHER_FLOATING_POINT (CONTEXT_IA64 | 0x00000004)
-#define CONTEXT_INTEGER               (CONTEXT_IA64 | 0x00000008)
-#define CONTEXT_DEBUG                 (CONTEXT_IA64 | 0x00000010)
-#define CONTEXT_IA32_CONTROL          (CONTEXT_IA64 | 0x00000020)
-#define CONTEXT_FLOATING_POINT        (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT)
-#define CONTEXT_FULL                  (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL)
-#define CONTEXT_ALL                   (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_DEBUG | CONTEXT_IA32_CONTROL)
-
-#define CONTEXT_EXCEPTION_ACTIVE      0x8000000
-#define CONTEXT_SERVICE_ACTIVE        0x10000000
-#define CONTEXT_EXCEPTION_REQUEST     0x40000000
-#define CONTEXT_EXCEPTION_REPORTING   0x80000000
-
-typedef struct _CONTEXT
-{
-    DWORD ContextFlags;
-    DWORD Fill1[3];
-    ULONGLONG DbI0;
-    ULONGLONG DbI1;
-    ULONGLONG DbI2;
-    ULONGLONG DbI3;
-    ULONGLONG DbI4;
-    ULONGLONG DbI5;
-    ULONGLONG DbI6;
-    ULONGLONG DbI7;
-    ULONGLONG DbD0;
-    ULONGLONG DbD1;
-    ULONGLONG DbD2;
-    ULONGLONG DbD3;
-    ULONGLONG DbD4;
-    ULONGLONG DbD5;
-    ULONGLONG DbD6;
-    ULONGLONG DbD7;
-    FLOAT128 FltS0;
-    FLOAT128 FltS1;
-    FLOAT128 FltS2;
-    FLOAT128 FltS3;
-    FLOAT128 FltT0;
-    FLOAT128 FltT1;
-    FLOAT128 FltT2;
-    FLOAT128 FltT3;
-    FLOAT128 FltT4;
-    FLOAT128 FltT5;
-    FLOAT128 FltT6;
-    FLOAT128 FltT7;
-    FLOAT128 FltT8;
-    FLOAT128 FltT9;
-    FLOAT128 FltS4;
-    FLOAT128 FltS5;
-    FLOAT128 FltS6;
-    FLOAT128 FltS7;
-    FLOAT128 FltS8;
-    FLOAT128 FltS9;
-    FLOAT128 FltS10;
-    FLOAT128 FltS11;
-    FLOAT128 FltS12;
-    FLOAT128 FltS13;
-    FLOAT128 FltS14;
-    FLOAT128 FltS15;
-    FLOAT128 FltS16;
-    FLOAT128 FltS17;
-    FLOAT128 FltS18;
-    FLOAT128 FltS19;
-    FLOAT128 FltF32;
-    FLOAT128 FltF33;
-    FLOAT128 FltF34;
-    FLOAT128 FltF35;
-    FLOAT128 FltF36;
-    FLOAT128 FltF37;
-    FLOAT128 FltF38;
-    FLOAT128 FltF39;
-    FLOAT128 FltF40;
-    FLOAT128 FltF41;
-    FLOAT128 FltF42;
-    FLOAT128 FltF43;
-    FLOAT128 FltF44;
-    FLOAT128 FltF45;
-    FLOAT128 FltF46;
-    FLOAT128 FltF47;
-    FLOAT128 FltF48;
-    FLOAT128 FltF49;
-    FLOAT128 FltF50;
-    FLOAT128 FltF51;
-    FLOAT128 FltF52;
-    FLOAT128 FltF53;
-    FLOAT128 FltF54;
-    FLOAT128 FltF55;
-    FLOAT128 FltF56;
-    FLOAT128 FltF57;
-    FLOAT128 FltF58;
-    FLOAT128 FltF59;
-    FLOAT128 FltF60;
-    FLOAT128 FltF61;
-    FLOAT128 FltF62;
-    FLOAT128 FltF63;
-    FLOAT128 FltF64;
-    FLOAT128 FltF65;
-    FLOAT128 FltF66;
-    FLOAT128 FltF67;
-    FLOAT128 FltF68;
-    FLOAT128 FltF69;
-    FLOAT128 FltF70;
-    FLOAT128 FltF71;
-    FLOAT128 FltF72;
-    FLOAT128 FltF73;
-    FLOAT128 FltF74;
-    FLOAT128 FltF75;
-    FLOAT128 FltF76;
-    FLOAT128 FltF77;
-    FLOAT128 FltF78;
-    FLOAT128 FltF79;
-    FLOAT128 FltF80;
-    FLOAT128 FltF81;
-    FLOAT128 FltF82;
-    FLOAT128 FltF83;
-    FLOAT128 FltF84;
-    FLOAT128 FltF85;
-    FLOAT128 FltF86;
-    FLOAT128 FltF87;
-    FLOAT128 FltF88;
-    FLOAT128 FltF89;
-    FLOAT128 FltF90;
-    FLOAT128 FltF91;
-    FLOAT128 FltF92;
-    FLOAT128 FltF93;
-    FLOAT128 FltF94;
-    FLOAT128 FltF95;
-    FLOAT128 FltF96;
-    FLOAT128 FltF97;
-    FLOAT128 FltF98;
-    FLOAT128 FltF99;
-    FLOAT128 FltF100;
-    FLOAT128 FltF101;
-    FLOAT128 FltF102;
-    FLOAT128 FltF103;
-    FLOAT128 FltF104;
-    FLOAT128 FltF105;
-    FLOAT128 FltF106;
-    FLOAT128 FltF107;
-    FLOAT128 FltF108;
-    FLOAT128 FltF109;
-    FLOAT128 FltF110;
-    FLOAT128 FltF111;
-    FLOAT128 FltF112;
-    FLOAT128 FltF113;
-    FLOAT128 FltF114;
-    FLOAT128 FltF115;
-    FLOAT128 FltF116;
-    FLOAT128 FltF117;
-    FLOAT128 FltF118;
-    FLOAT128 FltF119;
-    FLOAT128 FltF120;
-    FLOAT128 FltF121;
-    FLOAT128 FltF122;
-    FLOAT128 FltF123;
-    FLOAT128 FltF124;
-    FLOAT128 FltF125;
-    FLOAT128 FltF126;
-    FLOAT128 FltF127;
-    ULONGLONG StFPSR;
-    ULONGLONG IntGp;
-    ULONGLONG IntT0;
-    ULONGLONG IntT1;
-    ULONGLONG IntS0;
-    ULONGLONG IntS1;
-    ULONGLONG IntS2;
-    ULONGLONG IntS3;
-    ULONGLONG IntV0;
-    ULONGLONG IntT2;
-    ULONGLONG IntT3;
-    ULONGLONG IntT4;
-    ULONGLONG IntSp;
-    ULONGLONG IntTeb;
-    ULONGLONG IntT5;
-    ULONGLONG IntT6;
-    ULONGLONG IntT7;
-    ULONGLONG IntT8;
-    ULONGLONG IntT9;
-    ULONGLONG IntT10;
-    ULONGLONG IntT11;
-    ULONGLONG IntT12;
-    ULONGLONG IntT13;
-    ULONGLONG IntT14;
-    ULONGLONG IntT15;
-    ULONGLONG IntT16;
-    ULONGLONG IntT17;
-    ULONGLONG IntT18;
-    ULONGLONG IntT19;
-    ULONGLONG IntT20;
-    ULONGLONG IntT21;
-    ULONGLONG IntT22;
-    ULONGLONG IntNats;
-    ULONGLONG Preds;
-    ULONGLONG BrRp;
-    ULONGLONG BrS0;
-    ULONGLONG BrS1;
-    ULONGLONG BrS2;
-    ULONGLONG BrS3;
-    ULONGLONG BrS4;
-    ULONGLONG BrT0;
-    ULONGLONG BrT1;
-    ULONGLONG ApUNAT;
-    ULONGLONG ApLC;
-    ULONGLONG ApEC;
-    ULONGLONG ApCCV;
-    ULONGLONG ApDCR;
-    ULONGLONG RsPFS;
-    ULONGLONG RsBSP;
-    ULONGLONG RsBSPSTORE;
-    ULONGLONG RsRSC;
-    ULONGLONG RsRNAT;
-    ULONGLONG StIPSR;
-    ULONGLONG StIIP;
-    ULONGLONG StIFS;
-    ULONGLONG StFCR;
-    ULONGLONG Eflag;
-    ULONGLONG SegCSD;
-    ULONGLONG SegSSD;
-    ULONGLONG Cflag;
-    ULONGLONG StFSR;
-    ULONGLONG StFIR;
-    ULONGLONG StFDR;
-    ULONGLONG UNUSEDPACK;
-} CONTEXT, *PCONTEXT;
-
-typedef struct _RUNTIME_FUNCTION
-{
-    ULONG BeginAddress;
-    ULONG EndAddress;
-    ULONG UnwindInfoAddress;
-} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
-
-typedef struct _FRAME_POINTERS {
-  ULONGLONG MemoryStackFp;
-  ULONGLONG BackingStoreFp;
-} FRAME_POINTERS, *PFRAME_POINTERS;
-
-#define UNWIND_HISTORY_TABLE_SIZE 12
-
-typedef struct _UNWIND_HISTORY_TABLE_ENTRY {
-  ULONG64 ImageBase;
-  ULONG64 Gp;
-  PRUNTIME_FUNCTION FunctionEntry;
-} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
-
-typedef struct _UNWIND_HISTORY_TABLE {
-  ULONG Count;
-  UCHAR Search;
-  ULONG64 LowAddress;
-  ULONG64 HighAddress;
-  UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
-} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
-
-typedef struct _KNONVOLATILE_CONTEXT_POINTERS
-{
-    PFLOAT128  FltS0;
-    PFLOAT128  FltS1;
-    PFLOAT128  FltS2;
-    PFLOAT128  FltS3;
-    PFLOAT128  HighFloatingContext[10];
-    PFLOAT128  FltS4;
-    PFLOAT128  FltS5;
-    PFLOAT128  FltS6;
-    PFLOAT128  FltS7;
-    PFLOAT128  FltS8;
-    PFLOAT128  FltS9;
-    PFLOAT128  FltS10;
-    PFLOAT128  FltS11;
-    PFLOAT128  FltS12;
-    PFLOAT128  FltS13;
-    PFLOAT128  FltS14;
-    PFLOAT128  FltS15;
-    PFLOAT128  FltS16;
-    PFLOAT128  FltS17;
-    PFLOAT128  FltS18;
-    PFLOAT128  FltS19;
-    PULONGLONG IntS0;
-    PULONGLONG IntS1;
-    PULONGLONG IntS2;
-    PULONGLONG IntS3;
-    PULONGLONG IntSp;
-    PULONGLONG IntS0Nat;
-    PULONGLONG IntS1Nat;
-    PULONGLONG IntS2Nat;
-    PULONGLONG IntS3Nat;
-    PULONGLONG IntSpNat;
-    PULONGLONG Preds;
-    PULONGLONG BrRp;
-    PULONGLONG BrS0;
-    PULONGLONG BrS1;
-    PULONGLONG BrS2;
-    PULONGLONG BrS3;
-    PULONGLONG BrS4;
-    PULONGLONG ApUNAT;
-    PULONGLONG ApLC;
-    PULONGLONG ApEC;
-    PULONGLONG RsPFS;
-    PULONGLONG StFSR;
-    PULONGLONG StFIR;
-    PULONGLONG StFDR;
-    PULONGLONG Cflag;
-} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
-
-NTSYSAPI ULONGLONG WINAPI RtlVirtualUnwind(ULONGLONG,ULONGLONG,RUNTIME_FUNCTION*,CONTEXT*,BOOLEAN*,FRAME_POINTERS*,KNONVOLATILE_CONTEXT_POINTERS*);
-
-#endif /* __ia64__ */
-
-/* Alpha context definitions */
-#if defined(_ALPHA_) || defined(__ALPHA__) || defined(__alpha__)
-
-#define CONTEXT_ALPHA   0x00020000
-
-#define CONTEXT_CONTROL         (CONTEXT_ALPHA | 0x00000001)
-#define CONTEXT_FLOATING_POINT  (CONTEXT_ALPHA | 0x00000002)
-#define CONTEXT_INTEGER         (CONTEXT_ALPHA | 0x00000004)
-#define CONTEXT_FULL  (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
-
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
-
-typedef struct _CONTEXT
-{
-    /* selected by CONTEXT_FLOATING_POINT */
-    ULONGLONG FltF0;
-    ULONGLONG FltF1;
-    ULONGLONG FltF2;
-    ULONGLONG FltF3;
-    ULONGLONG FltF4;
-    ULONGLONG FltF5;
-    ULONGLONG FltF6;
-    ULONGLONG FltF7;
-    ULONGLONG FltF8;
-    ULONGLONG FltF9;
-    ULONGLONG FltF10;
-    ULONGLONG FltF11;
-    ULONGLONG FltF12;
-    ULONGLONG FltF13;
-    ULONGLONG FltF14;
-    ULONGLONG FltF15;
-    ULONGLONG FltF16;
-    ULONGLONG FltF17;
-    ULONGLONG FltF18;
-    ULONGLONG FltF19;
-    ULONGLONG FltF20;
-    ULONGLONG FltF21;
-    ULONGLONG FltF22;
-    ULONGLONG FltF23;
-    ULONGLONG FltF24;
-    ULONGLONG FltF25;
-    ULONGLONG FltF26;
-    ULONGLONG FltF27;
-    ULONGLONG FltF28;
-    ULONGLONG FltF29;
-    ULONGLONG FltF30;
-    ULONGLONG FltF31;
-
-    /* selected by CONTEXT_INTEGER */
-    ULONGLONG IntV0;
-    ULONGLONG IntT0;
-    ULONGLONG IntT1;
-    ULONGLONG IntT2;
-    ULONGLONG IntT3;
-    ULONGLONG IntT4;
-    ULONGLONG IntT5;
-    ULONGLONG IntT6;
-    ULONGLONG IntT7;
-    ULONGLONG IntS0;
-    ULONGLONG IntS1;
-    ULONGLONG IntS2;
-    ULONGLONG IntS3;
-    ULONGLONG IntS4;
-    ULONGLONG IntS5;
-    ULONGLONG IntFp;
-    ULONGLONG IntA0;
-    ULONGLONG IntA1;
-    ULONGLONG IntA2;
-    ULONGLONG IntA3;
-    ULONGLONG IntA4;
-    ULONGLONG IntA5;
-    ULONGLONG IntT8;
-    ULONGLONG IntT9;
-    ULONGLONG IntT10;
-    ULONGLONG IntT11;
-    ULONGLONG IntRa;
-    ULONGLONG IntT12;
-    ULONGLONG IntAt;
-    ULONGLONG IntGp;
-    ULONGLONG IntSp;
-    ULONGLONG IntZero;
-
-    /* selected by CONTEXT_FLOATING_POINT */
-    ULONGLONG Fpcr;
-    ULONGLONG SoftFpcr;
-
-    /* selected by CONTEXT_CONTROL */
-    ULONGLONG Fir;
-    DWORD Psr;
-    DWORD ContextFlags;
-    DWORD Fill[4];
-} CONTEXT, *PCONTEXT;
-
-#define _QUAD_PSR_OFFSET   HighSoftFpcr
-#define _QUAD_FLAGS_OFFSET HighFir
-
-#endif  /* _ALPHA_ */
-
-#ifdef __arm__
-
-/* The following flags control the contents of the CONTEXT structure. */
-
 #define CONTEXT_ARM    0x0200000
-#define CONTEXT_CONTROL         (CONTEXT_ARM | 0x00000001)
-#define CONTEXT_INTEGER         (CONTEXT_ARM | 0x00000002)
-#define CONTEXT_FLOATING_POINT  (CONTEXT_ARM | 0x00000004)
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM | 0x00000008)
-
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)
-#define CONTEXT_ALL  (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
-
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
+#define CONTEXT_ARM_CONTROL         (CONTEXT_ARM | 0x00000001)
+#define CONTEXT_ARM_INTEGER         (CONTEXT_ARM | 0x00000002)
+#define CONTEXT_ARM_FLOATING_POINT  (CONTEXT_ARM | 0x00000004)
+#define CONTEXT_ARM_DEBUG_REGISTERS (CONTEXT_ARM | 0x00000008)
+#define CONTEXT_ARM_FULL (CONTEXT_ARM_CONTROL | CONTEXT_ARM_INTEGER)
+#define CONTEXT_ARM_ALL  (CONTEXT_ARM_FULL | CONTEXT_ARM_FLOATING_POINT | CONTEXT_ARM_DEBUG_REGISTERS)
 
 #define ARM_MAX_BREAKPOINTS     8
 #define ARM_MAX_WATCHPOINTS     1
 
-typedef struct _RUNTIME_FUNCTION
+typedef struct _IMAGE_ARM_RUNTIME_FUNCTION
 {
     DWORD BeginAddress;
     union {
@@ -1866,35 +1411,15 @@
             DWORD StackAdjust : 10;
         } DUMMYSTRUCTNAME;
     } DUMMYUNIONNAME;
-} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
+} IMAGE_ARM_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ARM_RUNTIME_FUNCTION_ENTRY;
 
-#define UNWIND_HISTORY_TABLE_SIZE 12
-
-typedef struct _UNWIND_HISTORY_TABLE_ENTRY
-{
-    DWORD ImageBase;
-    PRUNTIME_FUNCTION FunctionEntry;
-} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
-
-typedef struct _UNWIND_HISTORY_TABLE
-{
-    DWORD Count;
-    BYTE  LocalHint;
-    BYTE  GlobalHint;
-    BYTE  Search;
-    BYTE  Once;
-    DWORD LowAddress;
-    DWORD HighAddress;
-    UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
-} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
-
-typedef struct _NEON128
+typedef struct _ARM_NEON128
 {
     ULONGLONG Low;
     LONGLONG High;
-} NEON128, *PNEON128;
+} ARM_NEON128;
 
-typedef struct _CONTEXT
+typedef struct _ARM_CONTEXT
 {
     ULONG ContextFlags;             /* 000 */
     /* CONTEXT_INTEGER */
@@ -1921,7 +1446,7 @@
     ULONG Padding;                  /* 04c */
     union
     {
-        NEON128 Q[16];
+        ARM_NEON128 Q[16];
         ULONGLONG D[32];
         ULONG S[32];
     } DUMMYUNIONNAME;               /* 050 */
@@ -1931,7 +1456,20 @@
     ULONG Wvr[ARM_MAX_WATCHPOINTS]; /* 190 */
     ULONG Wcr[ARM_MAX_WATCHPOINTS]; /* 194 */
     ULONG Padding2[2];              /* 198 */
-} CONTEXT, *PCONTEXT;
+} ARM_CONTEXT;
+
+#ifdef __arm__
+
+#define CONTEXT_CONTROL CONTEXT_ARM_CONTROL
+#define CONTEXT_INTEGER CONTEXT_ARM_INTEGER
+#define CONTEXT_FLOATING_POINT CONTEXT_ARM_FLOATING_POINT
+#define CONTEXT_DEBUG_REGISTERS CONTEXT_ARM_DEBUG_REGISTERS
+#define CONTEXT_FULL CONTEXT_ARM_FULL
+#define CONTEXT_ALL CONTEXT_ARM_ALL
+
+typedef IMAGE_ARM_RUNTIME_FUNCTION_ENTRY RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
+typedef ARM_NEON128 NEON128, *PNEON128;
+typedef ARM_CONTEXT CONTEXT, *PCONTEXT;
 
 typedef struct _KNONVOLATILE_CONTEXT_POINTERS
 {
@@ -1954,56 +1492,23 @@
     PULONGLONG D15;
 } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
 
-typedef struct _DISPATCHER_CONTEXT
-{
-    DWORD                 ControlPc;
-    DWORD                 ImageBase;
-    PRUNTIME_FUNCTION     FunctionEntry;
-    DWORD                 EstablisherFrame;
-    DWORD                 TargetPc;
-    PCONTEXT              ContextRecord;
-    PEXCEPTION_ROUTINE    LanguageHandler;
-    PVOID                 HandlerData;
-    PUNWIND_HISTORY_TABLE HistoryTable;
-    DWORD                 ScopeIndex;
-    BOOLEAN               ControlPcIsUnwound;
-    PBYTE                 NonVolatileRegisters;
-    DWORD                 Reserved;
-} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
-
-typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD);
-typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD);
-
-NTSYSAPI PVOID WINAPI RtlVirtualUnwind(DWORD,DWORD,DWORD,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,DWORD*,KNONVOLATILE_CONTEXT_POINTERS*);
-
-#define UNW_FLAG_NHANDLER  0
-#define UNW_FLAG_EHANDLER  1
-#define UNW_FLAG_UHANDLER  2
-
 #endif /* __arm__ */
 
-#ifdef __aarch64__
-
 #define CONTEXT_ARM64           0x400000
-#define CONTEXT_CONTROL         (CONTEXT_ARM64 | 0x00000001)
-#define CONTEXT_INTEGER         (CONTEXT_ARM64 | 0x00000002)
-#define CONTEXT_FLOATING_POINT  (CONTEXT_ARM64 | 0x00000004)
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x00000008)
+#define CONTEXT_ARM64_CONTROL         (CONTEXT_ARM64 | 0x00000001)
+#define CONTEXT_ARM64_INTEGER         (CONTEXT_ARM64 | 0x00000002)
+#define CONTEXT_ARM64_FLOATING_POINT  (CONTEXT_ARM64 | 0x00000004)
+#define CONTEXT_ARM64_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x00000008)
 #define CONTEXT_ARM64_X18       (CONTEXT_ARM64 | 0x00000010)
+#define CONTEXT_ARM64_FULL (CONTEXT_ARM64_CONTROL | CONTEXT_ARM64_INTEGER | CONTEXT_ARM64_FLOATING_POINT)
+#define CONTEXT_ARM64_ALL  (CONTEXT_ARM64_FULL | CONTEXT_ARM64_DEBUG_REGISTERS | CONTEXT_ARM64_X18)
 
 #define CONTEXT_UNWOUND_TO_CALL 0x20000000
 
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
-#define CONTEXT_ALL  (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_ARM64_X18)
-
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
-
 #define ARM64_MAX_BREAKPOINTS   8
 #define ARM64_MAX_WATCHPOINTS   2
 
-typedef struct _RUNTIME_FUNCTION
+typedef struct _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY
 {
     DWORD BeginAddress;
     union
@@ -2020,29 +1525,11 @@
             DWORD FrameSize : 9;
         } DUMMYSTRUCTNAME;
     } DUMMYUNIONNAME;
-} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
+} IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ARM64_RUNTIME_FUNCTION_ENTRY;
 
-#define UNWIND_HISTORY_TABLE_SIZE 12
+typedef IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY ARM64_RUNTIME_FUNCTION, *PARM64_RUNTIME_FUNCTION;
 
-typedef struct _UNWIND_HISTORY_TABLE_ENTRY
-{
-    DWORD64 ImageBase;
-    PRUNTIME_FUNCTION FunctionEntry;
-} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
-
-typedef struct _UNWIND_HISTORY_TABLE
-{
-    DWORD   Count;
-    BYTE    LocalHint;
-    BYTE    GlobalHint;
-    BYTE    Search;
-    BYTE    Once;
-    DWORD64 LowAddress;
-    DWORD64 HighAddress;
-    UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
-} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
-
-typedef union _NEON128
+typedef union _ARM64_NT_NEON128
 {
     struct
     {
@@ -2053,9 +1540,9 @@
     float S[4];
     WORD  H[8];
     BYTE  B[16];
-} NEON128, *PNEON128;
+} ARM64_NT_NEON128, *PARM64_NT_NEON128;
 
-typedef struct _CONTEXT
+typedef struct DECLSPEC_ALIGN(16) _ARM64_NT_CONTEXT
 {
     ULONG ContextFlags;                 /* 000 */
     /* CONTEXT_INTEGER */
@@ -2102,7 +1589,7 @@
     DWORD64 Sp;                         /* 100 */
     DWORD64 Pc;                         /* 108 */
     /* CONTEXT_FLOATING_POINT */
-    NEON128 V[32];                      /* 110 */
+    ARM64_NT_NEON128 V[32];             /* 110 */
     DWORD Fpcr;                         /* 310 */
     DWORD Fpsr;                         /* 314 */
     /* CONTEXT_DEBUG_REGISTERS */
@@ -2110,7 +1597,20 @@
     DWORD64 Bvr[ARM64_MAX_BREAKPOINTS]; /* 338 */
     DWORD Wcr[ARM64_MAX_WATCHPOINTS];   /* 378 */
     DWORD64 Wvr[ARM64_MAX_WATCHPOINTS]; /* 380 */
-} CONTEXT, *PCONTEXT;
+} ARM64_NT_CONTEXT, *PARM64_NT_CONTEXT;
+
+#ifdef __aarch64__
+
+#define CONTEXT_CONTROL CONTEXT_ARM64_CONTROL
+#define CONTEXT_INTEGER CONTEXT_ARM64_INTEGER
+#define CONTEXT_FLOATING_POINT CONTEXT_ARM64_FLOATING_POINT
+#define CONTEXT_DEBUG_REGISTERS CONTEXT_ARM64_DEBUG_REGISTERS
+#define CONTEXT_FULL CONTEXT_ARM64_FULL
+#define CONTEXT_ALL CONTEXT_ARM64_ALL
+
+typedef IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
+typedef ARM64_NT_NEON128 NEON128, *PNEON128;
+typedef ARM64_NT_CONTEXT CONTEXT, *PCONTEXT;
 
 typedef struct _KNONVOLATILE_CONTEXT_POINTERS
 {
@@ -2136,266 +1636,8 @@
     PDWORD64 D15;
 } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
 
-typedef struct _DISPATCHER_CONTEXT
-{
-    ULONG_PTR             ControlPc;
-    ULONG_PTR             ImageBase;
-    PRUNTIME_FUNCTION     FunctionEntry;
-    ULONG_PTR             EstablisherFrame;
-    ULONG_PTR             TargetPc;
-    PCONTEXT              ContextRecord;
-    PEXCEPTION_ROUTINE    LanguageHandler;
-    PVOID                 HandlerData;
-    PUNWIND_HISTORY_TABLE HistoryTable;
-    DWORD                 ScopeIndex;
-    BOOLEAN               ControlPcIsUnwound;
-    PBYTE                 NonVolatileRegisters;
-} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
-
-typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD64);
-typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD64);
-
-NTSYSAPI PVOID WINAPI RtlVirtualUnwind(DWORD,ULONG_PTR,ULONG_PTR,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,ULONG_PTR*,KNONVOLATILE_CONTEXT_POINTERS*);
-
-#define UNW_FLAG_NHANDLER  0
-#define UNW_FLAG_EHANDLER  1
-#define UNW_FLAG_UHANDLER  2
-
 #endif /* __aarch64__ */
 
-
-/* Mips context definitions */
-#if defined(_MIPS_) || defined(__MIPS__) || defined(__mips__)
-
-#define CONTEXT_R4000   0x00010000
-
-#define CONTEXT_CONTROL         (CONTEXT_R4000 | 0x00000001)
-#define CONTEXT_FLOATING_POINT  (CONTEXT_R4000 | 0x00000002)
-#define CONTEXT_INTEGER         (CONTEXT_R4000 | 0x00000004)
-
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
-
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
-
-typedef struct _CONTEXT
-{
-    DWORD Argument[4];
-    /* These are selected by CONTEXT_FLOATING_POINT */
-    DWORD FltF0;
-    DWORD FltF1;
-    DWORD FltF2;
-    DWORD FltF3;
-    DWORD FltF4;
-    DWORD FltF5;
-    DWORD FltF6;
-    DWORD FltF7;
-    DWORD FltF8;
-    DWORD FltF9;
-    DWORD FltF10;
-    DWORD FltF11;
-    DWORD FltF12;
-    DWORD FltF13;
-    DWORD FltF14;
-    DWORD FltF15;
-    DWORD FltF16;
-    DWORD FltF17;
-    DWORD FltF18;
-    DWORD FltF19;
-    DWORD FltF20;
-    DWORD FltF21;
-    DWORD FltF22;
-    DWORD FltF23;
-    DWORD FltF24;
-    DWORD FltF25;
-    DWORD FltF26;
-    DWORD FltF27;
-    DWORD FltF28;
-    DWORD FltF29;
-    DWORD FltF30;
-    DWORD FltF31;
-
-    /* These are selected by CONTEXT_INTEGER */
-    DWORD IntZero;
-    DWORD IntAt;
-    DWORD IntV0;
-    DWORD IntV1;
-    DWORD IntA0;
-    DWORD IntA1;
-    DWORD IntA2;
-    DWORD IntA3;
-    DWORD IntT0;
-    DWORD IntT1;
-    DWORD IntT2;
-    DWORD IntT3;
-    DWORD IntT4;
-    DWORD IntT5;
-    DWORD IntT6;
-    DWORD IntT7;
-    DWORD IntS0;
-    DWORD IntS1;
-    DWORD IntS2;
-    DWORD IntS3;
-    DWORD IntS4;
-    DWORD IntS5;
-    DWORD IntS6;
-    DWORD IntS7;
-    DWORD IntT8;
-    DWORD IntT9;
-    DWORD IntK0;
-    DWORD IntK1;
-    DWORD IntGp;
-    DWORD IntSp;
-    DWORD IntS8;
-    DWORD IntRa;
-    DWORD IntLo;
-    DWORD IntHi;
-
-    /* These are selected by CONTEXT_FLOATING_POINT */
-    DWORD Fsr;
-
-    /* These are selected by CONTEXT_CONTROL */
-    DWORD Fir;
-    DWORD Psr;
-
-    DWORD ContextFlags;
-    DWORD Fill[2];
-} CONTEXT, *PCONTEXT;
-
-#endif  /* _MIPS_ */
-
-/* PowerPC context definitions */
-#ifdef __powerpc__
-
-#define CONTEXT_CONTROL         0x0001
-#define CONTEXT_FLOATING_POINT  0x0002
-#define CONTEXT_INTEGER         0x0004
-#define CONTEXT_DEBUG_REGISTERS 0x0008
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
-
-#define EXCEPTION_READ_FAULT    0
-#define EXCEPTION_WRITE_FAULT   1
-#define EXCEPTION_EXECUTE_FAULT 8
-
-typedef struct
-{
-    /* These are selected by CONTEXT_FLOATING_POINT */
-    double Fpr0;
-    double Fpr1;
-    double Fpr2;
-    double Fpr3;
-    double Fpr4;
-    double Fpr5;
-    double Fpr6;
-    double Fpr7;
-    double Fpr8;
-    double Fpr9;
-    double Fpr10;
-    double Fpr11;
-    double Fpr12;
-    double Fpr13;
-    double Fpr14;
-    double Fpr15;
-    double Fpr16;
-    double Fpr17;
-    double Fpr18;
-    double Fpr19;
-    double Fpr20;
-    double Fpr21;
-    double Fpr22;
-    double Fpr23;
-    double Fpr24;
-    double Fpr25;
-    double Fpr26;
-    double Fpr27;
-    double Fpr28;
-    double Fpr29;
-    double Fpr30;
-    double Fpr31;
-    double Fpscr;
-
-    /* These are selected by CONTEXT_INTEGER */
-    DWORD Gpr0;
-    DWORD Gpr1;
-    DWORD Gpr2;
-    DWORD Gpr3;
-    DWORD Gpr4;
-    DWORD Gpr5;
-    DWORD Gpr6;
-    DWORD Gpr7;
-    DWORD Gpr8;
-    DWORD Gpr9;
-    DWORD Gpr10;
-    DWORD Gpr11;
-    DWORD Gpr12;
-    DWORD Gpr13;
-    DWORD Gpr14;
-    DWORD Gpr15;
-    DWORD Gpr16;
-    DWORD Gpr17;
-    DWORD Gpr18;
-    DWORD Gpr19;
-    DWORD Gpr20;
-    DWORD Gpr21;
-    DWORD Gpr22;
-    DWORD Gpr23;
-    DWORD Gpr24;
-    DWORD Gpr25;
-    DWORD Gpr26;
-    DWORD Gpr27;
-    DWORD Gpr28;
-    DWORD Gpr29;
-    DWORD Gpr30;
-    DWORD Gpr31;
-
-    DWORD Cr;
-    DWORD Xer;
-
-    /* These are selected by CONTEXT_CONTROL */
-    DWORD Msr;
-    DWORD Iar; /* Instruction Address Register , aka PC ... */
-    DWORD Lr;
-    DWORD Ctr;
-
-    DWORD ContextFlags;
-    
-    DWORD Dar;   /* Fault registers for coredump */
-    DWORD Dsisr; 
-    DWORD Trap;  /* number of powerpc exception taken */
-
-    /* These are selected by CONTEXT_DEBUG_REGISTERS */
-    DWORD Dr0;
-    DWORD Dr1;
-    DWORD Dr2;
-    DWORD Dr3;
-    DWORD Dr4;
-    DWORD Dr5;
-    DWORD Dr6;
-    DWORD Dr7;
-} CONTEXT, *PCONTEXT;
-
-typedef struct _STACK_FRAME_HEADER
-{
-    DWORD BackChain;
-    DWORD GlueSaved1;
-    DWORD GlueSaved2;
-    DWORD Reserved1;
-    DWORD Spare1;
-    DWORD Spare2;
-
-    DWORD Parameter0;
-    DWORD Parameter1;
-    DWORD Parameter2;
-    DWORD Parameter3;
-    DWORD Parameter4;
-    DWORD Parameter5;
-    DWORD Parameter6;
-    DWORD Parameter7;
-} STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
-
-#endif  /* __powerpc__ */
-
 #if !defined(CONTEXT_FULL) && !defined(RC_INVOKED)
 #error You need to define a CONTEXT for your CPU
 #endif
@@ -2416,8 +1658,6 @@
                            WOW64_CONTEXT_SEGMENTS | WOW64_CONTEXT_FLOATING_POINT | \
                            WOW64_CONTEXT_DEBUG_REGISTERS | WOW64_CONTEXT_EXTENDED_REGISTERS)
 
-#define WOW64_CONTEXT_XSTATE (WOW64_CONTEXT_i386 | __MSABI_LONG(0x00000040))
-
 #define WOW64_CONTEXT_EXCEPTION_ACTIVE      0x08000000
 #define WOW64_CONTEXT_SERVICE_ACTIVE        0x10000000
 #define WOW64_CONTEXT_EXCEPTION_REQUEST     0x40000000
@@ -2426,49 +1666,156 @@
 #define WOW64_SIZE_OF_80387_REGISTERS 80
 #define WOW64_MAXIMUM_SUPPORTED_EXTENSION 512
 
-typedef struct _WOW64_FLOATING_SAVE_AREA
-{
-    DWORD   ControlWord;
-    DWORD   StatusWord;
-    DWORD   TagWord;
-    DWORD   ErrorOffset;
-    DWORD   ErrorSelector;
-    DWORD   DataOffset;
-    DWORD   DataSelector;
-    BYTE    RegisterArea[WOW64_SIZE_OF_80387_REGISTERS];
-    DWORD   Cr0NpxState;
-} WOW64_FLOATING_SAVE_AREA, *PWOW64_FLOATING_SAVE_AREA;
+/* Exception definitions */
 
-#include "pshpack4.h"
-typedef struct _WOW64_CONTEXT
+#define EXCEPTION_READ_FAULT    0
+#define EXCEPTION_WRITE_FAULT   1
+#define EXCEPTION_EXECUTE_FAULT 8
+
+struct _EXCEPTION_POINTERS;
+struct _EXCEPTION_RECORD;
+
+typedef EXCEPTION_DISPOSITION WINAPI EXCEPTION_ROUTINE(struct _EXCEPTION_RECORD*,PVOID,CONTEXT*,PVOID);
+typedef EXCEPTION_ROUTINE *PEXCEPTION_ROUTINE;
+
+#ifdef __x86_64__
+
+#define UNWIND_HISTORY_TABLE_SIZE 12
+
+typedef struct _UNWIND_HISTORY_TABLE_ENTRY
 {
-    DWORD ContextFlags;
-    DWORD Dr0;
-    DWORD Dr1;
-    DWORD Dr2;
-    DWORD Dr3;
-    DWORD Dr6;
-    DWORD Dr7;
-    WOW64_FLOATING_SAVE_AREA FloatSave;
-    DWORD SegGs;
-    DWORD SegFs;
-    DWORD SegEs;
-    DWORD SegDs;
-    DWORD Edi;
-    DWORD Esi;
-    DWORD Ebx;
-    DWORD Edx;
-    DWORD Ecx;
-    DWORD Eax;
-    DWORD Ebp;
-    DWORD Eip;
-    DWORD SegCs;
-    DWORD EFlags;
-    DWORD Esp;
-    DWORD SegSs;
-    BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
-} WOW64_CONTEXT, *PWOW64_CONTEXT;
-#include "poppack.h"
+    ULONG64 ImageBase;
+    PRUNTIME_FUNCTION FunctionEntry;
+} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
+
+#define UNWIND_HISTORY_TABLE_NONE 0
+#define UNWIND_HISTORY_TABLE_GLOBAL 1
+#define UNWIND_HISTORY_TABLE_LOCAL 2
+
+typedef struct _UNWIND_HISTORY_TABLE
+{
+    ULONG Count;
+    UCHAR Search;
+    ULONG64 LowAddress;
+    ULONG64 HighAddress;
+    UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
+} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
+
+typedef struct _DISPATCHER_CONTEXT
+{
+    ULONG64               ControlPc;
+    ULONG64               ImageBase;
+    PRUNTIME_FUNCTION     FunctionEntry;
+    ULONG64               EstablisherFrame;
+    ULONG64               TargetIp;
+    PCONTEXT              ContextRecord;
+    PEXCEPTION_ROUTINE    LanguageHandler;
+    PVOID                 HandlerData;
+    PUNWIND_HISTORY_TABLE HistoryTable;
+    DWORD                 ScopeIndex;
+    DWORD                 Fill0;
+} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+
+typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,PVOID);
+typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,PVOID);
+
+#define UNW_FLAG_NHANDLER  0
+#define UNW_FLAG_EHANDLER  1
+#define UNW_FLAG_UHANDLER  2
+#define UNW_FLAG_CHAININFO 4
+
+#elif defined(__arm__)
+
+#define UNWIND_HISTORY_TABLE_SIZE 12
+
+typedef struct _UNWIND_HISTORY_TABLE_ENTRY
+{
+    DWORD ImageBase;
+    PRUNTIME_FUNCTION FunctionEntry;
+} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
+
+typedef struct _UNWIND_HISTORY_TABLE
+{
+    DWORD Count;
+    BYTE  LocalHint;
+    BYTE  GlobalHint;
+    BYTE  Search;
+    BYTE  Once;
+    DWORD LowAddress;
+    DWORD HighAddress;
+    UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
+} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
+
+typedef struct _DISPATCHER_CONTEXT
+{
+    DWORD                 ControlPc;
+    DWORD                 ImageBase;
+    PRUNTIME_FUNCTION     FunctionEntry;
+    DWORD                 EstablisherFrame;
+    DWORD                 TargetPc;
+    PCONTEXT              ContextRecord;
+    PEXCEPTION_ROUTINE    LanguageHandler;
+    PVOID                 HandlerData;
+    PUNWIND_HISTORY_TABLE HistoryTable;
+    DWORD                 ScopeIndex;
+    BOOLEAN               ControlPcIsUnwound;
+    PBYTE                 NonVolatileRegisters;
+    DWORD                 Reserved;
+} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+
+typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD);
+typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD);
+
+#define UNW_FLAG_NHANDLER  0
+#define UNW_FLAG_EHANDLER  1
+#define UNW_FLAG_UHANDLER  2
+
+#elif defined(__aarch64__)
+
+#define UNWIND_HISTORY_TABLE_SIZE 12
+
+typedef struct _UNWIND_HISTORY_TABLE_ENTRY
+{
+    DWORD64 ImageBase;
+    PRUNTIME_FUNCTION FunctionEntry;
+} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY;
+
+typedef struct _UNWIND_HISTORY_TABLE
+{
+    DWORD   Count;
+    BYTE    LocalHint;
+    BYTE    GlobalHint;
+    BYTE    Search;
+    BYTE    Once;
+    DWORD64 LowAddress;
+    DWORD64 HighAddress;
+    UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
+} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
+
+typedef struct _DISPATCHER_CONTEXT
+{
+    ULONG_PTR             ControlPc;
+    ULONG_PTR             ImageBase;
+    PRUNTIME_FUNCTION     FunctionEntry;
+    ULONG_PTR             EstablisherFrame;
+    ULONG_PTR             TargetPc;
+    PCONTEXT              ContextRecord;
+    PEXCEPTION_ROUTINE    LanguageHandler;
+    PVOID                 HandlerData;
+    PUNWIND_HISTORY_TABLE HistoryTable;
+    DWORD                 ScopeIndex;
+    BOOLEAN               ControlPcIsUnwound;
+    PBYTE                 NonVolatileRegisters;
+} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+
+typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD64);
+typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD64);
+
+#define UNW_FLAG_NHANDLER  0
+#define UNW_FLAG_EHANDLER  1
+#define UNW_FLAG_UHANDLER  2
+
+#endif /* __aarch64__ */
 
 #if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
 
@@ -2482,6 +1829,8 @@
 NTSYSAPI BOOLEAN CDECL  RtlInstallFunctionTableCallback(DWORD_PTR,DWORD_PTR,DWORD,PGET_RUNTIME_FUNCTION_CALLBACK,PVOID,PCWSTR);
 NTSYSAPI PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry(DWORD_PTR,DWORD_PTR*,UNWIND_HISTORY_TABLE*);
 NTSYSAPI void    WINAPI RtlUnwindEx(PVOID,PVOID,struct _EXCEPTION_RECORD*,PVOID,CONTEXT*,UNWIND_HISTORY_TABLE*);
+NTSYSAPI PVOID   WINAPI RtlVirtualUnwind(DWORD,ULONG_PTR,ULONG_PTR,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,ULONG_PTR*,KNONVOLATILE_CONTEXT_POINTERS*);
+
 #endif
 
 /*
@@ -6442,6 +5791,7 @@
 typedef struct _COMPATIBILITY_CONTEXT_ELEMENT {
     GUID Id;
     ACTCTX_COMPATIBILITY_ELEMENT_TYPE Type;
+    ULONGLONG MaxVersionTested;
 } COMPATIBILITY_CONTEXT_ELEMENT, *PCOMPATIBILITY_CONTEXT_ELEMENT;
 
 #if !defined(__WINESRC__) && (defined(_MSC_EXTENSIONS) || ((defined(__GNUC__) && __GNUC__ >= 3)))
@@ -6726,6 +6076,47 @@
     } DUMMYUNIONNAME;
 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
 
+typedef enum _CPU_SET_INFORMATION_TYPE
+{
+    CpuSetInformation,
+} CPU_SET_INFORMATION_TYPE, *PCPU_SET_INFORMATION_TYPE;
+
+typedef struct _SYSTEM_CPU_SET_INFORMATION
+{
+    DWORD Size;
+    CPU_SET_INFORMATION_TYPE Type;
+    union
+    {
+        struct
+        {
+            DWORD Id;
+            WORD Group;
+            BYTE LogicalProcessorIndex;
+            BYTE CoreIndex;
+            BYTE LastLevelCacheIndex;
+            BYTE NumaNodeIndex;
+            BYTE EfficiencyClass;
+            union
+            {
+                BYTE AllFlags;
+                struct
+                {
+                    BYTE Parked : 1;
+                    BYTE Allocated : 1;
+                    BYTE AllocatedToTargetProcess : 1;
+                    BYTE RealTime : 1;
+                    BYTE ReservedFlags : 4;
+                } DUMMYSTRUCTNAME;
+            } DUMMYUNIONNAME2;
+            union {
+            DWORD Reserved;
+            BYTE  SchedulingClass;
+            };
+            DWORD64 AllocationTag;
+        } CpuSet;
+    } DUMMYUNIONNAME;
+} SYSTEM_CPU_SET_INFORMATION, *PSYSTEM_CPU_SET_INFORMATION;
+
 /* Threadpool things */
 typedef DWORD TP_VERSION,*PTP_VERSION;
 
diff --git a/mingw-w64-tools/widl/src/header.c b/mingw-w64-tools/widl/src/header.c
index a5e5d6c..1a69b29 100644
--- a/mingw-w64-tools/widl/src/header.c
+++ b/mingw-w64-tools/widl/src/header.c
@@ -872,11 +872,25 @@
 
 static void write_typedef(FILE *header, type_t *type, int declonly)
 {
-  type_t *t = type_alias_get_aliasee_type(type);
-  if (winrt_mode && t->namespace && !is_global_namespace(t->namespace)) return;
-  fprintf(header, "typedef ");
-  write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->name, NAME_DEFAULT);
-  fprintf(header, ";\n");
+    type_t *t = type_alias_get_aliasee_type(type);
+    if (winrt_mode && t->namespace && !is_global_namespace(t->namespace))
+    {
+        fprintf(header, "#ifdef __cplusplus\n");
+        write_namespace_start(header, t->namespace);
+        indent(header, 0);
+    }
+    fprintf(header, "typedef ");
+    write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->name, NAME_DEFAULT);
+    fprintf(header, ";\n");
+    if (winrt_mode && t->namespace && !is_global_namespace(t->namespace))
+    {
+        write_namespace_end(header, t->namespace);
+        fprintf(header, "#else /* __cplusplus */\n");
+        fprintf(header, "typedef ");
+        write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->c_name, NAME_C);
+        fprintf(header, ";\n");
+        fprintf(header, "#endif /* __cplusplus */\n\n");
+    }
 }
 
 int is_const_decl(const var_t *var)
diff --git a/mingw-w64-tools/widl/src/widl.c b/mingw-w64-tools/widl/src/widl.c
index 88c01a3..3f1c127 100644
--- a/mingw-w64-tools/widl/src/widl.c
+++ b/mingw-w64-tools/widl/src/widl.c
@@ -212,6 +212,31 @@
     { NULL, 0, NULL, 0 }
 };
 
+static const struct
+{
+    const char     *name;
+    enum target_cpu cpu;
+} cpu_names[] =
+{
+    { "i386",           CPU_x86 },
+    { "i486",           CPU_x86 },
+    { "i586",           CPU_x86 },
+    { "i686",           CPU_x86 },
+    { "i786",           CPU_x86 },
+    { "amd64",          CPU_x86_64 },
+    { "x86_64",         CPU_x86_64 },
+    { "powerpc",        CPU_POWERPC },
+    { "powerpc64",      CPU_POWERPC64 },
+    { "powerpc64le",    CPU_POWERPC64 },
+    { "arm",            CPU_ARM },
+    { "armv5",          CPU_ARM },
+    { "armv6",          CPU_ARM },
+    { "armv7",          CPU_ARM },
+    { "armv7a",         CPU_ARM },
+    { "arm64",          CPU_ARM64 },
+    { "aarch64",        CPU_ARM64 },
+};
+
 static void rm_tempfile(void);
 
 enum stub_mode get_stub_mode(void)
@@ -275,51 +300,54 @@
     wpp_add_cmdline_define(version_str);
 }
 
+static void set_cpu( const char *cpu, int error_out )
+{
+    unsigned int i;
+    for (i = 0; i < ARRAY_SIZE( cpu_names ); i++)
+    {
+        if (!strcmp( cpu_names[i].name, cpu ))
+        {
+            target_cpu = cpu_names[i].cpu;
+            return;
+        }
+    }
+    if (error_out)
+        error( "Unrecognized CPU '%s'\n", cpu );
+}
+
+/* Set the target platform based on a potential prefix of the executable name.
+ * If not found, or not matching a known CPU name, just proceed silently. */
+static void init_argv0_target( const char *argv0 )
+{
+    char *p, *name;
+
+    if ((p = strrchr(argv0, '/')) != NULL)
+        argv0 = p + 1;
+    if ((p = strrchr(argv0, '\\')) != NULL)
+        argv0 = p + 1;
+
+    name = xstrdup( argv0 );
+    if (!(p = strchr(name, '-')))
+    {
+        free( name );
+        return;
+    }
+    *p = 0;
+    set_cpu( name, 0 );
+    free( name );
+}
+
 /* set the target platform */
 static void set_target( const char *target )
 {
-    static const struct
-    {
-        const char     *name;
-        enum target_cpu cpu;
-    } cpu_names[] =
-    {
-        { "i386",           CPU_x86 },
-        { "i486",           CPU_x86 },
-        { "i586",           CPU_x86 },
-        { "i686",           CPU_x86 },
-        { "i786",           CPU_x86 },
-        { "amd64",          CPU_x86_64 },
-        { "x86_64",         CPU_x86_64 },
-        { "powerpc",        CPU_POWERPC },
-        { "powerpc64",      CPU_POWERPC64 },
-        { "powerpc64le",    CPU_POWERPC64 },
-        { "arm",            CPU_ARM },
-        { "armv5",          CPU_ARM },
-        { "armv6",          CPU_ARM },
-        { "armv7",          CPU_ARM },
-        { "armv7a",         CPU_ARM },
-        { "arm64",          CPU_ARM64 },
-        { "aarch64",        CPU_ARM64 },
-    };
-
-    unsigned int i;
     char *p, *spec = xstrdup( target );
 
     /* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
 
     if (!(p = strchr( spec, '-' ))) error( "Invalid target specification '%s'\n", target );
     *p++ = 0;
-    for (i = 0; i < ARRAY_SIZE( cpu_names ); i++)
-    {
-        if (!strcmp( cpu_names[i].name, spec ))
-        {
-            target_cpu = cpu_names[i].cpu;
-            free( spec );
-            return;
-        }
-    }
-    error( "Unrecognized CPU '%s'\n", spec );
+    set_cpu( spec, 1 );
+    free( spec );
 }
 
 /* clean things up when aborting on a signal */
@@ -608,6 +636,7 @@
   signal( SIGHUP, exit_on_signal );
 #endif
   init_argv0_dir( argv[0] );
+  init_argv0_target( argv[0] );
 
   now = time(NULL);
 
@@ -790,8 +819,12 @@
       if (pointer_size == 4) target_cpu = CPU_x86;
       else pointer_size = 8;
       break;
+  case CPU_ARM:
+      if (pointer_size == 8) target_cpu = CPU_ARM64;
+      else pointer_size = 4;
+      break;
   case CPU_ARM64:
-      if (pointer_size == 4) error( "Cannot build 32-bit code for this CPU\n" );
+      if (pointer_size == 4) target_cpu = CPU_ARM;
       pointer_size = 8;
       break;
   case CPU_POWERPC64: