https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9e7c2ba4608f320a04571c8c545c4b2aa3c6569d

commit 9e7c2ba4608f320a04571c8c545c4b2aa3c6569d
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Thu Aug 25 10:20:42 2022 +0900
Commit:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
CommitDate: Thu Aug 25 10:20:42 2022 +0900

    [NTUSER] Improve NtUserGetImeInfoEx / NtUserSetImeInfoEx
    
    CORE-11700
---
 win32ss/user/ntuser/ime.c | 44 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/win32ss/user/ntuser/ime.c b/win32ss/user/ntuser/ime.c
index 1cdabee6638..424c18c44fe 100644
--- a/win32ss/user/ntuser/ime.c
+++ b/win32ss/user/ntuser/ime.c
@@ -954,11 +954,15 @@ Quit:
 }
 
 // Win: GetImeInfoEx
-BOOL FASTCALL UserGetImeInfoEx(LPVOID pUnknown, PIMEINFOEX pInfoEx, 
IMEINFOEXCLASS SearchType)
+BOOL FASTCALL
+UserGetImeInfoEx(
+    _Inout_ PWINSTATION_OBJECT pWinSta,
+    _Inout_ PIMEINFOEX pInfoEx,
+    _In_ IMEINFOEXCLASS SearchType)
 {
     PKL pkl, pklHead;
 
-    if (!gspklBaseLayout)
+    if (!pWinSta || !gspklBaseLayout)
         return FALSE;
 
     pkl = pklHead = gspklBaseLayout;
@@ -971,7 +975,10 @@ BOOL FASTCALL UserGetImeInfoEx(LPVOID pUnknown, PIMEINFOEX 
pInfoEx, IMEINFOEXCLA
             if (pInfoEx->hkl == pkl->hkl)
             {
                 if (!pkl->piiex)
+                {
+                    ERR("!pkl->piiex at %p\n", pkl->hkl);
                     break;
+                }
 
                 *pInfoEx = *pkl->piiex;
                 return TRUE;
@@ -984,12 +991,18 @@ BOOL FASTCALL UserGetImeInfoEx(LPVOID pUnknown, 
PIMEINFOEX pInfoEx, IMEINFOEXCLA
     {
         do
         {
-            if (pkl->piiex &&
-                _wcsnicmp(pkl->piiex->wszImeFile, pInfoEx->wszImeFile,
+            if (_wcsnicmp(pkl->piiex->wszImeFile, pInfoEx->wszImeFile,
                           RTL_NUMBER_OF(pkl->piiex->wszImeFile)) == 0)
             {
-                *pInfoEx = *pkl->piiex;
-                return TRUE;
+                if (pkl->piiex)
+                {
+                    *pInfoEx = *pkl->piiex;
+                    return TRUE;
+                }
+                else
+                {
+                    ERR("!pkl->piiex at %p\n", pkl->hkl);
+                }
             }
 
             pkl = pkl->pklNext;
@@ -1011,6 +1024,7 @@ NtUserGetImeInfoEx(
 {
     IMEINFOEX ImeInfoEx;
     BOOL ret = FALSE;
+    PWINSTATION_OBJECT pWinSta;
 
     UserEnterShared();
 
@@ -1031,7 +1045,8 @@ NtUserGetImeInfoEx(
     }
     _SEH2_END;
 
-    ret = UserGetImeInfoEx(NULL, &ImeInfoEx, SearchType);
+    pWinSta = IntGetProcessWindowStation(NULL);
+    ret = UserGetImeInfoEx(pWinSta, &ImeInfoEx, SearchType);
     if (!ret)
         goto Quit;
 
@@ -1081,10 +1096,16 @@ Quit:
 }
 
 // Win: SetImeInfoEx
-BOOL FASTCALL UserSetImeInfoEx(LPVOID pUnknown, PIMEINFOEX pImeInfoEx)
+BOOL FASTCALL
+UserSetImeInfoEx(
+    _Inout_ PWINSTATION_OBJECT pWinSta,
+    _Inout_ PIMEINFOEX pImeInfoEx)
 {
     PKL pklHead, pkl;
 
+    if (!pWinSta || !gspklBaseLayout)
+        return FALSE;
+
     pkl = pklHead = gspklBaseLayout;
 
     do
@@ -1096,7 +1117,10 @@ BOOL FASTCALL UserSetImeInfoEx(LPVOID pUnknown, 
PIMEINFOEX pImeInfoEx)
         }
 
         if (!pkl->piiex)
+        {
+            ERR("!pkl->piiex at %p\n", pkl->hkl);
             return FALSE;
+        }
 
         if (!pkl->piiex->fLoadFlag)
             *pkl->piiex = *pImeInfoEx;
@@ -1113,6 +1137,7 @@ NtUserSetImeInfoEx(PIMEINFOEX pImeInfoEx)
 {
     BOOL ret = FALSE;
     IMEINFOEX ImeInfoEx;
+    PWINSTATION_OBJECT pWinSta;
 
     UserEnterExclusive();
 
@@ -1133,7 +1158,8 @@ NtUserSetImeInfoEx(PIMEINFOEX pImeInfoEx)
     }
     _SEH2_END;
 
-    ret = UserSetImeInfoEx(NULL, &ImeInfoEx);
+    pWinSta = IntGetProcessWindowStation(NULL);
+    ret = UserSetImeInfoEx(pWinSta, &ImeInfoEx);
 
 Quit:
     UserLeave();

Reply via email to