ReactOS 0.4.16-dev-1505-g12fa72a
utils.c File Reference
#include "precomp.h"
Include dependency graph for utils.c:

Go to the source code of this file.

Macros

#define INITIAL_COUNT   0x40
 
#define MAX_RETRY   10
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (imm)
 
PTHREADINFO FASTCALL Imm32CurrentPti (VOID)
 
BOOL Imm32IsCrossThreadAccess (HIMC hIMC)
 
BOOL Imm32IsCrossProcessAccess (HWND hWnd)
 
HRESULT Imm32StrToUInt (_In_ PCWSTR pszText, _Out_ PDWORD pdwValue, _In_ ULONG nBase)
 
HRESULT Imm32UIntToStr (_In_ DWORD dwValue, _In_ ULONG nBase, _Out_ PWSTR pszBuff, _In_ USHORT cchBuff)
 
BOOL Imm32IsSystemJapaneseOrKorean (VOID)
 
BOOL Imm32IsImcAnsi (HIMC hIMC)
 
LPWSTR Imm32WideFromAnsi (UINT uCodePage, LPCSTR pszA)
 
LPSTR Imm32AnsiFromWide (UINT uCodePage, LPCWSTR pszW)
 
LONG IchWideFromAnsi (LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
 
LONG IchAnsiFromWide (LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
 
BOOL Imm32GetSystemLibraryPath (LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
 
VOID LogFontAnsiToWide (const LOGFONTA *plfA, LPLOGFONTW plfW)
 
VOID LogFontWideToAnsi (const LOGFONTW *plfW, LPLOGFONTA plfA)
 
static PVOID FASTCALL DesktopPtrToUser (PVOID ptr)
 
LPVOID FASTCALL ValidateHandleNoErr (HANDLE hObject, UINT uType)
 
LPVOID FASTCALL ValidateHandle (HANDLE hObject, UINT uType)
 
BOOL Imm32CheckImcProcess (PIMC pIMC)
 
LPVOID ImmLocalAlloc (_In_ DWORD dwFlags, _In_ DWORD dwBytes)
 
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)
 
DWORD Imm32BuildHimcList (DWORD dwThreadId, HIMC **pphList)
 
PIME_STATE Imm32FetchImeState (LPINPUTCONTEXTDX pIC, HKL hKL)
 
PIME_SUBSTATE Imm32FetchImeSubState (PIME_STATE pState, HKL hKL)
 
BOOL Imm32LoadImeStateSentence (LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
 
BOOL Imm32SaveImeStateSentence (LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
 
DWORD Imm32ReconvertWideFromAnsi (LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
 
DWORD Imm32ReconvertAnsiFromWide (LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
 
HIMCC WINAPI ImmCreateIMCC (_In_ DWORD size)
 
HIMCC WINAPI ImmDestroyIMCC (_In_ HIMCC block)
 
LPVOID WINAPI ImmLockIMCC (_In_ HIMCC imcc)
 
BOOL WINAPI ImmUnlockIMCC (_In_ HIMCC imcc)
 
DWORD WINAPI ImmGetIMCCLockCount (_In_ HIMCC imcc)
 
HIMCC WINAPI ImmReSizeIMCC (_In_ HIMCC imcc, _In_ DWORD size)
 
DWORD WINAPI ImmGetIMCCSize (_In_ HIMCC imcc)
 
DWORD WINAPI ImmGetIMCLockCount (_In_ HIMC hIMC)
 

Variables

HANDLE ghImmHeap = NULL
 

Macro Definition Documentation

◆ INITIAL_COUNT

#define INITIAL_COUNT   0x40

◆ MAX_RETRY

#define MAX_RETRY   10

Function Documentation

◆ DesktopPtrToUser()

static PVOID FASTCALL DesktopPtrToUser ( PVOID  ptr)
static

Definition at line 188 of file utils.c.

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}
#define NULL
Definition: types.h:112
#define ULONG_PTR
Definition: config.h:101
DWORD_PTR NTAPI NtUserCallOneParam(DWORD_PTR Param, DWORD Routine)
Definition: simplecall.c:153
#define ONEPARAM_ROUTINE_GETDESKTOPMAPPING
Definition: ntuser.h:3604
#define GetWin32ClientInfo()
Definition: ntuser.h:352
#define ASSERT(a)
Definition: mode.c:44
static PVOID ptr
Definition: dispmode.c:27
ULONG_PTR ulClientDelta
Definition: ntuser.h:326
PDESKTOPINFO pDeskInfo
Definition: ntuser.h:325
uint32_t DWORD_PTR
Definition: typedefs.h:65
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO * pdi
Definition: winddi.h:3554

Referenced by CallNextHookEx(), GetAncestor(), GetClassLongA(), GetClassLongW(), GetClassWord(), GetLastActivePopup(), GetMenuItemInfo_common(), GetMenuState(), GetMenuStringA(), GetMenuStringW(), GetParent(), GetSubMenu(), GetThreadDesktopWnd(), GetWindow(), GetWindowInfo(), IntCallMessageProc(), IntFindChildWindowToOwner(), IntGetMenuDefaultItem(), IntGetSBData(), IntGetWndProc(), IntScrollGetScrollBarRect(), IsChild(), IsWindowVisible(), MENU_FindItem(), RealDefWindowProcA(), RealDefWindowProcW(), User32DefWindowProc(), ValidateHandle(), and ValidateHandleNoErr().

◆ IchAnsiFromWide()

LONG IchAnsiFromWide ( LONG  cchWide,
LPCWSTR  pchWide,
UINT  uCodePage 
)

Definition at line 140 of file utils.c.

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}
#define WideCharToMultiByte
Definition: compat.h:111
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
long LONG
Definition: pedump.c:60

Referenced by Imm32GetCompStrA(), Imm32ProcessRequest(), and Imm32ReconvertAnsiFromWide().

◆ IchWideFromAnsi()

LONG IchWideFromAnsi ( LONG  cchAnsi,
LPCSTR  pchAnsi,
UINT  uCodePage 
)

Definition at line 120 of file utils.c.

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}
BOOL WINAPI IsDBCSLeadByteEx(UINT codepage, BYTE testchar)
Definition: locale.c:2106

Referenced by Imm32GetCompStrW(), Imm32ProcessRequest(), and Imm32ReconvertWideFromAnsi().

◆ Imm32AnsiFromWide()

LPSTR Imm32AnsiFromWide ( UINT  uCodePage,
LPCWSTR  pszW 
)

Definition at line 107 of file utils.c.

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] = ANSI_NULL;
116 return pszA;
117}
#define lstrlenW
Definition: compat.h:750
#define ANSI_NULL
int32_t INT
Definition: typedefs.h:58
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:66
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by Imm32EnumWordProcW2A(), ImmConfigureIMEW(), ImmEnumRegisterWordW(), ImmGetConversionListW(), ImmRegisterWordW(), and ImmUnregisterWordW().

◆ Imm32BuildHimcList()

DWORD Imm32BuildHimcList ( DWORD  dwThreadId,
HIMC **  pphList 
)

Definition at line 338 of file utils.c.

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}
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: precomp.h:57
DWORD HIMC
Definition: dimm.idl:75
DWORD dwThreadId
Definition: fdebug.c:31
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:25
NTSTATUS NTAPI NtUserBuildHimcList(_In_ DWORD dwThreadId, _In_ DWORD dwCount, _Out_ HIMC *phList, _Out_ PDWORD pdwCount)
Definition: ime.c:738
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define NT_ERROR(Status)
Definition: umtypes.h:106
#define ImmLocalFree(lpData)
Definition: precomp.h:105
#define MAX_RETRY
#define INITIAL_COUNT

