Module: wine Branch: master Commit: f6ddd4ca86672fe2739ea7d17015112bce677e21 URL: https://gitlab.winehq.org/wine/wine/-/commit/f6ddd4ca86672fe2739ea7d17015112...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Jul 11 13:26:46 2022 +0200
imm32: Use win32u to manage input context handles.
---
dlls/imm32/Makefile.in | 2 +- dlls/imm32/imm.c | 55 ++++++++++++++++++++++++-------------------------- 2 files changed, 27 insertions(+), 30 deletions(-)
diff --git a/dlls/imm32/Makefile.in b/dlls/imm32/Makefile.in index 214b2b753d4..29de6063792 100644 --- a/dlls/imm32/Makefile.in +++ b/dlls/imm32/Makefile.in @@ -1,6 +1,6 @@ MODULE = imm32.dll IMPORTLIB = imm32 -IMPORTS = user32 gdi32 advapi32 +IMPORTS = user32 gdi32 advapi32 win32u DELAYIMPORTS = ole32
C_SRCS = \ diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index bcb02b82c83..e27c658b930 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -29,7 +29,7 @@ #include "windef.h" #include "winbase.h" #include "wingdi.h" -#include "winuser.h" +#include "ntuser.h" #include "winerror.h" #include "wine/debug.h" #include "imm.h" @@ -73,6 +73,7 @@ typedef struct _tagImmHkl{
typedef struct tagInputContextData { + HIMC handle; DWORD dwLock; INPUTCONTEXT IMC; DWORD threadID; @@ -80,7 +81,6 @@ typedef struct tagInputContextData ImmHkl *immKbd; UINT lastVK; BOOL threadDefault; - DWORD magic; } InputContextData;
#define WINE_IMC_VALID_MAGIC 0x56434D49 @@ -628,19 +628,13 @@ static HIMCC ImmCreateBlankCompStr(void) return rc; }
-static InputContextData* get_imc_data(HIMC hIMC) +static InputContextData *get_imc_data(HIMC handle) { - InputContextData *data = hIMC; + InputContextData *ret;
- if (hIMC == NULL) - return NULL; - - if(IsBadReadPtr(data, sizeof(InputContextData)) || data->magic != WINE_IMC_VALID_MAGIC) - { - SetLastError(ERROR_INVALID_HANDLE); - return NULL; - } - return data; + if (!handle) return NULL; + ret = (void *)NtUserQueryInputContext( handle, NtUserInputContextClientPtr ); + return ret && ret->handle == handle ? ret : NULL; }
static HIMC get_default_context( HWND hwnd ) @@ -668,7 +662,7 @@ static HIMC get_default_context( HWND hwnd )
ret = ImmCreateContext(); if (!ret) return 0; - ((InputContextData*)ret)->threadDefault = TRUE; + get_imc_data(ret)->threadDefault = TRUE;
/* thread_data is in the current thread so we can assume it's still valid */ EnterCriticalSection(&threaddata_cs); @@ -903,16 +897,24 @@ HIMC WINAPI ImmCreateContext(void) InputContextData *new_context; LPGUIDELINE gl; LPCANDIDATEINFO ci; + HIMC handle; int i;
new_context = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(InputContextData));
+ if (!(handle = NtUserCreateInputContext((UINT_PTR)new_context))) + { + HeapFree(GetProcessHeap(),0,new_context); + return 0; + } + /* Load the IME */ new_context->immKbd = IMM_GetImmHkl(GetKeyboardLayout(0));
if (!new_context->immKbd->hIME) { TRACE("IME dll could not be loaded\n"); + NtUserDestroyInputContext(handle); HeapFree(GetProcessHeap(),0,new_context); return 0; } @@ -940,9 +942,10 @@ HIMC WINAPI ImmCreateContext(void) new_context->IMC.fdwConversion = new_context->immKbd->imeInfo.fdwConversionCaps; new_context->IMC.fdwSentence = new_context->immKbd->imeInfo.fdwSentenceCaps;
- if (!new_context->immKbd->pImeSelect(new_context, TRUE)) + if (!new_context->immKbd->pImeSelect(handle, TRUE)) { TRACE("Selection of IME failed\n"); + NtUserDestroyInputContext(handle); IMM_DestroyContext(new_context); return 0; } @@ -952,8 +955,7 @@ HIMC WINAPI ImmCreateContext(void) new_context->immKbd->uSelected++; TRACE("Created context %p\n",new_context);
- new_context->magic = WINE_IMC_VALID_MAGIC; - return new_context; + return new_context->handle = handle; }
static BOOL IMM_DestroyContext(HIMC hIMC) @@ -975,7 +977,7 @@ static BOOL IMM_DestroyContext(HIMC hIMC) ImmDestroyIMCC(data->IMC.hPrivate); ImmDestroyIMCC(data->IMC.hMsgBuf);
- data->magic = 0; + NtUserDestroyInputContext(data->handle); HeapFree(GetProcessHeap(),0,data);
return TRUE; @@ -1730,8 +1732,9 @@ HIMC WINAPI ImmGetContext(HWND hWnd)
if (rc) { - InputContextData *data = rc; - data->IMC.hWnd = hWnd; + InputContextData *data = get_imc_data(rc); + if (data) data->IMC.hWnd = hWnd; + else rc = 0; }
TRACE("returning %p\n", rc); @@ -2218,7 +2221,7 @@ BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos) UINT WINAPI ImmGetVirtualKey(HWND hWnd) { OSVERSIONINFOA version; - InputContextData *data = ImmGetContext( hWnd ); + InputContextData *data = get_imc_data( ImmGetContext( hWnd )); TRACE("%p\n", hWnd);
if ( data ) @@ -3233,10 +3236,7 @@ BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyD
TRACE("%p %x %x %x\n",hwnd, msg, (UINT)wParam, (UINT)lKeyData);
- if (imc) - data = imc; - else - return FALSE; + if (!(data = get_imc_data( imc ))) return FALSE;
if (!data->immKbd->hIME || !data->immKbd->pImeToAsciiEx || data->lastVK == VK_PROCESSKEY) return FALSE; @@ -3292,10 +3292,7 @@ BOOL WINAPI ImmProcessKey(HWND hwnd, HKL hKL, UINT vKey, LPARAM lKeyData, DWORD
TRACE("%p %p %x %x %lx\n",hwnd, hKL, vKey, (UINT)lKeyData, unknown);
- if (imc) - data = imc; - else - return FALSE; + if (!(data = get_imc_data( imc ))) return FALSE;
/* Make sure we are inputting to the correct keyboard */ if (data->immKbd->hkl != hKL)