From: Soham Nandy <soham.nandy2006@gmail.com> Treat nonvolatile general-purpose registers as clobbered after invoking a vectored exception handler. Some applications use VEH callbacks restore nonvolatile registers before returning. Clobbering the general purpose registers allows the compiler to preserves caller state across the call boundary. --- dlls/ntdll/exception.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index a2b7513bfa3..edb67621f66 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -173,6 +173,13 @@ static LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) TRACE( "calling handler at %p code=%lx flags=%lx\n", func, rec->ExceptionCode, rec->ExceptionFlags ); ret = func( &except_ptrs ); + +#if defined(__WINE_PE_BUILD) && defined(__x86_64__) && !defined(__arm64ec__) + /* + * Some VEH callbacks restore nonvolatile registers before returning. + */ + __asm__ __volatile__( "" ::: "rbx", "rsi", "rdi", "rbp", "r12", "r13", "r14", "r15", "memory" ); +#endif TRACE( "handler at %p returned %lx\n", func, ret ); RtlEnterCriticalSection( &vectored_handlers_section ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11069