Referenced by ImmEnumInputContext().

◆ Imm32CheckImcProcess()

BOOL Imm32CheckImcProcess ( PIMC  pIMC)

Definition at line 252 of file utils.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
Definition: ime.c:1885
#define NtCurrentTeb
#define DWORD
Definition: nt_native.h:44
THRDESKHEAD head
Definition: ntuser.h:200
#define DWORD_PTR
Definition: treelist.c:76
@ QIC_INPUTPROCESSID
Definition: undocuser.h:403
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
Definition: utils.c:18

Referenced by ImmLockClientImc().

◆ Imm32CurrentPti()

PTHREADINFO FASTCALL Imm32CurrentPti ( VOID  )

Definition at line 18 of file utils.c.

19{
20 if (NtCurrentTeb()->Win32ThreadInfo == NULL)
22 return NtCurrentTeb()->Win32ThreadInfo;
23}
@ THREADSTATE_GETTHREADINFO
Definition: ntuser.h:2507
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240

Referenced by Imm32CheckImcProcess(), Imm32DestroyInputContext(), and ImmRequestMessageAW().

◆ Imm32FetchImeState()

PIME_STATE Imm32FetchImeState ( LPINPUTCONTEXTDX  pIC,
HKL  hKL 
)

Definition at line 378 of file utils.c.

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}
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned short WORD
Definition: ntddk_ex.h:93
#define LOWORD(l)
Definition: pedump.c:82
#define PRIMARYLANGID(l)
Definition: nls.h:16
WORD wLang
Definition: imm32_undoc.h:214
struct IME_STATE * pNext
Definition: imm32_undoc.h:213
struct IME_STATE * pState
Definition: imm32_undoc.h:195

