00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "precomp.h"
00013
#pragma hdrstop
00014
00015 #define COMMON_RETURN_ZERO \
00016
return 0;
00017
00019
00021
00022 VOID fakeImm_v1(PVOID dummy)
00023 {
00024 UNREFERENCED_PARAMETER(
dummy);
00025 }
00026
00027 DWORD fakeImm_d1(DWORD dummy)
00028 {
00029 UNREFERENCED_PARAMETER(
dummy);
00030
return 0;
00031 }
00032
00033 VOID fakeImm_v2(PVOID dummy1, PVOID dummy2)
00034 {
00035 UNREFERENCED_PARAMETER(dummy1);
00036 UNREFERENCED_PARAMETER(
dummy2);
00037 }
00038
00039 DWORD fakeImm_d2(DWORD dummy1, DWORD dummy2)
00040 {
00041 UNREFERENCED_PARAMETER(dummy1);
00042 UNREFERENCED_PARAMETER(
dummy2);
00043
return 0;
00044 }
00045
00046 DWORD fakeImm_d3(DWORD dummy1, DWORD dummy2, DWORD dummy3)
00047 {
00048 UNREFERENCED_PARAMETER(dummy1);
00049 UNREFERENCED_PARAMETER(
dummy2);
00050 UNREFERENCED_PARAMETER(dummy3);
00051
return 0;
00052 }
00053
00054 DWORD fakeImm_bwuwl(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
00055 {
00056 UNREFERENCED_PARAMETER(hwnd);
00057 UNREFERENCED_PARAMETER(
msg);
00058 UNREFERENCED_PARAMETER(wParam);
00059 UNREFERENCED_PARAMETER(lParam);
00060
return 0;
00061 }
00062
00063
00064 VOID WINAPI
fakeImm_wv1(PVOID dummy)
00065 {
00066 UNREFERENCED_PARAMETER(
dummy);
00067 }
00068
00069 DWORD WINAPI
fakeImm_wd1(PVOID dummy)
00070 {
00071 UNREFERENCED_PARAMETER(
dummy);
00072
COMMON_RETURN_ZERO;
00073 }
00074
00075 DWORD WINAPI
fakeImm_wd2(PVOID dummy1, PVOID dummy2)
00076 {
00077 UNREFERENCED_PARAMETER(dummy1);
00078 UNREFERENCED_PARAMETER(
dummy2);
00079
COMMON_RETURN_ZERO;
00080 }
00081
00082
00083
00084
00085 BOOL WINAPI
fakeImm_bd2(PVOID dummy1, PVOID dummy2)
00086 {
00087 UNREFERENCED_PARAMETER(dummy1);
00088 UNREFERENCED_PARAMETER(
dummy2);
00089
return TRUE;
00090 }
00091
00092 DWORD WINAPI
fakeImm_wd3(PVOID dummy1, PVOID dummy2, PVOID dummy3)
00093 {
00094 UNREFERENCED_PARAMETER(dummy1);
00095 UNREFERENCED_PARAMETER(
dummy2);
00096 UNREFERENCED_PARAMETER(dummy3);
00097
00098
COMMON_RETURN_ZERO;
00099 }
00100
00101 DWORD WINAPI
fakeImm_wd4(PVOID dummy1, PVOID dummy2, PVOID dummy3, PVOID dummy4)
00102 {
00103 UNREFERENCED_PARAMETER(dummy1);
00104 UNREFERENCED_PARAMETER(
dummy2);
00105 UNREFERENCED_PARAMETER(dummy3);
00106 UNREFERENCED_PARAMETER(dummy4);
00107
00108
COMMON_RETURN_ZERO;
00109 }
00110
00111 DWORD WINAPI
fakeImm_wd5(PVOID dummy1, PVOID dummy2, PVOID dummy3, PVOID dummy4, PVOID dummy5)
00112 {
00113 UNREFERENCED_PARAMETER(dummy1);
00114 UNREFERENCED_PARAMETER(
dummy2);
00115 UNREFERENCED_PARAMETER(dummy3);
00116 UNREFERENCED_PARAMETER(dummy4);
00117 UNREFERENCED_PARAMETER(dummy5);
00118
00119
COMMON_RETURN_ZERO;
00120 }
00121
00122 DWORD WINAPI
fakeImm_wd6(PVOID dummy1, PVOID dummy2, PVOID dummy3, PVOID dummy4, PVOID dummy5, PVOID dummy6)
00123 {
00124 UNREFERENCED_PARAMETER(dummy1);
00125 UNREFERENCED_PARAMETER(
dummy2);
00126 UNREFERENCED_PARAMETER(dummy3);
00127 UNREFERENCED_PARAMETER(dummy4);
00128 UNREFERENCED_PARAMETER(dummy5);
00129 UNREFERENCED_PARAMETER(dummy6);
00130
00131
COMMON_RETURN_ZERO;
00132 }
00133
00134
00135 ImmApiEntries gImmApiEntries = {
00136 (
BOOL (WINAPI* )(HWND,
BOOL))
fakeImm_wd2,
00137 (
BOOL (WINAPI* )(HWND))
fakeImm_wd1,
00138 (LRESULT (WINAPI* )(HWND, LPARAM))
fakeImm_wd2,
00139 (LRESULT (WINAPI* )(HWND, LPARAM))
fakeImm_wd2,
00140 (
BOOL (WINAPI* )(HWND, LPIMEPROW))
fakeImm_wd2,
00141 (
BOOL (WINAPI* )(HWND, LPIMEPROA))
fakeImm_wd2,
00142 (
BOOL (WINAPI* )(LPIMEPROW))
fakeImm_wd1,
00143 (
BOOL (WINAPI* )(LPIMEPROA))
fakeImm_wd1,
00144 (
BOOL (WINAPI* )(HWND, LPIMEPROW))
fakeImm_wd2,
00145 (
BOOL (WINAPI* )(HWND, LPIMEPROA))
fakeImm_wd2,
00146
00147 (HIMC (WINAPI* )(HWND, HIMC))
fakeImm_wd2,
00148 (LRESULT (WINAPI* )(HKL, HIMC,
UINT,
LPVOID))
fakeImm_wd4,
00149 (LRESULT (WINAPI* )(HKL, HIMC,
UINT,
LPVOID))
fakeImm_wd4,
00150 (LONG (WINAPI* )(HIMC,
DWORD,
LPVOID,
DWORD))
fakeImm_wd4,
00151 (LONG (WINAPI* )(HIMC,
DWORD,
LPVOID,
DWORD))
fakeImm_wd4,
00152 (
BOOL (WINAPI* )(HIMC, LPCOMPOSITIONFORM))
fakeImm_wd2,
00153 (HIMC (WINAPI* )(HWND))
fakeImm_wd1,
00154 (HWND (WINAPI* )(HWND))
fakeImm_wd1,
00155 (
BOOL (WINAPI* )(HKL))
fakeImm_wd1,
00156 (
BOOL (WINAPI* )(HWND, HIMC))
fakeImm_wd2,
00157 (
BOOL (* )(
PSHAREDINFO, HINSTANCE))
fakeImm_bd2,
00158
00159 (
BOOL (WINAPI* )(HIMC, LPLOGFONTW))
fakeImm_wd2,
00160 (
BOOL (WINAPI* )(HIMC, LPLOGFONTA))
fakeImm_wd2,
00161 (
BOOL (WINAPI* )(HIMC, LPLOGFONTW))
fakeImm_wd2,
00162 (
BOOL (WINAPI* )(HIMC, LPLOGFONTA))
fakeImm_wd2,
00163
00164 (
BOOL (WINAPI* )(HIMC, LPCOMPOSITIONFORM))
fakeImm_wd2,
00165 (
BOOL (WINAPI* )(HIMC,
DWORD,
DWORD,
DWORD))
fakeImm_wd4,
00166 (PINPUTCONTEXT (WINAPI* )(HIMC))
fakeImm_wd1,
00167 (
BOOL (WINAPI* )(HIMC))
fakeImm_wd1,
00168 (
BOOL (WINAPI* )(HKL))
fakeImm_wd1,
00169 (
BOOL (WINAPI* )(HIMC,
BOOL))
fakeImm_wd2,
00170 (
BOOL (WINAPI* )(
DWORD dwFlag))
fakeImm_wd1,
00171 (
BOOL (WINAPI* )(HKL))
fakeImm_wd1,
00172 (
BOOL (WINAPI* )(HIMC, LPCANDIDATEFORM))
fakeImm_wd2,
00173 (
BOOL (WINAPI* )(HKL, HWND,
DWORD,
LPVOID))
fakeImm_wd4,
00174 (
BOOL (WINAPI* )(HIMC, LPDWORD, LPDWORD))
fakeImm_wd3,
00175 (
BOOL (WINAPI* )(HIMC,
DWORD,
DWORD))
fakeImm_wd3,
00176 (
BOOL (WINAPI* )(HIMC, LPPOINT))
fakeImm_wd2,
00177 (
BOOL (WINAPI* )(
PIMEINFOEX,
IMEINFOEXCLASS, PVOID))
fakeImm_wd3,
00178 (
PIMEDPI (WINAPI* )(HKL))
fakeImm_wd1,
00179 (
VOID (WINAPI* )(
PIMEDPI))
fakeImm_wv1,
00180 (
BOOL (WINAPI* )(HIMC))
fakeImm_wd1,
00181 (
BOOL (* )(HWND, HIMC,
BOOL))
fakeImm_d3,
00182 (
BOOL (* )(HWND,
UINT, WPARAM, LPARAM))
fakeImm_bwuwl,
00183 (
BOOL (* )(HKL,
PIMEINFOEX))
fakeImm_d2,
00184 (
DWORD (WINAPI* )(HWND, HKL,
UINT, LPARAM,
DWORD))
fakeImm_wd5,
00185 (LRESULT (* )(HIMC))
fakeImm_d1,
00186 (
DWORD (WINAPI* )(HKL,
DWORD))
fakeImm_wd2,
00187 (
BOOL (WINAPI* )(
00188 HIMC hImc,
DWORD dwIndex, LPCVOID lpComp,
DWORD dwCompLen, LPCVOID lpRead,
DWORD dwReadLen))
00189
fakeImm_wd6,
00190 (
BOOL (WINAPI* )(
00191 HIMC hImc,
DWORD dwIndex, LPCVOID lpComp,
DWORD dwCompLen, LPCVOID lpRead,
DWORD dwReadLen))
00192
fakeImm_wd6,
00193 (
BOOL (WINAPI* )(
00194
DWORD idThread, IMCENUMPROC lpfn, LPARAM lParam))
fakeImm_wd3,
00195
00196 (LRESULT (WINAPI* )(HIMC, WPARAM, LPARAM))
00197
fakeImm_wd3,
00198 };
00199
00200
00201
00202
00203
00204
00205
00206
00207 HMODULE
ghImm32;
00208
00209 #define IMMMODULENAME L"IMM32.DLL"
00210 #define PATHDLM L'\\'
00211 #define IMMMODULENAMELEN ((sizeof PATHDLM + sizeof IMMMODULENAME) / sizeof(WCHAR))
00212
00213 VOID GetImmFileName(PWSTR wszImmFile)
00214 {
00215
UINT i = GetSystemDirectoryW(wszImmFile,
MAX_PATH);
00216
if (i > 0 && i <
MAX_PATH -
IMMMODULENAMELEN) {
00217 wszImmFile += i;
00218
if (wszImmFile[-1] !=
PATHDLM) {
00219 *wszImmFile++ =
PATHDLM;
00220 }
00221 }
00222 wcscpy(wszImmFile,
IMMMODULENAME);
00223 }
00224
00225 #define REGISTER(name,cast) \
00226
gImmApiEntries.name = (cast)GetProcAddress(hImm, #name); \
00227
if (gImmApiEntries.name == NULL) { \
00228
RIPMSG1(RIP_WARNING, "gImmApiEntries.%s got to be NULL", #name); \
00229
gImmApiEntries.name = (PVOID)fakeImm_v1; \
00230
return; \
00231
} else
00232
00234
00235
00236
00238 VOID _InitializeImmEntryTable(VOID)
00239 {
00240 HMODULE hImm =
ghImm32;
00241 WCHAR wszImmFile[
MAX_PATH];
00242
00243
if (((PVOID)
gImmApiEntries.ImmWINNLSEnableIME) != ((PVOID)
fakeImm_wd2)) {
00244
00245
return;
00246 }
00247
00248
GetImmFileName(wszImmFile);
00249
00250
if (hImm ==
NULL) {
00251
00252 hImm = GetModuleHandleW(wszImmFile);
00253 }
00254
00255
if (hImm ==
NULL) {
00256 hImm =
ghImm32 = LoadLibraryW(wszImmFile);
00257
if (hImm ==
NULL) {
00258 RIPMSG1(RIP_WARNING,
"_InitializeImmEntryTable: failed to load Imm32.Dll: err=%d\n", GetLastError());
00259
return;
00260 }
00261
00262
00263
00264
return;
00265 }
00266
00267
if (hImm ==
NULL) {
00268 RIPMSG0(RIP_WARNING,
"Failed to attach IMM32.DLL.\n");
00269
return;
00270 }
00271
00272
00273
REGISTER(
ImmWINNLSEnableIME,
BOOL (WINAPI*)(HWND,
BOOL));
00274
REGISTER(
ImmWINNLSGetEnableStatus,
BOOL (*)(HWND));
00275
REGISTER(
ImmSendIMEMessageExW, LRESULT (*)(HWND, LPARAM));
00276
REGISTER(
ImmSendIMEMessageExA, LRESULT (*)(HWND, LPARAM));
00277
REGISTER(
ImmIMPGetIMEW,
BOOL(*)(HWND, LPIMEPROW));
00278
REGISTER(
ImmIMPGetIMEA,
BOOL(*)(HWND, LPIMEPROA))
00279
REGISTER(
ImmIMPQueryIMEW,
BOOL(*)(LPIMEPROW))
00280
REGISTER(
ImmIMPQueryIMEA,
BOOL(*)(LPIMEPROA));
00281
REGISTER(
ImmIMPSetIMEW,
BOOL(*)(HWND, LPIMEPROW));
00282
REGISTER(
ImmIMPSetIMEA,
BOOL(*)(HWND, LPIMEPROA));
00283
00284
REGISTER(
ImmAssociateContext, HIMC (WINAPI*)(HWND, HIMC));
00285
REGISTER(
ImmEscapeA, LRESULT(WINAPI*)(HKL, HIMC,
UINT,
LPVOID));
00286
REGISTER(
ImmEscapeW, LRESULT(WINAPI*)(HKL, HIMC,
UINT,
LPVOID));
00287
REGISTER(
ImmGetCompositionStringA, LONG (WINAPI*)(HIMC,
DWORD,
LPVOID,
DWORD));
00288
REGISTER(
ImmGetCompositionStringW, LONG (WINAPI*)(HIMC,
DWORD,
LPVOID,
DWORD));
00289
REGISTER(
ImmGetCompositionWindow,
BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM));
00290
REGISTER(
ImmGetContext, HIMC (WINAPI*)(HWND));
00291
REGISTER(
ImmGetDefaultIMEWnd, HWND (WINAPI*)(HWND));
00292
REGISTER(
ImmIsIME,
BOOL (WINAPI*)(HKL));
00293
REGISTER(
ImmReleaseContext,
BOOL (WINAPI*)(HWND, HIMC));
00294
REGISTER(
ImmRegisterClient,
BOOL(*)(
PSHAREDINFO, HINSTANCE));
00295
00296
REGISTER(
ImmGetCompositionFontW,
BOOL (WINAPI*)(HIMC, LPLOGFONTW));
00297
REGISTER(
ImmGetCompositionFontA,
BOOL (WINAPI*)(HIMC, LPLOGFONTA));
00298
REGISTER(
ImmSetCompositionFontW,
BOOL (WINAPI*)(HIMC, LPLOGFONTW));
00299
REGISTER(
ImmSetCompositionFontA,
BOOL (WINAPI*)(HIMC, LPLOGFONTA));
00300
00301
REGISTER(
ImmSetCompositionWindow,
BOOL(WINAPI*)(HIMC, LPCOMPOSITIONFORM));
00302
REGISTER(
ImmNotifyIME,
BOOL (WINAPI*)(HIMC,
DWORD,
DWORD,
DWORD));
00303
REGISTER(
ImmLockIMC, PINPUTCONTEXT(WINAPI*)(HIMC));
00304
REGISTER(
ImmUnlockIMC,
BOOL (WINAPI*)(HIMC));
00305
REGISTER(
ImmLoadIME,
BOOL (WINAPI*)(HKL));
00306
REGISTER(
ImmSetOpenStatus,
BOOL (WINAPI*)(HIMC,
BOOL));
00307
REGISTER(
ImmFreeLayout,
BOOL (WINAPI*)(
DWORD));
00308
REGISTER(
ImmActivateLayout,
BOOL (WINAPI*)(HKL));
00309
REGISTER(
ImmSetCandidateWindow,
BOOL (WINAPI*)(HIMC, LPCANDIDATEFORM));
00310
REGISTER(
ImmConfigureIMEW,
BOOL (WINAPI*)(HKL, HWND,
DWORD,
LPVOID));
00311
REGISTER(
ImmGetConversionStatus,
BOOL (WINAPI*)(HIMC, LPDWORD, LPDWORD));
00312
REGISTER(
ImmSetConversionStatus,
BOOL (WINAPI*)(HIMC,
DWORD,
DWORD));
00313
REGISTER(
ImmSetStatusWindowPos,
BOOL (WINAPI*)(HIMC, LPPOINT));
00314
REGISTER(
ImmGetImeInfoEx,
BOOL (WINAPI*)(
PIMEINFOEX,
IMEINFOEXCLASS, PVOID));
00315
REGISTER(
ImmLockImeDpi,
PIMEDPI (WINAPI*)(HKL));
00316
REGISTER(
ImmUnlockImeDpi,
VOID (WINAPI*)(
PIMEDPI));
00317
REGISTER(
ImmGetOpenStatus,
BOOL (WINAPI*)(HIMC));
00318
REGISTER(
ImmSetActiveContext,
BOOL (*)(HWND, HIMC,
BOOL));
00319
REGISTER(
ImmTranslateMessage,
BOOL (*)(HWND,
UINT, WPARAM, LPARAM));
00320
REGISTER(
ImmLoadLayout,
BOOL (*)(HKL,
PIMEINFOEX));
00321
REGISTER(
ImmProcessKey,
DWORD (*)(HWND, HKL,
UINT, LPARAM,
DWORD));
00322
REGISTER(
ImmPutImeMenuItemsIntoMappedFile, LRESULT(*)(HIMC));
00323
REGISTER(
ImmGetProperty,
DWORD (WINAPI*)(HKL,
DWORD));
00324
REGISTER(
ImmSetCompositionStringA,
00325
BOOL (WINAPI*)(HIMC hImc,
DWORD dwIndex, LPCVOID lpComp,
00326
DWORD dwCompLen, LPCVOID lpRead,
DWORD dwReadLen))
00327
REGISTER(
ImmSetCompositionStringW,
00328
BOOL (WINAPI*)(HIMC hImc,
DWORD dwIndex, LPCVOID lpComp,
00329
DWORD dwCompLen, LPCVOID lpRead,
DWORD dwReadLen));
00330
REGISTER(
ImmEnumInputContext,
00331
BOOL (WINAPI*)(
DWORD idThread, IMCENUMPROC lpfn, LPARAM lParam));
00332
REGISTER(
ImmSystemHandler,
00333 LRESULT (WINAPI*)(HIMC, WPARAM, LPARAM));
00334 }
00335
00336 BOOL bImmInitializing =
FALSE;
00337
00338 VOID InitializeImmEntryTable(VOID)
00339 {
00340
bImmInitializing =
TRUE;
00341
_InitializeImmEntryTable();
00342 }
00343
00344 BOOL User32InitializeImmEntryTable(DWORD magic)
00345 {
00346
if (magic !=
IMM_MAGIC_CALLER_ID) {
00347 RIPMSG1(RIP_WARNING,
"User32InitializeImmEntryTable: magic # does not match: 0x%08x", magic);
00348
return FALSE;
00349 }
00350
00351
if (((PVOID)
gImmApiEntries.ImmWINNLSEnableIME) != ((PVOID)
fakeImm_wd2)) {
00352
00353
return TRUE;
00354 }
00355
00356
_InitializeImmEntryTable();
00357
00358
if (
ghImm32 ==
NULL) {
00359
if (!
bImmInitializing) {
00360
00361 WCHAR wszImmFile[
MAX_PATH];
00362
GetImmFileName(wszImmFile);
00363
ghImm32 = LoadLibraryW(wszImmFile);
00364 }
00365 }
00366
00367
return fpImmRegisterClient(&
gSharedInfo,
ghImm32);
00368 }
00369
00370
00371
00372
00373 UINT WINAPI
WINNLSGetIMEHotkey(HWND hwndIme)
00374 {
00375 UNREFERENCED_PARAMETER(hwndIme);
00376
00377
00378
00379
00380
return 0;
00381 }
00382
00383 BOOL WINAPI
WINNLSEnableIME(HWND hwnd, BOOL bFlag)
00384 {
00385
return gImmApiEntries.ImmWINNLSEnableIME(hwnd, bFlag);
00386 }
00387
00388 BOOL WINAPI
WINNLSGetEnableStatus(HWND hwnd)
00389 {
00390
return gImmApiEntries.ImmWINNLSGetEnableStatus(hwnd);
00391 }
00392
00393 LRESULT WINAPI
SendIMEMessageExW(HWND hwnd, LPARAM lParam)
00394 {
00395
return gImmApiEntries.ImmSendIMEMessageExW(hwnd, lParam);
00396 }
00397
00398 LRESULT WINAPI
SendIMEMessageExA(HWND hwnd, LPARAM lParam)
00399 {
00400
return gImmApiEntries.ImmSendIMEMessageExA(hwnd, lParam);
00401 }
00402
00403 BOOL WINAPI
IMPGetIMEW(HWND hwnd, LPIMEPROW lpImeProW)
00404 {
00405
return gImmApiEntries.ImmIMPGetIMEW(hwnd, lpImeProW);
00406 }
00407
00408 BOOL WINAPI
IMPGetIMEA(HWND hwnd, LPIMEPROA lpImeProA)
00409 {
00410
return gImmApiEntries.ImmIMPGetIMEA(hwnd, lpImeProA);
00411 }
00412
00413 BOOL WINAPI
IMPQueryIMEW(LPIMEPROW lpImeProW)
00414 {
00415
return gImmApiEntries.ImmIMPQueryIMEW(lpImeProW);
00416 }
00417
00418 BOOL WINAPI
IMPQueryIMEA(LPIMEPROA lpImeProA)
00419 {
00420
return gImmApiEntries.ImmIMPQueryIMEA(lpImeProA);
00421 }
00422
00423 BOOL WINAPI
IMPSetIMEW(HWND hwnd, LPIMEPROW lpImeProW)
00424 {
00425
return gImmApiEntries.ImmIMPSetIMEW(hwnd, lpImeProW);
00426 }
00427
00428 BOOL WINAPI
IMPSetIMEA(HWND hwnd, LPIMEPROA lpImeProA)
00429 {
00430
return gImmApiEntries.ImmIMPSetIMEA(hwnd, lpImeProA);
00431 }