ReactOS 0.4.16-dev-1264-g92ff994
utils.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS IMM32
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Implementing IMM32 helper functions
5 * COPYRIGHT: Copyright 1998 Patrik Stridvall
6 * Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
7 * Copyright 2017 James Tabor <james.tabor@reactos.org>
8 * Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
9 * Copyright 2020-2021 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
10 */
11
12#include "precomp.h"
13
15
17
19{
20 if (NtCurrentTeb()->Win32ThreadInfo == NULL)
22 return NtCurrentTeb()->Win32ThreadInfo;
23}
24
26{
28 DWORD_PTR dwCurrentThreadId = GetCurrentThreadId();
29 return dwImeThreadId != dwCurrentThreadId;
30}
31
33{
35 DWORD_PTR CurrentPID = (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess;
36 return WndPID != CurrentPID;
37}
38
41 _In_ PCWSTR pszText,
42 _Out_ PDWORD pdwValue,
43 _In_ ULONG nBase)
44{
47 *pdwValue = 0;
50 if (!NT_SUCCESS(Status))
51 return E_FAIL;
52 return S_OK;
53}
54
57 _In_ DWORD dwValue,
58 _In_ ULONG nBase,
59 _Out_ PWSTR pszBuff,
60 _In_ USHORT cchBuff)
61{
64 UnicodeString.Buffer = pszBuff;
65 UnicodeString.MaximumLength = cchBuff * sizeof(WCHAR);
67 if (!NT_SUCCESS(Status))
68 return E_FAIL;
69 return S_OK;
70}
71
73{
76 WORD wPrimary = PRIMARYLANGID(LangID);
77 if (wPrimary != LANG_JAPANESE || wPrimary != LANG_KOREAN)
78 {
79 TRACE("The country has no special IME support\n");
80 return FALSE;
81 }
82 return TRUE;
83}
84
86{
87 BOOL ret;
88 PCLIENTIMC pClientImc = ImmLockClientImc(hIMC);
89 if (IS_NULL_UNEXPECTEDLY(pClientImc))
90 return -1;
91 ret = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
92 ImmUnlockClientImc(pClientImc);
93 return ret;
94}
95
97{
98 INT cch = lstrlenA(pszA);
99 LPWSTR pszW = ImmLocalAlloc(0, (cch + 1) * sizeof(WCHAR));
100 if (IS_NULL_UNEXPECTEDLY(pszW))
101 return NULL;
102 cch = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1);
103 pszW[cch] = 0;
104 return pszW;
105}
106
108{
109 INT cchW = lstrlenW(pszW);
110 INT cchA = (cchW + 1) * sizeof(WCHAR);
111 LPSTR pszA = ImmLocalAlloc(0, cchA);
112 if (IS_NULL_UNEXPECTEDLY(pszA))
113 return NULL;
114 cchA = WideCharToMultiByte(uCodePage, 0, pszW, cchW, pszA, cchA, NULL, NULL);
115 pszA[cchA] = 0;
116 return pszA;
117}
118
119/* Converts the character index */
120LONG IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
121{
122 LONG cchWide;
123 for (cchWide = 0; cchAnsi > 0; ++cchWide)
124 {
125 if (IsDBCSLeadByteEx(uCodePage, *pchAnsi) && pchAnsi[1])
126 {
127 cchAnsi -= 2;
128 pchAnsi += 2;
129 }
130 else
131 {
132 --cchAnsi;
133 ++pchAnsi;
134 }
135 }
136 return cchWide;
137}
138
139/* Converts the character index */
140LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
141{
142 LONG cb, cchAnsi;
143 for (cchAnsi = 0; cchWide > 0; ++cchAnsi, ++pchWide, --cchWide)
144 {
145 cb = WideCharToMultiByte(uCodePage, 0, pchWide, 1, NULL, 0, NULL, NULL);
146 if (cb > 1)
147 ++cchAnsi;
148 }
149 return cchAnsi;
150}
151
153{
154 if (!pszFileName[0] || !GetSystemDirectoryW(pszPath, cchPath))
155 {
156 ERR("Invalid filename\n");
157 return FALSE;
158 }
159 StringCchCatW(pszPath, cchPath, L"\\");
160 StringCchCatW(pszPath, cchPath, pszFileName);
161 return TRUE;
162}
163
165{
166 size_t cch;
167 RtlCopyMemory(plfW, plfA, offsetof(LOGFONTA, lfFaceName));
170 plfW->lfFaceName, _countof(plfW->lfFaceName));
171 if (cch > _countof(plfW->lfFaceName) - 1)
172 cch = _countof(plfW->lfFaceName) - 1;
173 plfW->lfFaceName[cch] = 0;
174}
175
177{
178 size_t cch;
179 RtlCopyMemory(plfA, plfW, offsetof(LOGFONTW, lfFaceName));
182 plfA->lfFaceName, _countof(plfA->lfFaceName), NULL, NULL);
183 if (cch > _countof(plfA->lfFaceName) - 1)
184 cch = _countof(plfA->lfFaceName) - 1;
185 plfA->lfFaceName[cch] = 0;
186}
187
189{
192
193 ASSERT(ptr != NULL);
194 ASSERT(pdi != NULL);
195 if (pdi->pvDesktopBase <= ptr && ptr < pdi->pvDesktopLimit)
196 return (PVOID)((ULONG_PTR)ptr - pci->ulClientDelta);
197 else
199}
200
202{
203 UINT index;
207 LPVOID ptr;
208
209 if (!NtUserValidateHandleSecure(hObject))
210 {
211 WARN("Not a handle\n");
212 return NULL;
213 }
214
215 ht = gSharedInfo.aheList; /* handle table */
216 ASSERT(ht);
217 /* ReactOS-Specific! */
220
221 index = (LOWORD(hObject) - FIRST_USER_HANDLE) >> 1;
222 if ((INT)index < 0 || ht->nb_handles <= index || he[index].type != uType)
223 return NULL;
224
226 return NULL;
227
228 generation = HIWORD(hObject);
229 if (generation != he[index].generation && generation && generation != 0xFFFF)
230 return NULL;
231
232 ptr = he[index].ptr;
233 if (ptr)
235
236 return ptr;
237}
238
240{
241 LPVOID pvObj = ValidateHandleNoErr(hObject, uType);
242 if (pvObj)
243 return pvObj;
244
245 if (uType == TYPE_WINDOW)
247 else
249 return NULL;
250}
251
253{
254 HIMC hIMC;
255 DWORD_PTR dwPID1, dwPID2;
256
257 if (IS_NULL_UNEXPECTEDLY(pIMC))
258 return FALSE;
259
260 if (pIMC->head.pti == Imm32CurrentPti())
261 return TRUE;
262
263 hIMC = pIMC->head.h;
265 dwPID2 = (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess;
266 if (dwPID1 != dwPID2)
267 {
268 WARN("PID 0x%X != 0x%X\n", dwPID1, dwPID2);
269 return FALSE;
270 }
271
272 return TRUE;
273}
274
276{
277 if (!ghImmHeap)
278 {
279 ghImmHeap = RtlGetProcessHeap();
281 return NULL;
282 }
283 return HeapAlloc(ghImmHeap, dwFlags, dwBytes);
284}
285
286BOOL
288 _In_ HIMC hIMC,
289 _In_ HWND hwnd,
290 _In_ DWORD dwAction,
291 _In_ DWORD dwIndex,
292 _Inout_opt_ DWORD_PTR dwValue,
293 _In_ DWORD dwCommand,
295{
297 HKL hKL;
298 PIMEDPI pImeDpi;
299
300 if (dwAction != 0)
301 {
303 if (dwThreadId)
304 {
305 /* find keyboard layout and lock it */
307 pImeDpi = ImmLockImeDpi(hKL);
308 if (pImeDpi)
309 {
310 /* do notify */
311 TRACE("NotifyIME(%p, %lu, %lu, %p)\n", hIMC, dwAction, dwIndex, dwValue);
312 if (!pImeDpi->NotifyIME(hIMC, dwAction, dwIndex, dwValue))
313 WARN("NotifyIME(%p, %lu, %lu, %p) failed\n", hIMC, dwAction, dwIndex, dwValue);
314
315 ImmUnlockImeDpi(pImeDpi); /* unlock */
316 }
317 else
318 {
319 WARN("pImeDpi was NULL\n");
320 }
321 }
322 else
323 {
324 WARN("dwThreadId was zero\n");
325 }
326 }
327 else
328 {
329 WARN("dwAction was zero\n");
330 }
331
332 if (hwnd && dwCommand)
334
335 return TRUE;
336}
337
339{
340#define INITIAL_COUNT 0x40
341#define MAX_RETRY 10
343 DWORD dwCount = INITIAL_COUNT, cRetry = 0;
344 HIMC *phNewList;
345
346 phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC));
347 if (IS_NULL_UNEXPECTEDLY(phNewList))
348 return 0;
349
350 Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount);
352 {
353 ImmLocalFree(phNewList);
354 if (cRetry++ >= MAX_RETRY)
355 return 0;
356
357 phNewList = ImmLocalAlloc(0, dwCount * sizeof(HIMC));
358 if (IS_NULL_UNEXPECTEDLY(phNewList))
359 return 0;
360
361 Status = NtUserBuildHimcList(dwThreadId, dwCount, phNewList, &dwCount);
362 }
363
364 if (NT_ERROR(Status) || !dwCount)
365 {
366 ERR("Abnormal status\n");
367 ImmLocalFree(phNewList);
368 return 0;
369 }
370
371 *pphList = phNewList;
372 return dwCount;
373#undef INITIAL_COUNT
374#undef MAX_RETRY
375}
376
379{
380 PIME_STATE pState;
381 WORD Lang = PRIMARYLANGID(LOWORD(hKL));
382 for (pState = pIC->pState; pState; pState = pState->pNext)
383 {
384 if (pState->wLang == Lang)
385 break;
386 }
387 if (!pState)
388 {
389 pState = ImmLocalAlloc(HEAP_ZERO_MEMORY, sizeof(IME_STATE));
390 if (pState)
391 {
392 pState->wLang = Lang;
393 pState->pNext = pIC->pState;
394 pIC->pState = pState;
395 }
396 }
397 return pState;
398}
399
402{
403 PIME_SUBSTATE pSubState;
404 for (pSubState = pState->pSubState; pSubState; pSubState = pSubState->pNext)
405 {
406 if (pSubState->hKL == hKL)
407 return pSubState;
408 }
409 pSubState = ImmLocalAlloc(0, sizeof(IME_SUBSTATE));
410 if (!pSubState)
411 return NULL;
412 pSubState->dwValue = 0;
413 pSubState->hKL = hKL;
414 pSubState->pNext = pState->pSubState;
415 pState->pSubState = pSubState;
416 return pSubState;
417}
418
419BOOL
421{
422 PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL);
423 if (IS_NULL_UNEXPECTEDLY(pSubState))
424 return FALSE;
425
426 pIC->fdwSentence |= pSubState->dwValue;
427 return TRUE;
428}
429
430BOOL
432{
433 PIME_SUBSTATE pSubState = Imm32FetchImeSubState(pState, hKL);
434 if (IS_NULL_UNEXPECTEDLY(pSubState))
435 return FALSE;
436
437 pSubState->dwValue = (pIC->fdwSentence & 0xffff0000);
438 return TRUE;
439}
440
441/*
442 * See RECONVERTSTRING structure:
443 * https://katahiromz.web.fc2.com/colony3rd/imehackerz/en/RECONVERTSTRING.html
444 *
445 * The dwCompStrOffset and dwTargetOffset members are the relative position of dwStrOffset.
446 * dwStrLen, dwCompStrLen, and dwTargetStrLen are the TCHAR count. dwStrOffset,
447 * dwCompStrOffset, and dwTargetStrOffset are the byte offset.
448 */
449
450DWORD
451Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
452{
453 DWORD cch0, cchDest, cbDest;
454 LPCSTR pchSrc = (LPCSTR)pSrc + pSrc->dwStrOffset;
455 LPWSTR pchDest;
456
457 if (pSrc->dwVersion != 0)
458 {
459 ERR("\n");
460 return 0;
461 }
462
463 cchDest = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pchSrc, pSrc->dwStrLen,
464 NULL, 0);
465 cbDest = sizeof(RECONVERTSTRING) + (cchDest + 1) * sizeof(WCHAR);
466 if (!pDest)
467 return cbDest;
468
469 if (pDest->dwSize < cbDest)
470 {
471 ERR("Too small\n");
472 return 0;
473 }
474
475 /* dwSize */
476 pDest->dwSize = cbDest;
477
478 /* dwVersion */
479 pDest->dwVersion = 0;
480
481 /* dwStrOffset */
482 pDest->dwStrOffset = sizeof(RECONVERTSTRING);
483
484 /* dwCompStrOffset */
485 cch0 = IchWideFromAnsi(pSrc->dwCompStrOffset, pchSrc, uCodePage);
486 pDest->dwCompStrOffset = cch0 * sizeof(WCHAR);
487
488 /* dwCompStrLen */
489 cch0 = IchWideFromAnsi(pSrc->dwCompStrOffset + pSrc->dwCompStrLen, pchSrc, uCodePage);
490 pDest->dwCompStrLen = (cch0 * sizeof(WCHAR) - pDest->dwCompStrOffset) / sizeof(WCHAR);
491
492 /* dwTargetStrOffset */
493 cch0 = IchWideFromAnsi(pSrc->dwTargetStrOffset, pchSrc, uCodePage);
494 pDest->dwTargetStrOffset = cch0 * sizeof(WCHAR);
495
496 /* dwTargetStrLen */
497 cch0 = IchWideFromAnsi(pSrc->dwTargetStrOffset + pSrc->dwTargetStrLen, pchSrc, uCodePage);
498 pDest->dwTargetStrLen = (cch0 * sizeof(WCHAR) - pSrc->dwTargetStrOffset) / sizeof(WCHAR);
499
500 /* dwStrLen */
501 pDest->dwStrLen = cchDest;
502
503 /* the string */
504 pchDest = (LPWSTR)((LPBYTE)pDest + pDest->dwStrOffset);
505 cchDest = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pchSrc, pSrc->dwStrLen,
506 pchDest, cchDest);
507 pchDest[cchDest] = 0;
508
509 TRACE("cbDest: 0x%X\n", cbDest);
510 return cbDest;
511}
512
513DWORD
514Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
515{
516 DWORD cch0, cch1, cchDest, cbDest;
517 LPCWSTR pchSrc = (LPCWSTR)((LPCSTR)pSrc + pSrc->dwStrOffset);
518 LPSTR pchDest;
519
520 if (pSrc->dwVersion != 0)
521 {
522 ERR("\n");
523 return 0;
524 }
525
526 cchDest = WideCharToMultiByte(uCodePage, 0, pchSrc, pSrc->dwStrLen,
527 NULL, 0, NULL, NULL);
528 cbDest = sizeof(RECONVERTSTRING) + (cchDest + 1) * sizeof(CHAR);
529 if (!pDest)
530 return cbDest;
531
532 if (pDest->dwSize < cbDest)
533 {
534 ERR("Too small\n");
535 return 0;
536 }
537
538 /* dwSize */
539 pDest->dwSize = cbDest;
540
541 /* dwVersion */
542 pDest->dwVersion = 0;
543
544 /* dwStrOffset */
545 pDest->dwStrOffset = sizeof(RECONVERTSTRING);
546
547 /* dwCompStrOffset */
548 cch1 = pSrc->dwCompStrOffset / sizeof(WCHAR);
549 cch0 = IchAnsiFromWide(cch1, pchSrc, uCodePage);
550 pDest->dwCompStrOffset = cch0 * sizeof(CHAR);
551
552 /* dwCompStrLen */
553 cch0 = IchAnsiFromWide(cch1 + pSrc->dwCompStrLen, pchSrc, uCodePage);
554 pDest->dwCompStrLen = cch0 * sizeof(CHAR) - pDest->dwCompStrOffset;
555
556 /* dwTargetStrOffset */
557 cch1 = pSrc->dwTargetStrOffset / sizeof(WCHAR);
558 cch0 = IchAnsiFromWide(cch1, pchSrc, uCodePage);
559 pDest->dwTargetStrOffset = cch0 * sizeof(CHAR);
560
561 /* dwTargetStrLen */
562 cch0 = IchAnsiFromWide(cch1 + pSrc->dwTargetStrLen, pchSrc, uCodePage);
563 pDest->dwTargetStrLen = cch0 * sizeof(CHAR) - pDest->dwTargetStrOffset;
564
565 /* dwStrLen */
566 pDest->dwStrLen = cchDest;
567
568 /* the string */
569 pchDest = (LPSTR)pDest + pDest->dwStrOffset;
570 cchDest = WideCharToMultiByte(uCodePage, 0, pchSrc, pSrc->dwStrLen,
571 pchDest, cchDest, NULL, NULL);
572 pchDest[cchDest] = 0;
573
574 TRACE("cchDest: 0x%X\n", cchDest);
575 return cbDest;
576}
577
578/***********************************************************************
579 * ImmCreateIMCC(IMM32.@)
580 */
583{
584 if (size < sizeof(DWORD))
585 size = sizeof(DWORD);
586 return LocalAlloc(LHND, size);
587}
588
589/***********************************************************************
590 * ImmDestroyIMCC(IMM32.@)
591 */
594{
595 if (block)
596 return LocalFree(block);
597 return NULL;
598}
599
600/***********************************************************************
601 * ImmLockIMCC(IMM32.@)
602 */
605{
606 if (imcc)
607 return LocalLock(imcc);
608 return NULL;
609}
610
611/***********************************************************************
612 * ImmUnlockIMCC(IMM32.@)
613 */
616{
617 if (imcc)
618 return LocalUnlock(imcc);
619 return FALSE;
620}
621
622/***********************************************************************
623 * ImmGetIMCCLockCount(IMM32.@)
624 */
627{
628 return LocalFlags(imcc) & LMEM_LOCKCOUNT;
629}
630
631/***********************************************************************
632 * ImmReSizeIMCC(IMM32.@)
633 */
636 _In_ HIMCC imcc,
638{
639 if (!imcc)
640 return NULL;
641 return LocalReAlloc(imcc, size, LHND);
642}
643
644/***********************************************************************
645 * ImmGetIMCCSize(IMM32.@)
646 */
649{
650 if (imcc)
651 return LocalSize(imcc);
652 return 0;
653}
654
655/***********************************************************************
656 * ImmGetIMCLockCount(IMM32.@)
657 */
660{
661 DWORD ret;
662 HANDLE hInputContext;
663 PCLIENTIMC pClientImc;
664
665 pClientImc = ImmLockClientImc(hIMC);
666 if (IS_NULL_UNEXPECTEDLY(pClientImc))
667 return 0;
668
669 ret = 0;
670 hInputContext = pClientImc->hInputContext;
671 if (hInputContext)
672 ret = (LocalFlags(hInputContext) & LMEM_LOCKCOUNT);
673
674 ImmUnlockClientImc(pClientImc);
675 return ret;
676}
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
LONG NTSTATUS
Definition: precomp.h:26
#define index(s, c)
Definition: various.h:29
#define CHAR(Char)
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_FAIL
Definition: ddrawi.h:102
DWORD HIMCC
Definition: dimm.idl:76
DWORD HIMC
Definition: dimm.idl:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define HeapAlloc
Definition: compat.h:733
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define lstrlenW
Definition: compat.h:750
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
BOOL WINAPI IsDBCSLeadByteEx(UINT codepage, BYTE testchar)
Definition: locale.c:2104
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1230
LCID lcid
Definition: locale.c:5656
_In_ uint64_t _In_ uint64_t _In_ uint64_t generation
Definition: btrfs.c:2996
#define ULONG_PTR
Definition: config.h:101
DWORD dwThreadId
Definition: fdebug.c:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
Status
Definition: gdiplustypes.h:25
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
HLOCAL NTAPI LocalReAlloc(HLOCAL hMem, SIZE_T dwBytes, UINT uFlags)
Definition: heapmem.c:1625
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
LPVOID NTAPI LocalLock(HLOCAL hMem)
Definition: heapmem.c:1616
BOOL NTAPI LocalUnlock(HLOCAL hMem)
Definition: heapmem.c:1805
SIZE_T NTAPI LocalSize(HLOCAL hMem)
Definition: heapmem.c:1794
UINT NTAPI LocalFlags(HLOCAL hMem)
Definition: heapmem.c:1520
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
static const struct newhuff ht[]
Definition: huffman.h:296
SHAREDINFO gSharedInfo
Definition: imm.c:19
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:954
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:531
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:561
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1001
#define CLIENTIMC_WIDE
Definition: imm32_undoc.h:169
DWORD_PTR NTAPI NtUserCallOneParam(DWORD_PTR Param, DWORD Routine)
Definition: simplecall.c:153
@ THREADSTATE_GETTHREADINFO
Definition: ntuser.h:2503
#define ONEPARAM_ROUTINE_GETDESKTOPMAPPING
Definition: ntuser.h:3600
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
Definition: ime.c:1878
@ TYPE_WINDOW
Definition: ntuser.h:41
#define HANDLEENTRY_DESTROY
Definition: ntuser.h:13
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4207
NTSTATUS NTAPI NtUserBuildHimcList(_In_ DWORD dwThreadId, _In_ DWORD dwCount, _Out_ HIMC *phList, _Out_ PDWORD pdwCount)
Definition: ime.c:731
#define GetWin32ClientInfo()
Definition: ntuser.h:352
#define QUERY_WINDOW_UNIQUE_PROCESS_ID
Definition: ntuser.h:2843
BOOL NTAPI NtUserValidateHandleSecure(HANDLE hHdl)
Definition: object.c:792
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240
struct _USER_HANDLE_ENTRY * PUSER_HANDLE_ENTRY
#define FIRST_USER_HANDLE
Definition: ntuser.h:10
#define S_OK
Definition: intsafe.h:52
#define NtCurrentTeb
USHORT LANGID
Definition: mui.h:9
if(dx< 0)
Definition: linetemp.h:194
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define ASSERT(a)
Definition: mode.c:44
static PVOID ptr
Definition: dispmode.c:27
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static HANDLE ULONG_PTR dwData
Definition: file.c:35
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
UINT_PTR HKL
Definition: msctf.idl:125
unsigned int UINT
Definition: ndis.h:50
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define FASTCALL
Definition: nt_native.h:50
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
#define DWORD
Definition: nt_native.h:44
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
#define offsetof(TYPE, MEMBER)
#define LANGIDFROMLCID(l)
Definition: nls.h:18
DWORD LCID
Definition: nls.h:13
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define LANG_KOREAN
Definition: nls.h:84
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchLengthA(STRSAFE_LPCSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:832
STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:842
WORD wLang
Definition: imm32_undoc.h:214
PIME_SUBSTATE pSubState
Definition: imm32_undoc.h:219
struct IME_STATE * pNext
Definition: imm32_undoc.h:213
struct IME_SUBSTATE * pNext
Definition: imm32_undoc.h:202
struct IME_STATE * pState
Definition: imm32_undoc.h:195
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
ULONG_PTR ulClientDelta
Definition: ntuser.h:326
PDESKTOPINFO pDeskInfo
Definition: ntuser.h:325
PVOID aheList
Definition: ntuser.h:1131
ULONG_PTR ulSharedDelta
Definition: ntuser.h:1133
Definition: ntuser.h:17
void * ptr
Definition: ntuser.h:18
unsigned char type
Definition: ntuser.h:25
HANDLE hInputContext
Definition: imm32_undoc.h:147
Definition: ntuser.h:199
THRDESKHEAD head
Definition: ntuser.h:200
CHAR lfFaceName[LF_FACESIZE]
Definition: wingdi.h:1894
WCHAR lfFaceName[LF_FACESIZE]
Definition: wingdi.h:1910
#define DWORD_PTR
Definition: treelist.c:76
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define NT_ERROR(Status)
Definition: umtypes.h:106
@ QIC_INPUTTHREADID
Definition: undocuser.h:404
@ QIC_INPUTPROCESSID
Definition: undocuser.h:403
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
int ret
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_writes_opt_ NumCharacters PUSHORT _Inout_ PUSHORT _In_ UCHAR _In_opt_ USHORT LangID
Definition: wdfusb.h:1083
#define ImmLocalFree(lpData)
Definition: precomp.h:105
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:66
#define MAX_RETRY
DWORD Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
Definition: utils.c:338
BOOL Imm32IsCrossThreadAccess(HIMC hIMC)
Definition: utils.c:25
DWORD WINAPI ImmGetIMCCSize(_In_ HIMCC imcc)
Definition: utils.c:648
LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
Definition: utils.c:140
PIME_SUBSTATE Imm32FetchImeSubState(PIME_STATE pState, HKL hKL)
Definition: utils.c:401
HANDLE ghImmHeap
Definition: utils.c:16
BOOL WINAPI ImmUnlockIMCC(_In_ HIMCC imcc)
Definition: utils.c:615
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
Definition: utils.c:201
BOOL Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
Definition: utils.c:420
HIMCC WINAPI ImmReSizeIMCC(_In_ HIMCC imcc, _In_ DWORD size)
Definition: utils.c:635
DWORD Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:451
HIMCC WINAPI ImmDestroyIMCC(_In_ HIMCC block)
Definition: utils.c:593
LPWSTR Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
Definition: utils.c:96
DWORD WINAPI ImmGetIMCCLockCount(_In_ HIMCC imcc)
Definition: utils.c:626
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
Definition: utils.c:18
DWORD WINAPI ImmGetIMCLockCount(_In_ HIMC hIMC)
Definition: utils.c:659
BOOL Imm32MakeIMENotify(_In_ HIMC hIMC, _In_ HWND hwnd, _In_ DWORD dwAction, _In_ DWORD dwIndex, _Inout_opt_ DWORD_PTR dwValue, _In_ DWORD dwCommand, _Inout_opt_ DWORD_PTR dwData)
Definition: utils.c:287
LONG IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
Definition: utils.c:120
VOID LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
Definition: utils.c:164
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
Definition: utils.c:152
BOOL Imm32IsImcAnsi(HIMC hIMC)
Definition: utils.c:85
HRESULT Imm32UIntToStr(_In_ DWORD dwValue, _In_ ULONG nBase, _Out_ PWSTR pszBuff, _In_ USHORT cchBuff)
Definition: utils.c:56
BOOL Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
Definition: utils.c:431
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
Definition: utils.c:239
LPSTR Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
Definition: utils.c:107
BOOL Imm32IsSystemJapaneseOrKorean(VOID)
Definition: utils.c:72
#define INITIAL_COUNT
BOOL Imm32IsCrossProcessAccess(HWND hWnd)
Definition: utils.c:32
PIME_STATE Imm32FetchImeState(LPINPUTCONTEXTDX pIC, HKL hKL)
Definition: utils.c:378
static PVOID FASTCALL DesktopPtrToUser(PVOID ptr)
Definition: utils.c:188
DWORD Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:514
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
VOID LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
Definition: utils.c:176
HIMCC WINAPI ImmCreateIMCC(_In_ DWORD size)
Definition: utils.c:582
HRESULT Imm32StrToUInt(_In_ PCWSTR pszText, _Out_ PDWORD pdwValue, _In_ ULONG nBase)
Definition: utils.c:40
BOOL Imm32CheckImcProcess(PIMC pIMC)
Definition: utils.c:252
LPVOID WINAPI ImmLockIMCC(_In_ HIMCC imcc)
Definition: utils.c:604
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
#define LHND
Definition: winbase.h:415
#define LMEM_LOCKCOUNT
Definition: winbase.h:412
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO * pdi
Definition: winddi.h:3554
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:881
_In_ DWORD _In_ int _In_ int cchDest
Definition: winnls.h:1197
#define MB_PRECOMPOSED
Definition: winnls.h:299
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
#define WM_IME_NOTIFY
Definition: winuser.h:1849
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static unsigned int block
Definition: xmlmemory.c:101
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185