Referenced by Imm32SelectInputContext().

◆ Imm32FetchImeSubState()

PIME_SUBSTATE Imm32FetchImeSubState ( PIME_STATE  pState,
HKL  hKL 
)

Definition at line 401 of file utils.c.

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}
PIME_SUBSTATE pSubState
Definition: imm32_undoc.h:219
struct IME_SUBSTATE * pNext
Definition: imm32_undoc.h:202

Referenced by Imm32LoadImeStateSentence(), and Imm32SaveImeStateSentence().

◆ Imm32GetSystemLibraryPath()

BOOL Imm32GetSystemLibraryPath ( LPWSTR  pszPath,
DWORD  cchPath,
LPCWSTR  pszFileName 
)

Definition at line 152 of file utils.c.

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}
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
#define L(x)
Definition: resources.c:13
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44

Referenced by Imm32CopyImeFile(), Imm32GetFn(), Imm32LoadCtfIme(), Imm32LoadIME(), Imm32LoadImeVerInfo(), and ImmInstallIMEW().

◆ Imm32IsCrossProcessAccess()

BOOL Imm32IsCrossProcessAccess ( HWND  hWnd)

Definition at line 32 of file utils.c.

33{
35 DWORD_PTR CurrentPID = (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess;
36 return WndPID != CurrentPID;
37}
HWND hWnd
Definition: settings.c:17
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
Definition: window.c:4207
#define QUERY_WINDOW_UNIQUE_PROCESS_ID
Definition: ntuser.h:2847

◆ Imm32IsCrossThreadAccess()

BOOL Imm32IsCrossThreadAccess ( HIMC  hIMC)

Definition at line 25 of file utils.c.

26{
28 DWORD_PTR dwCurrentThreadId = GetCurrentThreadId();
29 return dwImeThreadId != dwCurrentThreadId;
30}
@ QIC_INPUTTHREADID
Definition: undocuser.h:404
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459

Referenced by ImmSetCompositionWindow().

◆ Imm32IsImcAnsi()

BOOL Imm32IsImcAnsi ( HIMC  hIMC)

Definition at line 85 of file utils.c.

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}
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:954
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1001
#define CLIENTIMC_WIDE
Definition: imm32_undoc.h:169

Referenced by ImmGetImeMenuItemsAW().

◆ Imm32IsSystemJapaneseOrKorean()

BOOL Imm32IsSystemJapaneseOrKorean ( VOID  )

Definition at line 72 of file utils.c.

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}
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1235
LCID lcid
Definition: locale.c:5656
USHORT LANGID
Definition: mui.h:9
#define LANGIDFROMLCID(l)
Definition: nls.h:18
DWORD LCID
Definition: nls.h:13
#define LANG_JAPANESE
Definition: nls.h:76
#define LANG_KOREAN
Definition: nls.h:84
#define TRACE(s)
Definition: solgame.cpp:4
_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

Referenced by ImmIMPGetIMEA(), ImmIMPGetIMEW(), ImmIMPQueryIMEA(), ImmIMPQueryIMEW(), ImmIMPSetIMEA(), ImmIMPSetIMEW(), ImmWINNLSEnableIME(), and ImmWINNLSGetEnableStatus().

◆ Imm32LoadImeStateSentence()

BOOL Imm32LoadImeStateSentence ( LPINPUTCONTEXTDX  pIC,
PIME_STATE  pState,
HKL  hKL 
)

Definition at line 420 of file utils.c.

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}
PIME_SUBSTATE Imm32FetchImeSubState(PIME_STATE pState, HKL hKL)
Definition: utils.c:401

Referenced by Imm32SelectInputContext().

◆ Imm32MakeIMENotify()

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 at line 287 of file utils.c.

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}
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:531
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:561
static HANDLE ULONG_PTR dwData
Definition: file.c:35
UINT_PTR HKL
Definition: msctf.idl:125
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
#define WM_IME_NOTIFY
Definition: winuser.h:1858
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by ImmSetCandidateWindow(), ImmSetCompositionFontA(), ImmSetCompositionFontW(), ImmSetCompositionWindow(), ImmSetConversionStatus(), ImmSetOpenStatus(), and ImmSetStatusWindowPos().

◆ Imm32ReconvertAnsiFromWide()

DWORD Imm32ReconvertAnsiFromWide ( LPRECONVERTSTRING  pDest,
const RECONVERTSTRING *  pSrc,
UINT  uCodePage 
)

