Jacek Caban : imm32: Use win32u to manage input context handles.

Alexandre Julliard julliard at winehq.org
Mon Jul 11 15:51:39 CDT 2022


Module: wine
Branch: master
Commit: f6ddd4ca86672fe2739ea7d17015112bce677e21
URL:    https://gitlab.winehq.org/wine/wine/-/commit/f6ddd4ca86672fe2739ea7d17015112bce677e21

Author: Jacek Caban <jacek at 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)




More information about the wine-cvs mailing list