Jacek Caban : wow64win: Set last error in 32-bit TEB in wow64 thunks.
Alexandre Julliard
julliard at winehq.org
Wed Aug 10 14:53:21 CDT 2022
Module: wine
Branch: master
Commit: 0d4817fadbcdf9b3ee785bcc6239eb4e99db403f
URL: https://gitlab.winehq.org/wine/wine/-/commit/0d4817fadbcdf9b3ee785bcc6239eb4e99db403f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sat Jul 30 15:32:27 2022 +0200
wow64win: Set last error in 32-bit TEB in wow64 thunks.
---
dlls/wow64win/user.c | 40 ++++++++++++++++++++--------------------
dlls/wow64win/wow64win_private.h | 7 +++++++
2 files changed, 27 insertions(+), 20 deletions(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 4f54921ff02..c69c8fd6d6c 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -722,13 +722,13 @@ NTSTATUS WINAPI wow64_NtUserFlashWindowEx( UINT *args )
if (!info32)
{
- SetLastError( ERROR_NOACCESS );
+ set_last_error32( ERROR_NOACCESS );
return FALSE;
}
if (info32->cbSize != sizeof(*info32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return FALSE;
}
@@ -962,7 +962,7 @@ NTSTATUS WINAPI wow64_NtUserGetGUIThreadInfo( UINT *args )
if (info32->cbSize != sizeof(*info32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return FALSE;
}
@@ -1104,7 +1104,7 @@ NTSTATUS WINAPI wow64_NtUserGetMenuBarInfo( UINT *args )
if (info32->cbSize != sizeof(*info32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return FALSE;
}
@@ -1210,7 +1210,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputBuffer( UINT *args )
if (header_size != sizeof(RAWINPUTHEADER32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return ~0u;
}
@@ -1230,7 +1230,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputData( UINT *args )
if (header_size != sizeof(RAWINPUTHEADER32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return ~0u;
}
@@ -1246,7 +1246,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputData( UINT *args )
data_size64 = *data_size + sizeof(RAWINPUTHEADER);
if (!(data64 = Wow64AllocateTemp( data_size64 )))
{
- SetLastError( STATUS_NO_MEMORY );
+ set_last_error32( STATUS_NO_MEMORY );
return ~0u;
}
@@ -1256,7 +1256,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputData( UINT *args )
body_size = ret - sizeof(RAWINPUTHEADER);
if (*data_size < sizeof(RAWINPUTHEADER32) + body_size)
{
- SetLastError( ERROR_INSUFFICIENT_BUFFER );
+ set_last_error32( ERROR_INSUFFICIENT_BUFFER );
return ~0u;
}
@@ -1292,7 +1292,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputData( UINT *args )
if (*data_size < sizeof(RAWINPUTHEADER32))
{
- SetLastError( ERROR_INSUFFICIENT_BUFFER );
+ set_last_error32( ERROR_INSUFFICIENT_BUFFER );
return ~0u;
}
@@ -1306,7 +1306,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputData( UINT *args )
}
default:
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return ~0u;
}
}
@@ -1329,7 +1329,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputDeviceList( UINT *args )
if (size != sizeof(RAWINPUTDEVICELIST32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return ~0u;
}
@@ -1340,7 +1340,7 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputDeviceList( UINT *args )
if (!(devices64 = Wow64AllocateTemp( (*count) * sizeof(*devices64) )))
{
- SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ set_last_error32( ERROR_NOT_ENOUGH_MEMORY );
return ~0u;
}
@@ -1376,7 +1376,7 @@ NTSTATUS WINAPI wow64_NtUserRegisterClassExWOW( UINT *args )
if (wc32->cbSize != sizeof(*wc32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return 0;
}
@@ -1408,7 +1408,7 @@ NTSTATUS WINAPI wow64_NtUserGetRegisteredRawInputDevices( UINT *args )
if (size != sizeof(RAWINPUTDEVICE32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return ~0u;
}
@@ -1419,7 +1419,7 @@ NTSTATUS WINAPI wow64_NtUserGetRegisteredRawInputDevices( UINT *args )
if (!(devices64 = Wow64AllocateTemp( (*count) * sizeof(*devices64) )))
{
- SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ set_last_error32( ERROR_NOT_ENOUGH_MEMORY );
return ~0u;
}
@@ -1662,7 +1662,7 @@ NTSTATUS WINAPI wow64_NtUserMsgWaitForMultipleObjectsEx( UINT *args )
if (count > ARRAYSIZE(handles))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return WAIT_FAILED;
}
for (i = 0; i < count; i++) handles[i] = UlongToHandle( handles32[i] );
@@ -1794,13 +1794,13 @@ NTSTATUS WINAPI wow64_NtUserRegisterRawInputDevices( UINT *args )
if (size != sizeof(RAWINPUTDEVICE32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return FALSE;
}
if (!(devices64 = Wow64AllocateTemp( count * sizeof(*devices64) )))
{
- SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ set_last_error32( ERROR_NOT_ENOUGH_MEMORY );
return FALSE;
}
@@ -1864,7 +1864,7 @@ NTSTATUS WINAPI wow64_NtUserSendInput( UINT *args )
if (size != sizeof(*inputs32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return 0;
}
@@ -2489,7 +2489,7 @@ NTSTATUS WINAPI wow64_NtUserTrackMouseEvent( UINT *args )
if (info32->cbSize != sizeof(*info32))
{
- SetLastError( ERROR_INVALID_PARAMETER );
+ set_last_error32( ERROR_INVALID_PARAMETER );
return FALSE;
}
diff --git a/dlls/wow64win/wow64win_private.h b/dlls/wow64win/wow64win_private.h
index 9127085b7b4..cf0b2b62e5f 100644
--- a/dlls/wow64win/wow64win_private.h
+++ b/dlls/wow64win/wow64win_private.h
@@ -124,4 +124,11 @@ static inline OBJECT_ATTRIBUTES *objattr_32to64( struct object_attr64 *out, cons
return &out->attr;
}
+static inline void set_last_error32( DWORD err )
+{
+ TEB *teb = NtCurrentTeb();
+ TEB32 *teb32 = (TEB32 *)((char *)teb + teb->WowTebOffset);
+ teb32->LastErrorValue = err;
+}
+
#endif /* __WOW64WIN_PRIVATE_H */
More information about the wine-cvs
mailing list