Definition at line 514 of file utils.c.

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] = ANSI_NULL;
573
574 TRACE("cchDest: 0x%X\n", cchDest);
575 return cbDest;
576}
#define CHAR(Char)
LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
Definition: utils.c:140
_In_ DWORD _In_ int _In_ int cchDest
Definition: winnls.h:1197
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by Imm32ProcessRequest(), and ImmSetCompositionStringAW().

◆ Imm32ReconvertWideFromAnsi()

DWORD Imm32ReconvertWideFromAnsi ( LPRECONVERTSTRING  pDest,
const RECONVERTSTRING *  pSrc,
UINT  uCodePage 
)

Definition at line 451 of file utils.c.

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] = UNICODE_NULL;
508
509 TRACE("cbDest: 0x%X\n", cbDest);
510 return cbDest;
511}
#define MultiByteToWideChar
Definition: compat.h:110
if(dx< 0)
Definition: linetemp.h:194
#define UNICODE_NULL
unsigned char * LPBYTE
Definition: typedefs.h:53
LONG IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
Definition: utils.c:120
#define MB_PRECOMPOSED
Definition: winnls.h:299
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by Imm32ProcessRequest(), and ImmSetCompositionStringAW().

◆ Imm32SaveImeStateSentence()

BOOL Imm32SaveImeStateSentence ( LPINPUTCONTEXTDX  pIC,
PIME_STATE  pState,
HKL  hKL 
)

Definition at line 431 of file utils.c.

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}

Referenced by Imm32SelectInputContext().

◆ Imm32StrToUInt()

HRESULT Imm32StrToUInt ( _In_ PCWSTR  pszText,
_Out_ PDWORD  pdwValue,
_In_ ULONG  nBase 
)

Definition at line 40 of file utils.c.

44{
47 *pdwValue = 0;
50 if (!NT_SUCCESS(Status))
51 return E_FAIL;
52 return S_OK;
53}
#define E_FAIL
Definition: ddrawi.h:102
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define S_OK
Definition: intsafe.h:52
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)

Referenced by Imm32GetImeLayoutList(), and Imm32UnitTest().

◆ Imm32UIntToStr()

HRESULT Imm32UIntToStr ( _In_ DWORD  dwValue,
_In_ ULONG  nBase,
_Out_ PWSTR  pszBuff,
_In_ USHORT  cchBuff 
)

Definition at line 56 of file utils.c.

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}
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)

Referenced by Imm32UnitTest(), and Imm32WriteImeLayout().

◆ Imm32WideFromAnsi()

LPWSTR Imm32WideFromAnsi ( UINT  uCodePage,
LPCSTR  pszA 
)

Definition at line 96 of file utils.c.

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] = UNICODE_NULL;
104 return pszW;
105}
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202

Referenced by Imm32EnumWordProcA2W(), ImmConfigureIMEA(), ImmEnumRegisterWordA(), ImmGetConversionListA(), ImmInstallIMEA(), ImmRegisterWordA(), and ImmUnregisterWordA().

◆ ImmCreateIMCC()

HIMCC WINAPI ImmCreateIMCC ( _In_ DWORD  size)

Definition at line 582 of file utils.c.

583{
584 if (size < sizeof(DWORD))
585 size = sizeof(DWORD);
586 return LocalAlloc(LHND, size);
587}
GLsizeiptr size
Definition: glext.h:5919
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
#define LHND
Definition: winbase.h:415

Referenced by CicIMCLock::ClearCand(), CicBridge::CreateInputContext(), Imm32CreateInputContext(), Imm32SelectInputContext(), START_TEST(), test_ImmDestroyIMCC(), and test_ImmGetIMCCLockCount().

◆ ImmDestroyIMCC()

HIMCC WINAPI ImmDestroyIMCC ( _In_ HIMCC  block)

Definition at line 593 of file utils.c.

594{
595 if (block)
596 return LocalFree(block);
597 return NULL;
598}
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
static unsigned int block
Definition: xmlmemory.c:101

Referenced by CicIMCLock::ClearCand(), CicBridge::DestroyInputContext(), Imm32CreateInputContext(), Imm32DestroyInputContext(), Imm32SelectInputContext(), START_TEST(), test_ImmDestroyIMCC(), and test_ImmGetIMCCLockCount().

◆ ImmGetIMCCLockCount()

DWORD WINAPI ImmGetIMCCLockCount ( _In_ HIMCC  imcc)

Definition at line 626 of file utils.c.

627{
628 return LocalFlags(imcc) & LMEM_LOCKCOUNT;
629}
UINT NTAPI LocalFlags(HLOCAL hMem)
Definition: heapmem.c:1520
#define LMEM_LOCKCOUNT
Definition: winbase.h:412

