winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
January 2024
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
711 discussions
Start a n
N
ew thread
Hans Leidekker : bcrypt: Add support for retrieving DH parameters.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: 3bfccbc7e42c1edb54618ef29fa879e2fad36ed7 URL:
https://gitlab.winehq.org/wine/wine/-/commit/3bfccbc7e42c1edb54618ef29fa879…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Wed Dec 6 20:23:53 2023 +0100 bcrypt: Add support for retrieving DH parameters. --- dlls/bcrypt/bcrypt_internal.h | 6 ++++-- dlls/bcrypt/bcrypt_main.c | 17 +++++++++++++++++ dlls/bcrypt/gnutls.c | 41 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h index a31d170c621..a5dbeff4e8e 100644 --- a/dlls/bcrypt/bcrypt_internal.h +++ b/dlls/bcrypt/bcrypt_internal.h @@ -283,8 +283,10 @@ struct key_asymmetric_verify_params unsigned flags; }; -#define KEY_EXPORT_FLAG_PUBLIC 0x00000001 -#define KEY_EXPORT_FLAG_RSA_FULL 0x00000002 +#define KEY_EXPORT_FLAG_PUBLIC 0x00000001 +#define KEY_EXPORT_FLAG_RSA_FULL 0x00000002 +#define KEY_EXPORT_FLAG_DH_PARAMETERS 0x00000004 + struct key_asymmetric_export_params { struct key *key; diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index f58ddaf13aa..cce824ff602 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -917,6 +917,20 @@ static NTSTATUS get_hash_property( const struct hash *hash, const WCHAR *prop, U return status; } +static NTSTATUS get_dh_property( const struct key *key, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size ) +{ + struct key_asymmetric_export_params params; + + if (wcscmp( prop, BCRYPT_DH_PARAMETERS )) return STATUS_NOT_SUPPORTED; + + params.key = (struct key *)key; + params.flags = KEY_EXPORT_FLAG_DH_PARAMETERS; + params.buf = buf; + params.len = size; + params.ret_len = ret_size; + return UNIX_CALL( key_asymmetric_export, ¶ms ); +} + static NTSTATUS get_key_property( const struct key *key, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size ) { if (!wcscmp( prop, BCRYPT_KEY_STRENGTH )) @@ -940,6 +954,9 @@ static NTSTATUS get_key_property( const struct key *key, const WCHAR *prop, UCHA if (!wcscmp( prop, BCRYPT_AUTH_TAG_LENGTH )) return STATUS_NOT_SUPPORTED; return get_aes_property( key->u.s.mode, prop, buf, size, ret_size ); + case ALG_ID_DH: + return get_dh_property( key, prop, buf, size, ret_size ); + default: FIXME( "unsupported algorithm %u\n", key->alg_id ); return STATUS_NOT_IMPLEMENTED; diff --git a/dlls/bcrypt/gnutls.c b/dlls/bcrypt/gnutls.c index 0d912e7a2d7..4183aad6cec 100644 --- a/dlls/bcrypt/gnutls.c +++ b/dlls/bcrypt/gnutls.c @@ -1651,8 +1651,7 @@ static NTSTATUS key_export_dh( struct key *key, UCHAR *buf, ULONG len, ULONG *re return STATUS_INTERNAL_ERROR; } - ret = pgnutls_privkey_export_dh_raw( key_data(key)->a.privkey, params, &y, &x, 0 ); - if (ret) + if ((ret = pgnutls_privkey_export_dh_raw( key_data(key)->a.privkey, params, &y, &x, 0 ))) { pgnutls_perror( ret ); pgnutls_dh_params_deinit( params ); @@ -1686,6 +1685,40 @@ static NTSTATUS key_export_dh( struct key *key, UCHAR *buf, ULONG len, ULONG *re return STATUS_SUCCESS; } +static NTSTATUS key_export_dh_params( struct key *key, UCHAR *buf, ULONG len, ULONG *ret_len ) +{ + BCRYPT_DH_PARAMETER_HEADER *hdr = (BCRYPT_DH_PARAMETER_HEADER *)buf; + unsigned int size = sizeof(*hdr) + key->u.a.bitlen / 8 * 2; + gnutls_datum_t p, g; + NTSTATUS status = STATUS_SUCCESS; + UCHAR *dst; + int ret; + + if (!key_data(key)->a.dh_params) return STATUS_INVALID_PARAMETER; + + if ((ret = pgnutls_dh_params_export_raw( key_data(key)->a.dh_params, &p, &g, NULL ))) + { + pgnutls_perror( ret ); + return STATUS_INTERNAL_ERROR; + } + + *ret_len = size; + if (len < size) status = STATUS_BUFFER_TOO_SMALL; + else if (buf) + { + hdr->cbLength = size; + hdr->dwMagic = BCRYPT_DH_PARAMETERS_MAGIC; + hdr->cbKeyLength = key->u.a.bitlen / 8; + + dst = (UCHAR *)(hdr + 1); + dst += export_gnutls_datum( dst, hdr->cbKeyLength, &p, 1 ); + dst += export_gnutls_datum( dst, hdr->cbKeyLength, &g, 1 ); + } + + free( p.data ); free( g.data ); + return status; +} + static NTSTATUS key_asymmetric_export( void *args ) { const struct key_asymmetric_export_params *params = args; @@ -1720,7 +1753,9 @@ static NTSTATUS key_asymmetric_export( void *args ) return STATUS_NOT_IMPLEMENTED; case ALG_ID_DH: - if (flags & KEY_EXPORT_FLAG_PUBLIC) + if (flags & KEY_EXPORT_FLAG_DH_PARAMETERS) + return key_export_dh_params( key, params->buf, params->len, params->ret_len ); + if (flags & KEY_EXPORT_FLAG_PUBLIC) return key_export_dh_public( key, params->buf, params->len, params->ret_len ); return key_export_dh( key, params->buf, params->len, params->ret_len );
1
0
0
0
Hans Leidekker : bcrypt: Add support for setting DH parameters.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: a9193a200faeaaf9025506e07c003846b0343a7f URL:
https://gitlab.winehq.org/wine/wine/-/commit/a9193a200faeaaf9025506e07c0038…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Wed Dec 6 19:59:45 2023 +0100 bcrypt: Add support for setting DH parameters. --- dlls/bcrypt/bcrypt_internal.h | 6 ++++-- dlls/bcrypt/bcrypt_main.c | 15 +++++++++++++++ dlls/bcrypt/gnutls.c | 41 ++++++++++++++++++++++++++++++++++++++--- include/bcrypt.h | 13 +++++++++++++ 4 files changed, 70 insertions(+), 5 deletions(-) diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h index cfbc5d2ac83..a31d170c621 100644 --- a/dlls/bcrypt/bcrypt_internal.h +++ b/dlls/bcrypt/bcrypt_internal.h @@ -187,7 +187,7 @@ struct key { struct object hdr; enum alg_id alg_id; - UINT64 private[2]; /* private data for backend */ + UINT64 private[3]; /* private data for backend */ union { struct key_symmetric s; @@ -294,7 +294,9 @@ struct key_asymmetric_export_params ULONG *ret_len; }; -#define KEY_IMPORT_FLAG_PUBLIC 0x00000001 +#define KEY_IMPORT_FLAG_PUBLIC 0x00000001 +#define KEY_IMPORT_FLAG_DH_PARAMETERS 0x00000002 + struct key_asymmetric_import_params { struct key *key; diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index 52066a32c74..f58ddaf13aa 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -887,6 +887,21 @@ static NTSTATUS set_key_property( struct key *key, const WCHAR *prop, UCHAR *val key->u.a.bitlen = *(DWORD*)value; return STATUS_SUCCESS; } + else if (!wcscmp( prop, BCRYPT_DH_PARAMETERS )) + { + BCRYPT_DH_PARAMETER_HEADER *hdr = (BCRYPT_DH_PARAMETER_HEADER *)value; + struct key_asymmetric_import_params params; + + if (key->alg_id != ALG_ID_DH || size < sizeof(*hdr) || hdr->cbLength != size || + hdr->dwMagic != BCRYPT_DH_PARAMETERS_MAGIC || hdr->cbKeyLength != key->u.a.bitlen / 8) + return STATUS_INVALID_PARAMETER; + + params.key = key; + params.flags = KEY_IMPORT_FLAG_DH_PARAMETERS; + params.buf = value; + params.len = size; + return UNIX_CALL( key_asymmetric_import, ¶ms ); + } FIXME( "unsupported key property %s\n", debugstr_w(prop) ); return STATUS_NOT_IMPLEMENTED; diff --git a/dlls/bcrypt/gnutls.c b/dlls/bcrypt/gnutls.c index 68f84a553d2..0d912e7a2d7 100644 --- a/dlls/bcrypt/gnutls.c +++ b/dlls/bcrypt/gnutls.c @@ -84,8 +84,9 @@ union key_data gnutls_cipher_hd_t cipher; struct { - gnutls_privkey_t privkey; - gnutls_pubkey_t pubkey; + gnutls_privkey_t privkey; + gnutls_pubkey_t pubkey; + gnutls_dh_params_t dh_params; } a; }; C_ASSERT( sizeof(union key_data) <= sizeof(((struct key *)0)->private) ); @@ -1833,6 +1834,36 @@ static NTSTATUS key_import_dh( struct key *key, UCHAR *buf, ULONG len ) return STATUS_SUCCESS; } +static NTSTATUS key_import_dh_params( struct key *key, UCHAR *buf, ULONG len ) +{ + BCRYPT_DH_PARAMETER_HEADER *dh_header = (BCRYPT_DH_PARAMETER_HEADER *)buf; + gnutls_dh_params_t params; + gnutls_datum_t p, g; + int ret; + + if ((ret = pgnutls_dh_params_init( ¶ms ))) + { + pgnutls_perror( ret ); + return STATUS_INTERNAL_ERROR; + } + + p.data = (unsigned char *)(dh_header + 1); + p.size = dh_header->cbKeyLength; + g.data = p.data + dh_header->cbKeyLength; + g.size = dh_header->cbKeyLength; + + if ((ret = pgnutls_dh_params_import_raw( params, &p, &g ))) + { + pgnutls_perror( ret ); + pgnutls_dh_params_deinit( params ); + return STATUS_INTERNAL_ERROR; + } + + if (key_data(key)->a.dh_params) pgnutls_dh_params_deinit( key_data(key)->a.dh_params ); + key_data(key)->a.dh_params = params; + return STATUS_SUCCESS; +} + static NTSTATUS key_asymmetric_import( void *args ) { const struct key_asymmetric_import_params *params = args; @@ -1875,9 +1906,12 @@ static NTSTATUS key_asymmetric_import( void *args ) return STATUS_NOT_IMPLEMENTED; case ALG_ID_DH: + if (flags & KEY_IMPORT_FLAG_DH_PARAMETERS) + return key_import_dh_params( key, params->buf, params->len ); if (flags & KEY_IMPORT_FLAG_PUBLIC) return key_import_dh_public( key, params->buf, params->len ); - return key_import_dh( key, params->buf, params->len ); + ret = key_import_dh( key, params->buf, params->len ); + break; default: FIXME( "algorithm %u not yet supported\n", key->alg_id ); @@ -2300,6 +2334,7 @@ static NTSTATUS key_asymmetric_destroy( void *args ) if (key_data(key)->a.privkey) pgnutls_privkey_deinit( key_data(key)->a.privkey ); if (key_data(key)->a.pubkey) pgnutls_pubkey_deinit( key_data(key)->a.pubkey ); + if (key_data(key)->a.dh_params) pgnutls_dh_params_deinit( key_data(key)->a.dh_params ); return STATUS_SUCCESS; } diff --git a/include/bcrypt.h b/include/bcrypt.h index 7f768f61679..462c43a7021 100644 --- a/include/bcrypt.h +++ b/include/bcrypt.h @@ -118,6 +118,8 @@ typedef LONG NTSTATUS; #define BCRYPT_KDF_TLS_PRF L"TLS_PRF" #define BCRYPT_KDF_SP80056A_CONCAT L"SP800_56A_CONCAT" #define BCRYPT_KDF_RAW_SECRET L"TRUNCATE" + +#define BCRYPT_DH_PARAMETERS L"DHParameters" #else static const WCHAR BCRYPT_ALGORITHM_NAME[] = {'A','l','g','o','r','i','t','h','m','N','a','m','e',0}; static const WCHAR BCRYPT_AUTH_TAG_LENGTH[] = {'A','u','t','h','T','a','g','L','e','n','g','t','h',0}; @@ -198,6 +200,8 @@ static const WCHAR BCRYPT_KDF_HMAC[] = {'H','M','A','C',0}; static const WCHAR BCRYPT_KDF_TLS_PRF[] = {'T','L','S','_','P','R','F',0}; static const WCHAR BCRYPT_KDF_SP80056A_CONCAT[] = {'S','P','8','0','0','_','5','6','A','_','C','O','N','C','A','T',0}; static const WCHAR BCRYPT_KDF_RAW_SECRET[] = {'T','R','U','N','C','A','T','E',0}; + +static const WCHAR BCRYPT_DH_PARAMETERS[] = {'D','H','P','a','r','a','m','e','t','e','r','s',0}; #endif #define BCRYPT_ECDSA_PUBLIC_P256_MAGIC 0x31534345 @@ -363,6 +367,15 @@ typedef struct _BCRYPT_DH_KEY_BLOB ULONG cbKey; } BCRYPT_DH_KEY_BLOB, *PBCRYPT_DH_KEY_BLOB; +#define BCRYPT_DH_PARAMETERS_MAGIC 0x4d504844 + +typedef struct _BCRYPT_DH_PARAMETER_HEADER +{ + ULONG cbLength; + ULONG dwMagic; + ULONG cbKeyLength; +} BCRYPT_DH_PARAMETER_HEADER; + #define BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION 1 #define BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG 0x00000001
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the window hook callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: 2c8b60af43fb8fee3b8485eb7b3374e494dfd6f4 URL:
https://gitlab.winehq.org/wine/wine/-/commit/2c8b60af43fb8fee3b8485eb7b3374…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 15:16:13 2024 +0100 user32: Return result through NtCallbackReturn for the window hook callback. --- dlls/user32/hook.c | 14 ++++++++++++-- dlls/user32/user_private.h | 2 +- dlls/win32u/hook.c | 11 ++++++++--- dlls/wow64win/user.c | 20 +++++++++++--------- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/dlls/user32/hook.c b/dlls/user32/hook.c index 024bb5b7116..4f5b8d13973 100644 --- a/dlls/user32/hook.c +++ b/dlls/user32/hook.c @@ -62,6 +62,8 @@ * WH_MOUSE_LL Implemented but should use SendMessage instead */ +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "user_private.h" #include "wine/asm.h" #include "wine/debug.h" @@ -452,8 +454,9 @@ BOOL WINAPI User32CallWinEventHook( const struct win_event_hook_params *params, return TRUE; } -BOOL WINAPI User32CallWindowsHook( struct win_hook_params *params, ULONG size ) +NTSTATUS WINAPI User32CallWindowsHook( void *args, ULONG size ) { + struct win_hook_params *params = args; HOOKPROC proc = params->proc; HMODULE free_module = 0; void *ret_ptr = NULL; @@ -514,7 +517,14 @@ BOOL WINAPI User32CallWindowsHook( struct win_hook_params *params, ULONG size ) params->prev_unicode, params->next_unicode ); if (free_module) FreeLibrary( free_module ); - return NtCallbackReturn( ret_ptr, ret_size, ret ); + + if (ret_size) + { + LRESULT *result_ptr = (LRESULT *)ret_ptr - 1; + *result_ptr = ret; + return NtCallbackReturn( result_ptr, sizeof(*result_ptr) + ret_size, STATUS_SUCCESS ); + } + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); } /*********************************************************************** diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 9022e44b7d2..40d67ac468d 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -85,7 +85,7 @@ NTSTATUS WINAPI User32CallEnumDisplayMonitor( void *args, ULONG size ); BOOL WINAPI User32CallSendAsyncCallback( const struct send_async_params *params, ULONG size ); BOOL WINAPI User32CallWinEventHook( const struct win_event_hook_params *params, ULONG size ); BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ); -BOOL WINAPI User32CallWindowsHook( struct win_hook_params *params, ULONG size ); +NTSTATUS WINAPI User32CallWindowsHook( void *args, ULONG size ); BOOL WINAPI User32InitBuiltinClasses( const struct win_hook_params *params, ULONG size ); /* message spy definitions */ diff --git a/dlls/win32u/hook.c b/dlls/win32u/hook.c index 378eda40abb..fab2b960fa5 100644 --- a/dlls/win32u/hook.c +++ b/dlls/win32u/hook.c @@ -330,9 +330,14 @@ static LRESULT call_hook( struct win_hook_params *info, const WCHAR *module, siz thread_info->hook = params->handle; thread_info->hook_unicode = params->next_unicode; thread_info->hook_call_depth++; - ret = KeUserModeCallback( NtUserCallWindowsHook, params, size, &ret_ptr, &ret_len ); - if (ret_len && ret_len == lparam_ret_size) - memcpy( (void *)params->lparam, ret_ptr, ret_len ); + if (!KeUserModeCallback( NtUserCallWindowsHook, params, size, &ret_ptr, &ret_len ) && + ret_len >= sizeof(ret)) + { + LRESULT *result_ptr = ret_ptr; + ret = *result_ptr; + if (ret_len == sizeof(ret) + lparam_ret_size) + memcpy( (void *)params->lparam, result_ptr + 1, ret_len - sizeof(ret) ); + } thread_info->hook = prev; thread_info->hook_unicode = prev_unicode; thread_info->hook_call_depth--; diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index d1f8a04e959..2dd811578f5 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1113,8 +1113,9 @@ static NTSTATUS WINAPI wow64_NtUserCallWindowsHook( void *arg, ULONG size ) struct win_hook_params32 params32; UINT module_len, size32, offset; void *ret_ptr; - ULONG ret_len; - NTSTATUS ret; + LRESULT *result_ptr = arg; + ULONG ret_len, ret_size = 0; + NTSTATUS status; module_len = wcslen( params->module ); size32 = FIELD_OFFSET( struct win_hook_params32, module[module_len + 1] ); @@ -1142,22 +1143,23 @@ static NTSTATUS WINAPI wow64_NtUserCallWindowsHook( void *arg, ULONG size ) size - offset, (char *)arg + size32 ); } - ret = Wow64KiUserCallbackDispatcher( NtUserCallWindowsHook, arg, size32, &ret_ptr, &ret_len ); + status = Wow64KiUserCallbackDispatcher( NtUserCallWindowsHook, arg, size32, &ret_ptr, &ret_len ); + if (status || ret_len < sizeof(LONG)) return status; switch (params32.id) { case WH_SYSMSGFILTER: case WH_MSGFILTER: case WH_GETMESSAGE: - if (ret_len == sizeof(MSG32)) + if (ret_len == sizeof(MSG32) + sizeof(LONG)) { - MSG msg; - msg_32to64( &msg, ret_ptr ); - return NtCallbackReturn( &msg, sizeof(msg), ret ); + msg_32to64( (MSG *)(result_ptr + 1), (MSG32 *)((LONG *)ret_ptr + 1) ); + ret_size = sizeof(MSG); } + break; } - - return ret; + *result_ptr = *(LONG *)ret_ptr; + return NtCallbackReturn( result_ptr, sizeof(*result_ptr) + ret_size, status ); } static NTSTATUS WINAPI wow64_NtUserCopyImage( void *arg, ULONG size )
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the enum monitors callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: 3f9de12980c65b5accf39483b703788fc040f307 URL:
https://gitlab.winehq.org/wine/wine/-/commit/3f9de12980c65b5accf39483b70378…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 15:07:39 2024 +0100 user32: Return result through NtCallbackReturn for the enum monitors callback. --- dlls/user32/sysparams.c | 13 +++++++++---- dlls/user32/user_private.h | 2 +- dlls/win32u/sysparams.c | 13 ++++++------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index b941f126a58..18e02f1524b 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "user_private.h" #include "controls.h" #include "wine/asm.h" @@ -849,14 +851,17 @@ __ASM_GLOBAL_FUNC( enum_mon_callback_wrapper, "ret" ) #endif /* __i386__ */ -BOOL WINAPI User32CallEnumDisplayMonitor( struct enum_display_monitor_params *params, ULONG size ) +NTSTATUS WINAPI User32CallEnumDisplayMonitor( void *args, ULONG size ) { + struct enum_display_monitor_params *params = args; + BOOL ret; #ifdef __i386__ - return enum_mon_callback_wrapper( params->proc, params->monitor, params->hdc, - ¶ms->rect, params->lparam ); + ret = enum_mon_callback_wrapper( params->proc, params->monitor, params->hdc, + ¶ms->rect, params->lparam ); #else - return params->proc( params->monitor, params->hdc, ¶ms->rect, params->lparam ); + ret = params->proc( params->monitor, params->hdc, ¶ms->rect, params->lparam ); #endif + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); } /*********************************************************************** diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 50d4005d973..9022e44b7d2 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -81,7 +81,7 @@ extern ATOM get_class_info( HINSTANCE instance, const WCHAR *name, WNDCLASSEXW * /* kernel callbacks */ -BOOL WINAPI User32CallEnumDisplayMonitor( struct enum_display_monitor_params *params, ULONG size ); +NTSTATUS WINAPI User32CallEnumDisplayMonitor( void *args, ULONG size ); BOOL WINAPI User32CallSendAsyncCallback( const struct send_async_params *params, ULONG size ); BOOL WINAPI User32CallWinEventHook( const struct win_event_hook_params *params, ULONG size ); BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ); diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index a9563eaff84..e2c5b10da9e 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -3435,18 +3435,17 @@ BOOL WINAPI NtUserEnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPROC proc params.proc = proc; params.hdc = hdc; params.lparam = lparam; - for (i = 0; i < count; i++) + for (i = 0; i < count && ret; i++) { void *ret_ptr; ULONG ret_len; + NTSTATUS status; params.monitor = enum_info[i].handle; params.rect = enum_info[i].rect; - if (!KeUserModeCallback( NtUserCallEnumDisplayMonitor, ¶ms, sizeof(params), - &ret_ptr, &ret_len )) - { - ret = FALSE; - break; - } + status = KeUserModeCallback( NtUserCallEnumDisplayMonitor, ¶ms, sizeof(params), + &ret_ptr, &ret_len ); + if (!status && ret_len == sizeof(ret)) ret = *(BOOL *)ret_ptr; + else ret = FALSE; } if (enum_info != enum_buf) free( enum_info ); return ret;
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the draw text callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: a9e42169ca36e057bb75a65e573fd41e7fc10a7c URL:
https://gitlab.winehq.org/wine/wine/-/commit/a9e42169ca36e057bb75a65e573fd4…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 15:04:41 2024 +0100 user32: Return result through NtCallbackReturn for the draw text callback. --- dlls/user32/user_main.c | 10 ++++++---- dlls/win32u/font.c | 14 ++++++++++---- dlls/wow64win/user.c | 7 +------ include/ntuser.h | 5 +++++ 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 045f95b3619..f1b169a9741 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -125,13 +125,15 @@ static NTSTATUS WINAPI User32DrawScrollBar( const struct draw_scroll_bar_params return 0; } -static NTSTATUS WINAPI User32DrawText( struct draw_text_params *params, ULONG size ) +static NTSTATUS WINAPI User32DrawText( void *args, ULONG size ) { - int ret; + const struct draw_text_params *params = args; + struct draw_text_result result; size -= FIELD_OFFSET( struct draw_text_params, str ); - ret = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), ¶ms->rect, params->flags ); - return NtCallbackReturn( ¶ms->rect, sizeof(params->rect), ret ); + result.rect = params->rect; + result.height = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), &result.rect, params->flags ); + return NtCallbackReturn( &result, sizeof(result), STATUS_SUCCESS ); } static NTSTATUS WINAPI User32ImmProcessKey( const struct imm_process_key_params *params, ULONG size ) diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index af1a9b97f67..9ee89f1b5c4 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -7076,9 +7076,10 @@ BOOL WINAPI NtGdiGetCharWidthInfo( HDC hdc, struct char_width_info *info ) INT WINAPI DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT *rect, UINT flags ) { struct draw_text_params *params; + struct draw_text_result *result; ULONG ret_len, size; - void *ret_ptr; - int ret; + NTSTATUS status; + int ret = 0; if (count == -1) count = wcslen( str ); size = FIELD_OFFSET( struct draw_text_params, str[count] ); @@ -7087,8 +7088,13 @@ INT WINAPI DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT *rect, UINT fla params->rect = *rect; params->flags = flags; if (count) memcpy( params->str, str, count * sizeof(WCHAR) ); - ret = KeUserModeCallback( NtUserDrawText, params, size, &ret_ptr, &ret_len ); - if (ret_len == sizeof(*rect)) *rect = *(const RECT *)ret_ptr; + + status = KeUserModeCallback( NtUserDrawText, params, size, (void **)&result, &ret_len ); + if (!status && ret_len == sizeof(*result)) + { + ret = result->height; + *rect = result->rect; + } free( params ); return ret; } diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 939155b7d41..d1f8a04e959 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1266,18 +1266,13 @@ static NTSTATUS WINAPI wow64_NtUserDrawText( void *arg, ULONG size ) struct draw_text_params *params = arg; struct draw_text_params32 *params32; ULONG offset = offsetof( struct draw_text_params, str ) - offsetof( struct draw_text_params32, str ); - ULONG ret_len; - void *ret_ptr; - NTSTATUS ret; params32 = (struct draw_text_params32 *)((char *)params + offset); params32->flags = params->flags; params32->rect = params->rect; params32->count = params->count; params32->hdc = HandleToUlong( params->hdc ); - - ret = Wow64KiUserCallbackDispatcher( NtUserDrawText, params32, size - offset, &ret_ptr, &ret_len ); - return NtCallbackReturn( ret_ptr, ret_len, ret ); + return dispatch_callback( NtUserDrawText, params32, size - offset ); } static NTSTATUS WINAPI wow64_NtUserFreeCachedClipboardData( void *arg, ULONG size ) diff --git a/include/ntuser.h b/include/ntuser.h index e78ac3d03c2..31b93ef36e9 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -200,6 +200,11 @@ struct draw_text_params UINT flags; WCHAR str[1]; }; +struct draw_text_result +{ + int height; + RECT rect; +}; /* NtUserFreeCachedClipboardData params */ struct free_cached_data_params
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the load sys menu callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: ee106102c571c146e587ef0adfb2e63017fad949 URL:
https://gitlab.winehq.org/wine/wine/-/commit/ee106102c571c146e587ef0adfb2e6…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 15:02:04 2024 +0100 user32: Return result through NtCallbackReturn for the load sys menu callback. --- dlls/user32/user_main.c | 6 ++++-- dlls/win32u/menu.c | 8 ++++---- dlls/wow64win/user.c | 12 +++++++++++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 79809835b91..045f95b3619 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -154,10 +154,12 @@ static NTSTATUS WINAPI User32LoadImage( void *args, ULONG size ) return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); } -static NTSTATUS WINAPI User32LoadSysMenu( const struct load_sys_menu_params *params, ULONG size ) +static NTSTATUS WINAPI User32LoadSysMenu( void *args, ULONG size ) { + const struct load_sys_menu_params *params = args; HMENU ret = LoadMenuW( user32_module, params->mdi ? L"SYSMENUMDI" : L"SYSMENU" ); - return HandleToUlong( ret ); + if (!ret) return STATUS_NO_MEMORY; + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); } static NTSTATUS WINAPI User32FreeCachedClipboardData( const struct free_cached_data_params *params, diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c index a6b7ec38003..6a8e8615945 100644 --- a/dlls/win32u/menu.c +++ b/dlls/win32u/menu.c @@ -1436,12 +1436,12 @@ static HMENU copy_sys_popup( BOOL mdi ) struct menu *menu; void *ret_ptr; ULONG ret_len; - HMENU handle; + NTSTATUS status; + HMENU handle = 0; params.mdi = mdi; - handle = UlongToHandle( KeUserModeCallback( NtUserLoadSysMenu, ¶ms, sizeof(params), - &ret_ptr, &ret_len )); - + status = KeUserModeCallback( NtUserLoadSysMenu, ¶ms, sizeof(params), &ret_ptr, &ret_len ); + if (!status && ret_len == sizeof(HMENU)) handle = *(HMENU *)ret_ptr; if (!handle || !(menu = grab_menu_ptr( handle ))) { ERR("Unable to load default system menu\n" ); diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index d010b826ba1..939155b7d41 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1374,7 +1374,17 @@ static NTSTATUS WINAPI wow64_NtUserLoadImage( void *arg, ULONG size ) static NTSTATUS WINAPI wow64_NtUserLoadSysMenu( void *arg, ULONG size ) { - return dispatch_callback( NtUserLoadSysMenu, arg, size ); + void *ret_ptr; + ULONG ret_len; + NTSTATUS status; + + status = Wow64KiUserCallbackDispatcher( NtUserLoadSysMenu, arg, size, &ret_ptr, &ret_len ); + if (!status && ret_len == sizeof(ULONG)) + { + HMENU menu = ULongToHandle( *(ULONG *)ret_ptr ); + return NtCallbackReturn( &menu, sizeof(menu), status ); + } + return status; } static NTSTATUS WINAPI wow64_NtUserPostDDEMessage( void *arg, ULONG size )
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the load image callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: 33793446c438f99bfbe00602fb74e845a10a748c URL:
https://gitlab.winehq.org/wine/wine/-/commit/33793446c438f99bfbe00602fb74e8…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 15:00:24 2024 +0100 user32: Return result through NtCallbackReturn for the load image callback. --- dlls/user32/user_main.c | 6 ++++-- dlls/win32u/cursoricon.c | 3 ++- dlls/wow64win/user.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index efa33fb2760..79809835b91 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -145,11 +145,13 @@ static NTSTATUS WINAPI User32ImmTranslateMessage( const struct imm_translate_mes return ImmTranslateMessage( params->hwnd, params->msg, params->wparam, params->key_data ); } -static NTSTATUS WINAPI User32LoadImage( const struct load_image_params *params, ULONG size ) +static NTSTATUS WINAPI User32LoadImage( void *args, ULONG size ) { + const struct load_image_params *params = args; HANDLE ret = LoadImageW( params->hinst, params->name, params->type, params->dx, params->dy, params->flags ); - return HandleToUlong( ret ); + if (!ret) return STATUS_NO_MEMORY; + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); } static NTSTATUS WINAPI User32LoadSysMenu( const struct load_sys_menu_params *params, ULONG size ) diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index 5fe52fdb8b3..661ef34c2e0 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -740,5 +740,6 @@ HANDLE WINAPI LoadImageW( HINSTANCE hinst, const WCHAR *name, UINT type, return 0; } ret = KeUserModeCallback( NtUserLoadImage, ¶ms, sizeof(params), &ret_ptr, &ret_len ); - return UlongToHandle( ret ); + if (!ret && ret_len == sizeof(HANDLE)) return *(HANDLE *)ret_ptr; + return 0; } diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 219c48b754f..d010b826ba1 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1343,6 +1343,9 @@ static NTSTATUS WINAPI wow64_NtUserLoadDriver( void *arg, ULONG size ) static NTSTATUS WINAPI wow64_NtUserLoadImage( void *arg, ULONG size ) { struct load_image_params *params = arg; + void *ret_ptr; + ULONG ret_len; + NTSTATUS status; struct { ULONG hinst; @@ -1359,7 +1362,14 @@ static NTSTATUS WINAPI wow64_NtUserLoadImage( void *arg, ULONG size ) params32.dx = params->dx; params32.dy = params->dy; params32.flags = params->flags; - return dispatch_callback( NtUserLoadImage, ¶ms32, sizeof(params32) ); + status = Wow64KiUserCallbackDispatcher( NtUserLoadImage, ¶ms32, sizeof(params32), + &ret_ptr, &ret_len ); + if (!status && ret_len == sizeof(ULONG)) + { + HANDLE handle = ULongToHandle( *(ULONG *)ret_ptr ); + return NtCallbackReturn( &handle, sizeof(handle), status ); + } + return status; } static NTSTATUS WINAPI wow64_NtUserLoadSysMenu( void *arg, ULONG size )
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the copy image callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: a60747c755fbc52dc6292e3c78354d75e524c9f2 URL:
https://gitlab.winehq.org/wine/wine/-/commit/a60747c755fbc52dc6292e3c78354d…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 14:59:39 2024 +0100 user32: Return result through NtCallbackReturn for the copy image callback. --- dlls/user32/user_main.c | 6 ++++-- dlls/win32u/cursoricon.c | 3 ++- dlls/wow64win/user.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index a371c982721..efa33fb2760 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -100,10 +100,12 @@ static void dpiaware_init(void) } } -static NTSTATUS WINAPI User32CopyImage( const struct copy_image_params *params, ULONG size ) +static NTSTATUS WINAPI User32CopyImage( void *args, ULONG size ) { + const struct copy_image_params *params = args; HANDLE ret = CopyImage( params->hwnd, params->type, params->dx, params->dy, params->flags ); - return HandleToUlong( ret ); + if (!ret) return STATUS_NO_MEMORY; + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); } static NTSTATUS WINAPI User32DrawNonClientButton( const struct draw_non_client_button_params *params, ULONG size ) diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index 51226ed81a5..5fe52fdb8b3 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -718,7 +718,8 @@ HANDLE WINAPI CopyImage( HANDLE hwnd, UINT type, INT dx, INT dy, UINT flags ) { .hwnd = hwnd, .type = type, .dx = dx, .dy = dy, .flags = flags }; ret = KeUserModeCallback( NtUserCopyImage, ¶ms, sizeof(params), &ret_ptr, &ret_len ); - return UlongToHandle( ret ); + if (!ret && ret_len == sizeof(HANDLE)) return *(HANDLE *)ret_ptr; + return 0; } /****************************************************************************** diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 4e63484caf2..219c48b754f 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1163,6 +1163,9 @@ static NTSTATUS WINAPI wow64_NtUserCallWindowsHook( void *arg, ULONG size ) static NTSTATUS WINAPI wow64_NtUserCopyImage( void *arg, ULONG size ) { struct copy_image_params *params = arg; + void *ret_ptr; + ULONG ret_len; + NTSTATUS status; struct { ULONG hwnd; @@ -1177,7 +1180,14 @@ static NTSTATUS WINAPI wow64_NtUserCopyImage( void *arg, ULONG size ) params32.dx = params->dx; params32.dy = params->dy; params32.flags = params->flags; - return dispatch_callback( NtUserCopyImage, ¶ms32, sizeof(params32) ); + status = Wow64KiUserCallbackDispatcher( NtUserCopyImage, ¶ms32, sizeof(params32), + &ret_ptr, &ret_len ); + if (!status && ret_len == sizeof(ULONG)) + { + HANDLE handle = ULongToHandle( *(ULONG *)ret_ptr ); + return NtCallbackReturn( &handle, sizeof(handle), status ); + } + return status; } static NTSTATUS WINAPI wow64_NtUserDrawNonClientButton( void *arg, ULONG size )
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the thunk lock callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: cdf7b1bb77a6c3ba91adffe45f4bb81161e5d64e URL:
https://gitlab.winehq.org/wine/wine/-/commit/cdf7b1bb77a6c3ba91adffe45f4bb8…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 14:56:36 2024 +0100 user32: Return result through NtCallbackReturn for the thunk lock callback. --- dlls/user.exe16/message.c | 9 ++++++--- dlls/win32u/message.c | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/dlls/user.exe16/message.c b/dlls/user.exe16/message.c index 203d543ce90..b2b5ce947b1 100644 --- a/dlls/user.exe16/message.c +++ b/dlls/user.exe16/message.c @@ -22,6 +22,8 @@ #include <stdarg.h> #include <string.h> +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "wine/winuser16.h" #include "wownt32.h" #include "winerror.h" @@ -2587,16 +2589,17 @@ static void WINAPI User16CallFreeIcon( ULONG *param, ULONG size ) } -static DWORD WINAPI User16ThunkLock( DWORD *param, ULONG size ) +static NTSTATUS WINAPI User16ThunkLock( void *args, ULONG size ) { + DWORD *param = args; if (size != sizeof(DWORD)) { DWORD lock; ReleaseThunkLock( &lock ); - return lock; + return NtCallbackReturn( &lock, sizeof(lock), STATUS_SUCCESS ); } RestoreThunkLock( *param ); - return 0; + return STATUS_SUCCESS; } diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index ac0970c5344..2b6df6cc72c 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3007,12 +3007,15 @@ static inline LARGE_INTEGER *get_nt_timeout( LARGE_INTEGER *time, DWORD timeout static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags ) { LARGE_INTEGER time; - DWORD ret, lock; + DWORD ret, lock = 0; void *ret_ptr; ULONG ret_len; if (enable_thunk_lock) - lock = KeUserModeCallback( NtUserThunkLock, NULL, 0, &ret_ptr, &ret_len ); + { + if (!KeUserModeCallback( NtUserThunkLock, NULL, 0, &ret_ptr, &ret_len ) && ret_len == sizeof(lock)) + lock = *(DWORD *)ret_ptr; + } if (user_driver->pProcessEvents( mask )) ret = count ? count - 1 : 0; else if (count)
1
0
0
0
Alexandre Julliard : user32: Return result through NtCallbackReturn for the DDE message callback.
by Alexandre Julliard
18 Jan '24
18 Jan '24
Module: wine Branch: master Commit: 85e351abafe565cd0fa11eb19d6e3a34edbfd896 URL:
https://gitlab.winehq.org/wine/wine/-/commit/85e351abafe565cd0fa11eb19d6e3a…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jan 18 14:55:48 2024 +0100 user32: Return result through NtCallbackReturn for the DDE message callback. --- dlls/user32/user_main.c | 11 ++++++----- dlls/win32u/message.c | 18 +++++++++--------- dlls/wow64win/user.c | 18 ++++++------------ include/ntuser.h | 12 +++++------- 4 files changed, 26 insertions(+), 33 deletions(-) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index ef2b94ba698..a371c982721 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "user_private.h" #include "controls.h" #include "imm.h" @@ -179,18 +181,17 @@ static BOOL WINAPI User32LoadDriver( const WCHAR *path, ULONG size ) return LoadLibraryW( path ) != NULL; } -static NTSTATUS WINAPI User32UnpackDDEMessage( const struct unpack_dde_message_params *params, ULONG size ) +static NTSTATUS WINAPI User32UnpackDDEMessage( void *args, ULONG size ) { + const struct unpack_dde_message_params *params = args; struct unpack_dde_message_result result = { .wparam = params->wparam, .lparam = params->lparam }; size -= FIELD_OFFSET( struct unpack_dde_message_params, data ); if (!unpack_dde_message( params->hwnd, params->message, &result.wparam, &result.lparam, params->data, size )) - return FALSE; + return STATUS_NO_MEMORY; - if (params->result) *params->result = result; - else NtCallbackReturn( &result, sizeof(result), TRUE ); - return TRUE; + return NtCallbackReturn( &result, sizeof(result), STATUS_SUCCESS ); } static const void *kernel_callback_table[NtUserCallCount] = diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index c567d697a41..ac0970c5344 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -2894,27 +2894,27 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags, } if (info.msg.message >= WM_DDE_FIRST && info.msg.message <= WM_DDE_LAST) { - struct unpack_dde_message_result result; + struct unpack_dde_message_result *result; struct unpack_dde_message_params *params; - void *ret_ptr; + NTSTATUS status; ULONG len; - BOOL ret; len = FIELD_OFFSET( struct unpack_dde_message_params, data[size] ); if (!(params = malloc( len ))) continue; - params->result = &result; params->hwnd = info.msg.hwnd; params->message = info.msg.message; params->wparam = info.msg.wParam; params->lparam = info.msg.lParam; if (size) memcpy( params->data, buffer, size ); - ret = KeUserModeCallback( NtUserUnpackDDEMessage, params, len, &ret_ptr, &len ); - if (len == sizeof(result)) result = *(struct unpack_dde_message_result *)ret_ptr; + status = KeUserModeCallback( NtUserUnpackDDEMessage, params, len, (void **)&result, &len ); free( params ); - if (!ret) continue; /* ignore it */ - info.msg.wParam = result.wparam; - info.msg.lParam = result.lparam; + if (status) continue; /* ignore it */ + if (len == sizeof(*result)) + { + info.msg.wParam = result->wparam; + info.msg.lParam = result->lparam; + } } *msg = info.msg; msg->pt = point_phys_to_win_dpi( info.msg.hwnd, info.msg.pt ); diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 824d085c63e..4e63484caf2 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -399,7 +399,6 @@ struct draw_text_params32 struct unpack_dde_message_params32 { - ULONG result; ULONG hwnd; UINT message; LONG wparam; @@ -1395,14 +1394,13 @@ static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size ) LONG wparam; LONG lparam; } *result32; - void *ret_ptr; ULONG ret_len; + NTSTATUS status; size -= FIELD_OFFSET( struct unpack_dde_message_params, data ); if (!(params32 = Wow64AllocateTemp( FIELD_OFFSET( struct unpack_dde_message_params32, data[size] )))) - return 0; + return STATUS_NO_MEMORY; - params32->result = 0; params32->hwnd = HandleToUlong( params->hwnd ); params32->message = params->message; params32->wparam = params->wparam; @@ -1410,18 +1408,14 @@ static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size ) if (size) memcpy( params32->data, params->data, size ); size = FIELD_OFFSET( struct unpack_dde_message_params32, data[size] ); - if (!Wow64KiUserCallbackDispatcher( NtUserUnpackDDEMessage, params32, size, &ret_ptr, &ret_len )) - return FALSE; - if (ret_len == sizeof(*result32)) + status = Wow64KiUserCallbackDispatcher( NtUserUnpackDDEMessage, params32, size, (void **)&result32, &ret_len ); + if (!status && ret_len == sizeof(*result32)) { - result32 = ret_ptr; result.wparam = result32->wparam; result.lparam = result32->lparam; + return NtCallbackReturn( &result, sizeof(result), status ); } - - if (!params->result) NtCallbackReturn( &result, sizeof(result), TRUE ); - *params->result = result; - return TRUE; + return status; } static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size ) diff --git a/include/ntuser.h b/include/ntuser.h index f8fbe64769c..e78ac3d03c2 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -262,21 +262,19 @@ struct render_synthesized_format_params }; /* NtUserUnpackDDEMessage params */ -struct unpack_dde_message_result -{ - WPARAM wparam; - LPARAM lparam; -}; - struct unpack_dde_message_params { - struct unpack_dde_message_result *result; /* FIXME: Use NtCallbackReturn instead */ HWND hwnd; UINT message; WPARAM wparam; LPARAM lparam; char data[1]; }; +struct unpack_dde_message_result +{ + WPARAM wparam; + LPARAM lparam; +}; /* process DPI awareness contexts */ #define NTUSER_DPI_UNAWARE 0x00006010
1
0
0
0
← Newer
1
...
40
41
42
43
44
45
46
...
72
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Results per page:
10
25
50
100
200