From: Jacek Caban jacek@codeweavers.com
--- dlls/wow64/syscall.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 73fb84c6d2e..8cb5f92c245 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -850,6 +850,8 @@ void WINAPI Wow64ApcRoutine( ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3, CON NTSTATUS WINAPI Wow64KiUserCallbackDispatcher( ULONG id, void *args, ULONG len, void **ret_ptr, ULONG *ret_len ) { + TEB32 *teb32 = (TEB32 *)((char *)NtCurrentTeb() + NtCurrentTeb()->WowTebOffset); + ULONG teb_frame = teb32->Tib.ExceptionList; struct user_callback_frame frame;
frame.prev_frame = NtCurrentTeb()->TlsSlots[WOW64_TLS_USERCALLBACKDATA]; @@ -916,6 +918,7 @@ NTSTATUS WINAPI Wow64KiUserCallbackDispatcher( ULONG id, void *args, ULONG len, break; }
+ teb32->Tib.ExceptionList = teb_frame; NtCurrentTeb()->TlsSlots[WOW64_TLS_USERCALLBACKDATA] = frame.prev_frame; NtCurrentTeb()->TlsSlots[WOW64_TLS_TEMPLIST] = frame.temp_list; return frame.status;