Referenced by Imm32SelectInputContext(), START_TEST(), test_ImmDestroyIMCC(), and test_ImmGetIMCCLockCount().

◆ ImmGetIMCCSize()

DWORD WINAPI ImmGetIMCCSize ( _In_ HIMCC  imcc)

Definition at line 648 of file utils.c.

649{
650 if (imcc)
651 return LocalSize(imcc);
652 return 0;
653}
SIZE_T NTAPI LocalSize(HLOCAL hMem)
Definition: heapmem.c:1794

Referenced by Imm32SelectInputContext(), START_TEST(), Test1(), test_ImmDestroyIMCC(), and CicIMCLock::ValidCompositionString().

◆ ImmGetIMCLockCount()

DWORD WINAPI ImmGetIMCLockCount ( _In_ HIMC  hIMC)

Definition at line 659 of file utils.c.

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}
HANDLE hInputContext
Definition: imm32_undoc.h:147

Referenced by test_ImmDestroyContext(), and test_ImmGetIMCLockCount().

◆ ImmLocalAlloc()

◆ ImmLockIMCC()

◆ ImmReSizeIMCC()

HIMCC WINAPI ImmReSizeIMCC ( _In_ HIMCC  imcc,
_In_ DWORD  size 
)

Definition at line 635 of file utils.c.

638{
639 if (!imcc)
640 return NULL;
641 return LocalReAlloc(imcc, size, LHND);
642}
HLOCAL NTAPI LocalReAlloc(HLOCAL hMem, SIZE_T dwBytes, UINT uFlags)
Definition: heapmem.c:1625

Referenced by CicIMCLock::ClearCand(), Imm32SelectInputContext(), and test_ImmMessages().

◆ ImmUnlockIMCC()

◆ LogFontAnsiToWide()

VOID LogFontAnsiToWide ( const LOGFONTA plfA,
LPLOGFONTW  plfW 
)

Definition at line 164 of file utils.c.

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] = UNICODE_NULL;
174}
#define CP_ACP
Definition: compat.h:109
#define offsetof(TYPE, MEMBER)
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchLengthA(STRSAFE_LPCSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:832
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
WCHAR lfFaceName[LF_FACESIZE]
Definition: wingdi.h:2356
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by Imm32ProcessRequest(), Imm32SelectInputContext(), ImmGetCompositionFontW(), and ImmSetCompositionFontA().

◆ LogFontWideToAnsi()

VOID LogFontWideToAnsi ( const LOGFONTW plfW,
LPLOGFONTA  plfA 
)

Definition at line 176 of file utils.c.

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] = ANSI_NULL;
186}
STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz, size_t cchMax, size_t *pcchLength)
Definition: strsafe.h:842
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
CHAR lfFaceName[LF_FACESIZE]
Definition: wingdi.h:2340

Referenced by Imm32ProcessRequest(), Imm32SelectInputContext(), ImmGetCompositionFontA(), and ImmSetCompositionFontW().

◆ ValidateHandle()

LPVOID FASTCALL ValidateHandle ( HANDLE  hObject,
UINT  uType 
)

Definition at line 239 of file utils.c.

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}
#define SetLastError(x)
Definition: compat.h:752
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
@ TYPE_WINDOW
Definition: ntuser.h:41
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
Definition: utils.c:201
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:881

◆ ValidateHandleNoErr()

LPVOID FASTCALL ValidateHandleNoErr ( HANDLE  hObject,
UINT  uType 
)

Definition at line 201 of file utils.c.

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}
#define index(s, c)
Definition: various.h:29
_In_ uint64_t _In_ uint64_t _In_ uint64_t generation
Definition: btrfs.c:2996
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
static const struct newhuff ht[]
Definition: huffman.h:296
SHAREDINFO gSharedInfo
Definition: imm.c:19
#define HANDLEENTRY_DESTROY
Definition: ntuser.h:13
BOOL NTAPI NtUserValidateHandleSecure(HANDLE hHdl)
Definition: object.c:792
struct _USER_HANDLE_ENTRY * PUSER_HANDLE_ENTRY
#define FIRST_USER_HANDLE
Definition: ntuser.h:10
unsigned int UINT
Definition: ndis.h:50
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
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define HIWORD(l)
Definition: typedefs.h:247
static PVOID FASTCALL DesktopPtrToUser(PVOID ptr)
Definition: utils.c:188

Referenced by ValidateHandle().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( imm  )

Variable Documentation

◆ ghImmHeap

HANDLE ghImmHeap = NULL

Definition at line 16 of file utils.c.

Referenced by ImmLocalAlloc().