https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1f446936572780cfb3d44a6142c44fd104d148d5

commit 1f446936572780cfb3d44a6142c44fd104d148d5
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Wed Jan 12 12:07:31 2022 +0900
Commit:     GitHub <[email protected]>
CommitDate: Wed Jan 12 12:07:31 2022 +0900

    [NTUSER] Implement NtUserSetImeInfoEx (#4276)
    
    - Modify NtUserSetImeInfoEx prototype.
    - Add UserSetImeInfoEx helper function.
    - Implement NtUserSetImeInfoEx function.
    CORE-11700
---
 win32ss/include/ntuser.h  |  2 +-
 win32ss/user/ntuser/ime.c | 57 ++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 53 insertions(+), 6 deletions(-)

diff --git a/win32ss/include/ntuser.h b/win32ss/include/ntuser.h
index 4519b3a35aa..a53f7012838 100644
--- a/win32ss/include/ntuser.h
+++ b/win32ss/include/ntuser.h
@@ -3186,7 +3186,7 @@ NtUserSetImeHotKey(
     DWORD Unknown3,
     DWORD Unknown4);
 
-DWORD
+BOOL
 NTAPI
 NtUserSetImeInfoEx(
     PIMEINFOEX pImeInfoEx);
diff --git a/win32ss/user/ntuser/ime.c b/win32ss/user/ntuser/ime.c
index ee79b14d60f..e6c6ff150c2 100644
--- a/win32ss/user/ntuser/ime.c
+++ b/win32ss/user/ntuser/ime.c
@@ -260,13 +260,60 @@ NtUserSetAppImeLevel(
     return 0;
 }
 
-DWORD
+BOOL FASTCALL UserSetImeInfoEx(LPVOID pUnknown, PIMEINFOEX pImeInfoEx)
+{
+    PKL pklHead, pkl;
+
+    pkl = pklHead = gspklBaseLayout;
+
+    do
+    {
+        if (pkl->hkl != pImeInfoEx->hkl)
+        {
+            pkl = pkl->pklNext;
+            continue;
+        }
+
+        if (!pkl->piiex)
+            return FALSE;
+
+        if (!pkl->piiex->fLoadFlag)
+            *pkl->piiex = *pImeInfoEx;
+
+        return TRUE;
+    } while (pkl != pklHead);
+
+    return FALSE;
+}
+
+BOOL
 APIENTRY
-NtUserSetImeInfoEx(
-    PIMEINFOEX pImeInfoEx)
+NtUserSetImeInfoEx(PIMEINFOEX pImeInfoEx)
 {
-    STUB;
-    return 0;
+    BOOL ret = FALSE;
+    IMEINFOEX ImeInfoEx;
+
+    UserEnterExclusive();
+
+    if (!IS_IMM_MODE())
+        goto Quit;
+
+    _SEH2_TRY
+    {
+        ProbeForRead(pImeInfoEx, sizeof(*pImeInfoEx), 1);
+        ImeInfoEx = *pImeInfoEx;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        goto Quit;
+    }
+    _SEH2_END;
+
+    ret = UserSetImeInfoEx(NULL, &ImeInfoEx);
+
+Quit:
+    UserLeave();
+    return ret;
 }
 
 DWORD APIENTRY

Reply via email to