ReactOS 0.4.16-dev-106-g10b08aa
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
33#define NTOS_MODE_USER
34#include <ndk/umtypes.h>
35#include <ndk/pstypes.h>
36#include <ndk/rtlfuncs.h>
37
38/* Public Win32K Headers */
39#include "ntuser.h"
40#include "ntwin32.h"
41
42/* Undocumented user definitions */
43#include <undocuser.h>
44
45#include <strsafe.h>
46
47#include <wine/debug.h>
48#include <wine/list.h>
49
50#define IMM_INIT_MAGIC 0x19650412
51#define IMM_INVALID_CANDFORM ULONG_MAX
52#define INVALID_HOTKEY_ID 0xFFFFFFFF
53#define MAX_CANDIDATEFORM 4
54#define MAX_IMM_FILENAME 80
55
56#define LANGID_CHINESE_SIMPLIFIED MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
57#define LANGID_CHINESE_TRADITIONAL MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
58#define LANGID_JAPANESE MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT)
59
60#define REGKEY_KEYBOARD_LAYOUTS L"System\\CurrentControlSet\\Control\\Keyboard Layouts"
61
62#define ROUNDUP4(n) (((n) + 3) & ~3) /* DWORD alignment */
63
64typedef struct REG_IME
65{
67 WCHAR szImeKey[20]; /* "E0XXYYYY": "E0XX" is the device handle. "YYYY" is a LANGID. */
68 WCHAR szFileName[80]; /* The IME module filename */
70
71extern HMODULE ghImm32Inst;
74extern PSERVERINFO gpsi;
76extern HANDLE ghImmHeap;
78
84#define ValidateHwndNoErr(hwnd) ValidateHandleNoErr((hwnd), TYPE_WINDOW)
85#define ValidateHwnd(hwnd) ValidateHandle((hwnd), TYPE_WINDOW)
87
89#define ImmLocalFree(lpData) HeapFree(ghImmHeap, 0, (lpData))
90
93LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage);
94LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage);
102
103#if 0
104 #define UNEXPECTED() ASSERT(FALSE)
105#else
106 #define UNEXPECTED() 0
107#endif
108
109/*
110 * Unexpected Condition Checkers
111 * --- Examine the condition, and then generate trace log if necessary.
112 */
113#ifdef NDEBUG /* on Release */
114#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr))
115#define IS_NULL_UNEXPECTEDLY(p) (!(p))
116#define IS_ZERO_UNEXPECTEDLY(p) (!(p))
117#define IS_TRUE_UNEXPECTEDLY(x) (x)
118#define IS_FALSE_UNEXPECTEDLY(x) (!(x))
119#define IS_ERROR_UNEXPECTEDLY(x) (!(x))
120#else /* on Debug */
121#define FAILED_UNEXPECTEDLY(hr) \
122 (FAILED(hr) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
123 __FILE__, __FUNCTION__, __LINE__, "FAILED(%s)\n", #hr), UNEXPECTED(), TRUE) \
124 : FALSE)
125#define IS_NULL_UNEXPECTEDLY(p) \
126 (!(p) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
127 __FILE__, __FUNCTION__, __LINE__, "%s was NULL\n", #p), UNEXPECTED(), TRUE) \
128 : FALSE)
129#define IS_ZERO_UNEXPECTEDLY(p) \
130 (!(p) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
131 __FILE__, __FUNCTION__, __LINE__, "%s was zero\n", #p), UNEXPECTED(), TRUE) \
132 : FALSE)
133#define IS_TRUE_UNEXPECTEDLY(x) \
134 ((x) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
135 __FILE__, __FUNCTION__, __LINE__, "%s was non-zero\n", #x), UNEXPECTED(), TRUE) \
136 : FALSE)
137#define IS_FALSE_UNEXPECTEDLY(x) \
138 ((!(x)) ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
139 __FILE__, __FUNCTION__, __LINE__, "%s was FALSE\n", #x), UNEXPECTED(), TRUE) \
140 : FALSE)
141#define IS_ERROR_UNEXPECTEDLY(x) \
142 ((x) != ERROR_SUCCESS ? (ros_dbg_log(__WINE_DBCL_ERR, __wine_dbch___default, \
143 __FILE__, __FUNCTION__, __LINE__, \
144 "%s was 0x%X\n", #x, (x)), TRUE) \
145 : FALSE)
146#endif
147
148#define IS_CROSS_THREAD_HIMC(hIMC) IS_TRUE_UNEXPECTEDLY(Imm32IsCrossThreadAccess(hIMC))
149#define IS_CROSS_PROCESS_HWND(hWnd) IS_TRUE_UNEXPECTEDLY(Imm32IsCrossProcessAccess(hWnd))
150#define ImeDpi_IsUnicode(pImeDpi) ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE)
151
154 UINT uCodePage);
157 UINT uCodePage);
158
160Imm32MakeIMENotify(HIMC hIMC, HWND hwnd, DWORD dwAction, DWORD_PTR dwIndex, DWORD_PTR dwValue,
161 DWORD_PTR dwCommand, DWORD_PTR dwData);
162
164
166Imm32ImeMenuAnsiToWide(const IMEMENUITEMINFOA *pItemA, LPIMEMENUITEMINFOW pItemW,
167 UINT uCodePage, BOOL bBitmap);
169Imm32ImeMenuWideToAnsi(const IMEMENUITEMINFOW *pItemW, LPIMEMENUITEMINFOA pItemA,
170 UINT uCodePage);
171
174
179
181Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage);
183Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage);
184
185HRESULT APIENTRY Imm32StrToUInt(LPCWSTR pszText, LPDWORD pdwValue, ULONG nBase);
186HRESULT APIENTRY Imm32UIntToStr(DWORD dwValue, ULONG nBase, LPWSTR pszBuff, USHORT cchBuff);
188UINT APIENTRY Imm32GetImeLayout(PREG_IME pLayouts, UINT cLayouts);
189BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayoutText);
190HKL APIENTRY Imm32AssignNewLayout(UINT cKLs, const REG_IME *pLayouts, WORD wLangID);
191BOOL APIENTRY Imm32CopyImeFile(LPWSTR pszOldFile, LPCWSTR pszNewFile);
193
196
203
206 _In_ HIMC hIMC,
207 _In_ BOOL fActive,
208 _In_ HWND hWnd,
209 _In_ HKL hKL);
210
211BOOL
213 _In_ HIMC hIMC,
214 _In_ UINT vKey,
216
219 _In_ HWND hWnd,
220 _In_ BOOL fSet);
HWND hWnd
Definition: settings.c:17
LPARAM lParam
Definition: combotst.c:139
DWORD HIMC
Definition: dimm.idl:75
#define APIENTRY
Definition: api.h:79
LPINPUTCONTEXT APIENTRY Imm32InternalLockIMC(HIMC hIMC, BOOL fSelect)
Definition: imm.c:838
VOID APIENTRY LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
Definition: utils.c:299
LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
Definition: utils.c:238
BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayoutText)
Definition: utils.c:1023
struct REG_IME * PREG_IME
BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC)
Definition: utils.c:216
BOOL APIENTRY Imm32MakeIMENotify(HIMC hIMC, HWND hwnd, DWORD dwAction, DWORD_PTR dwIndex, DWORD_PTR dwValue, DWORD_PTR dwCommand, DWORD_PTR dwData)
Definition: utils.c:428
PIME_SUBSTATE APIENTRY Imm32FetchImeSubState(PIME_STATE pState, HKL hKL)
Definition: utils.c:576
LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes)
Definition: utils.c:415
HRESULT CtfImeSetActiveContextAlways(_In_ HIMC hIMC, _In_ BOOL fActive, _In_ HWND hWnd, _In_ HKL hKL)
Definition: msctfime.cpp:780
HRESULT APIENTRY Imm32StrToUInt(LPCWSTR pszText, LPDWORD pdwValue, ULONG nBase)
Definition: utils.c:43
BOOL APIENTRY Imm32IsCrossThreadAccess(HIMC hIMC)
Definition: utils.c:26
HANDLE ghImmHeap
Definition: utils.c:16
VOID APIENTRY LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
Definition: utils.c:312
BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax)
Definition: utils.c:143
BOOL APIENTRY Imm32CopyImeFile(LPWSTR pszOldFile, LPCWSTR pszNewFile)
Definition: utils.c:1120
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
Definition: utils.c:338
DWORD APIENTRY CandidateListAnsiToWide(const CANDIDATELIST *pAnsiCL, LPCANDIDATELIST pWideCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:84
RTL_CRITICAL_SECTION gcsImeDpi
Definition: ime.c:16
UINT APIENTRY Imm32GetImeLayout(PREG_IME pLayouts, UINT cLayouts)
Definition: utils.c:948
HRESULT CtfImeCreateThreadMgr(VOID)
Definition: msctfime.cpp:671
HRESULT CtfImmCoInitialize(VOID)
Definition: ctf.c:574
HRESULT CtfImeDestroyThreadMgr(VOID)
Definition: msctfime.cpp:710
HMODULE ghImm32Inst
Definition: imm.c:17
PIMEDPI gpImeDpiList
Definition: ime.c:17
BOOL APIENTRY Imm32CheckImcProcess(PIMC pIMC)
Definition: utils.c:391
BOOL APIENTRY Imm32LoadImeVerInfo(PIMEINFOEX pImeInfoEx)
Definition: utils.c:845
PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL)
Definition: ime.c:343
HRESULT CtfImmTIMCreateInputContext(_In_ HIMC hIMC)
Definition: ctf.c:939
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
Definition: utils.c:19
LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
Definition: utils.c:252
BOOL APIENTRY Imm32IsCrossProcessAccess(HWND hWnd)
Definition: utils.c:34
HRESULT Imm32ActivateOrDeactivateTIM(_In_ BOOL bCreate)
Definition: ctf.c:895
DWORD APIENTRY Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:691
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
Definition: utils.c:286
DWORD APIENTRY Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
Definition: utils.c:460
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
Definition: utils.c:377
HRESULT CtfImmTIMDestroyInputContext(_In_ HIMC hIMC)
Definition: ctf.c:929
PIME_STATE APIENTRY Imm32FetchImeState(LPINPUTCONTEXTDX pIC, HKL hKL)
Definition: utils.c:552
SHAREDINFO gSharedInfo
Definition: imm.c:19
BOOL CtfImeProcessCicHotkey(_In_ HIMC hIMC, _In_ UINT vKey, _In_ LPARAM lParam)
Definition: msctfime.cpp:800
BOOL APIENTRY Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
Definition: utils.c:608
HRESULT APIENTRY Imm32UIntToStr(DWORD dwValue, ULONG nBase, LPWSTR pszBuff, USHORT cchBuff)
Definition: utils.c:56
PSERVERINFO gpsi
Definition: imm.c:18
LRESULT CtfImmSetLangBand(_In_ HWND hWnd, _In_ BOOL fSet)
Definition: ctf.c:1233
BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID)
Definition: utils.c:69
DWORD g_aimm_compat_flags
Definition: ctf.c:204
HKL APIENTRY Imm32AssignNewLayout(UINT cKLs, const REG_IME *pLayouts, WORD wLangID)
Definition: utils.c:902
DWORD APIENTRY CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen, UINT uCodePage)
Definition: candidate.c:14
HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb)
Definition: utils.c:88
BOOL APIENTRY Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
Definition: utils.c:596
INT APIENTRY Imm32ImeMenuWideToAnsi(const IMEMENUITEMINFOW *pItemW, LPIMEMENUITEMINFOA pItemA, UINT uCodePage)
Definition: utils.c:528
INT APIENTRY Imm32ImeMenuAnsiToWide(const IMEMENUITEMINFOA *pItemA, LPIMEMENUITEMINFOW pItemW, UINT uCodePage, BOOL bBitmap)
Definition: utils.c:501
LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
Definition: utils.c:273
BOOL APIENTRY Imm32ReleaseIME(HKL hKL)
Definition: ime.c:371
LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
Definition: utils.c:227
DWORD APIENTRY Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:628
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
static HBITMAP
Definition: button.c:44
static HANDLE ULONG_PTR dwData
Definition: file.c:35
#define _In_
Definition: ms_sal.h:308
UINT_PTR HKL
Definition: msctf.idl:143
unsigned int UINT
Definition: ndis.h:50
#define FASTCALL
Definition: nt_native.h:50
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1520
WCHAR szFileName[80]
Definition: precomp.h:68
HKL hKL
Definition: precomp.h:66
WCHAR szImeKey[20]
Definition: precomp.h:67
Definition: ntuser.h:199
uint32_t DWORD_PTR
Definition: typedefs.h:65
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
_In_ HCRYPTHASH _In_ BOOL _In_ DWORD _Inout_ DWORD _In_ DWORD dwBufLen
Definition: wincrypt.h:4246
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ HCRYPTHASH _In_ BOOL _In_ DWORD _Inout_updates_bytes_to_ pdwDataLen BYTE * pbData
Definition: wincrypt.h:4201
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
#define WINAPI
Definition: msvc.h:6
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
unsigned char BYTE
Definition: xxhash.c:193