ReactOS 0.4.16-dev-2332-g4cba65d
precomp.h
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
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 Oleg Dubinskiy <oleg.dubinskij2013@yandex.ua>
10 * Copyright 2020-2022 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
11 */
12
13#pragma once
14
15#include <stdio.h>
16#include <stdlib.h>
17
18/* PSDK/NDK Headers */
19#define WIN32_NO_STATUS
20#include <windef.h>
21#include <winbase.h>
22#include <wingdi.h>
23#include <winuser.h>
24#include <winnls.h>
25#include <winreg.h>
26#include <winnls32.h>
27#include <winver.h>
28
29#include <imm.h>
30#include <immdev.h>
31#include <imm32_undoc.h>
32#include <cjkcode.h> // LANGID_...
33
34#define NTOS_MODE_USER
35#include <ndk/umtypes.h>
36#include <ndk/pstypes.h>
37#include <ndk/rtlfuncs.h>
38
39/* Public Win32K Headers */
40#include "ntuser.h"
41#include "ntwin32.h"
42
43/* Undocumented user definitions */
44#include <undocuser.h>
45
46#include <strsafe.h>
47
48#include <wine/debug.h>
49
50#define ERR_PRINTF(fmt, ...) (__WINE_IS_DEBUG_ON(_ERR, __wine_dbch___default) ? \
51 (wine_dbg_printf("err:(%s:%d) " fmt, __RELFILE__, __LINE__, ##__VA_ARGS__), TRUE) : TRUE)
52
53/* Unexpected Condition Checkers */
54#if DBG
55 #define FAILED_UNEXPECTEDLY(hr) \
56 (FAILED(hr) ? ERR_PRINTF("FAILED(0x%08X)\n", hr) : FALSE)
57 #define IS_NULL_UNEXPECTEDLY(p) \
58 (!(p) ? ERR_PRINTF("%s was NULL\n", #p) : FALSE)
59 #define IS_ZERO_UNEXPECTEDLY(p) \
60 (!(p) ? ERR_PRINTF("%s was zero\n", #p) : FALSE)
61 #define IS_TRUE_UNEXPECTEDLY(x) \
62 ((x) ? ERR_PRINTF("%s was non-zero\n", #x) : FALSE)
63 #define IS_ERROR_UNEXPECTEDLY(x) \
64 ((x) != ERROR_SUCCESS ? ERR_PRINTF("%s was %d\n", #x, (int)(x)) : FALSE)
65#else
66 #define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
67 #define IS_NULL_UNEXPECTEDLY(p) (!(p))
68 #define IS_ZERO_UNEXPECTEDLY(p) (!(p))
69 #define IS_TRUE_UNEXPECTEDLY(x) (x)
70 #define IS_ERROR_UNEXPECTEDLY(x) ((x) != ERROR_SUCCESS)
71#endif
72
73#define IS_CROSS_THREAD_HIMC(hIMC) IS_TRUE_UNEXPECTEDLY(Imm32IsCrossThreadAccess(hIMC))
74#define IS_CROSS_PROCESS_HWND(hWnd) IS_TRUE_UNEXPECTEDLY(Imm32IsCrossProcessAccess(hWnd))
75
76#define IMM_INIT_MAGIC 0x19650412
77#define IMM_INVALID_CANDFORM ULONG_MAX
78#define INVALID_HOTKEY_ID 0xFFFFFFFF
79#define MAX_CANDIDATEFORM 4
80#define MAX_IMM_FILENAME 80
81
82#define REGKEY_KEYBOARD_LAYOUTS L"System\\CurrentControlSet\\Control\\Keyboard Layouts"
83
84extern HMODULE ghImm32Inst;
87extern PSERVERINFO gpsi;
89extern HANDLE ghImmHeap;
91
93VOID LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW);
94VOID LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA);
97#define ValidateHwndNoErr(hwnd) ValidateHandleNoErr((hwnd), TYPE_WINDOW)
98#define ValidateHwnd(hwnd) ValidateHandle((hwnd), TYPE_WINDOW)
100
102#define ImmLocalFree(lpData) HeapFree(ghImmHeap, 0, (lpData))
103
104LPWSTR Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA);
105LPSTR Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW);
106LONG IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage);
107LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage);
116
117#define ImeDpi_IsUnicode(pImeDpi) ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE)
118
119DWORD
120CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen,
121 UINT uCodePage);
122DWORD
123CandidateListAnsiToWide(const CANDIDATELIST *pAnsiCL, LPCANDIDATELIST pWideCL, DWORD dwBufLen,
124 UINT uCodePage);
125
126BOOL
128 _In_ HIMC hIMC,
129 _In_ HWND hwnd,
130 _In_ DWORD dwAction,
131 _In_ DWORD dwIndex,
132 _Inout_opt_ DWORD_PTR dwValue,
133 _In_ DWORD dwCommand,
135
137
140
141BOOL
143BOOL
145
146DWORD
147Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage);
148DWORD
149Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage);
150
153 _In_ PCWSTR pszText,
154 _Out_ PDWORD pdwValue,
155 _In_ ULONG nBase);
156
159 _In_ DWORD dwValue,
160 _In_ ULONG nBase,
161 _Out_ PWSTR pszBuff,
162 _In_ USHORT cchBuff);
163
165
172
175 _In_ HIMC hIMC,
176 _In_ BOOL fActive,
177 _In_ HWND hWnd,
178 _In_ HKL hKL);
179
180BOOL
182 _In_ HIMC hIMC,
183 _In_ UINT vKey,
185
188 _In_ HWND hWnd,
189 _In_ BOOL fSet);
HWND hWnd
Definition: settings.c:17
LPARAM lParam
Definition: combotst.c:139
DWORD HIMC
Definition: dimm.idl:75
DWORD dwThreadId
Definition: fdebug.c:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR HKL
Definition: msctf.idl:125
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define FASTCALL
Definition: nt_native.h:50
static HANDLE ULONG_PTR dwData
Definition: pipe.c:83
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1527
Definition: ntuser.h:199
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
BOOL Imm32LoadImeVerInfo(_Out_ PIMEINFOEX pImeInfoEx)
DWORD Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
Definition: utils.c:338
DWORD CandidateListAnsiToWide(const CANDIDATELIST *pAnsiCL, LPCANDIDATELIST pWideCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:84
BOOL Imm32IsCrossThreadAccess(HIMC hIMC)
Definition: utils.c:25
LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
Definition: utils.c:140
DWORD CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:15
HRESULT CtfImeSetActiveContextAlways(_In_ HIMC hIMC, _In_ BOOL fActive, _In_ HWND hWnd, _In_ HKL hKL)
Definition: msctfime.cpp:775
PIME_SUBSTATE Imm32FetchImeSubState(PIME_STATE pState, HKL hKL)
Definition: utils.c:401
HANDLE ghImmHeap
Definition: utils.c:16
LPINPUTCONTEXT Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect)
Definition: imm.c:852
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
Definition: utils.c:201
BOOL Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
Definition: utils.c:420
RTL_CRITICAL_SECTION gcsImeDpi
Definition: ime.c:16
DWORD Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:451
HRESULT CtfImeCreateThreadMgr(VOID)
Definition: msctfime.cpp:666
HRESULT CtfImmCoInitialize(VOID)
Definition: ctf.c:574
HRESULT CtfImeDestroyThreadMgr(VOID)
Definition: msctfime.cpp:705
HMODULE ghImm32Inst
Definition: imm.c:17
LPWSTR Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
Definition: utils.c:96
PIMEDPI gpImeDpiList
Definition: ime.c:17
HRESULT CtfImmTIMCreateInputContext(_In_ HIMC hIMC)
Definition: ctf.c:939
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
Definition: utils.c:18
HRESULT Imm32ActivateOrDeactivateTIM(_In_ BOOL bCreate)
Definition: ctf.c:895
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 Imm32ReleaseIME(_In_ HKL hKL)
Definition: ime.c:378
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
HRESULT CtfImmTIMDestroyInputContext(_In_ HIMC hIMC)
Definition: ctf.c:929
BOOL Imm32IsSystemJapaneseOrKorean(VOID)
Definition: utils.c:72
SHAREDINFO gSharedInfo
Definition: imm.c:19
BOOL CtfImeProcessCicHotkey(_In_ HIMC hIMC, _In_ UINT vKey, _In_ LPARAM lParam)
Definition: msctfime.cpp:795
PIMEDPI Imm32FindOrLoadImeDpi(HKL hKL)
Definition: ime.c:350
BOOL Imm32IsCrossProcessAccess(HWND hWnd)
Definition: utils.c:32
PIME_STATE Imm32FetchImeState(LPINPUTCONTEXTDX pIC, HKL hKL)
Definition: utils.c:378
PSERVERINFO gpsi
Definition: imm.c:18
DWORD Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:514
LRESULT CtfImmSetLangBand(_In_ HWND hWnd, _In_ BOOL fSet)
Definition: ctf.c:1234
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
DWORD g_aimm_compat_flags
Definition: ctf.c:204
VOID LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
Definition: utils.c:176
HRESULT Imm32StrToUInt(_In_ PCWSTR pszText, _Out_ PDWORD pdwValue, _In_ ULONG nBase)
Definition: utils.c:40
BOOL Imm32CheckImcProcess(PIMC pIMC)
Definition: utils.c:252
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182