53 ASSERT(cbValue <= cbVerInfo);
55 return (cbValue ? pszValue :
NULL);
71 ERR(
"Translation not available\n");
75 ASSERT(cbData <= cbVerInfo);
77 if (pInfoEx->hkl ==
NULL)
112 ERR(
"Fixed version info not available\n");
116 ASSERT(cbFixed <= cbVerInfo);
121 ERR(
"DLL '%s' is not an IME\n",
debugstr_w(pInfoEx->wszImeFile));
137#define MIN_SYSTEM_IMM_IME_ID 0xE000
138#define MAX_SYSTEM_IMM_IME_ID 0xE0FF
139#define MIN_USER_IMM_IME_ID 0xE020
140#define MAX_USER_IMM_IME_ID MAX_SYSTEM_IMM_IME_ID
143 for (iKL = 0; iKL < cKLs; ++iKL)
145 wHigh =
max(wHigh,
HIWORD(pLayouts[iKL].hKL));
146 wLow =
min(wLow,
HIWORD(pLayouts[iKL].hKL));
152 wNextImeId = wHigh + 1;
156 wNextImeId = wLow - 1;
163 for (iKL = 0; iKL < cKLs; ++iKL)
165 if (
LOWORD(pLayouts[iKL].hKL) == wLangID &&
HIWORD(pLayouts[iKL].hKL) == wID)
179 ERR(
"No next IMM IME ID\n");
198 WCHAR szImeFileName[80], szImeKey[20];
201 for (iKey = nCount = 0; ; ++iKey)
208 if (szImeKey[0] !=
L'E' && szImeKey[0] !=
L'e')
211 if (pLayouts ==
NULL)
217 if (cLayouts <= nCount)
221 lError =
RegOpenKeyW(hkeyLayouts, szImeKey, &hkeyIME);
227 cbData =
sizeof(szImeFileName);
234 if (!szImeFileName[0] ||
wcscspn(szImeFileName,
L":\\/") !=
wcslen(szImeFileName))
244 WARN(
"Not IMM IME HKL: %p\n", hKL);
249 pLayouts[nCount].hKL = hKL;
268 HKEY hkeyLayouts, hkeyIME, hkeyPreload;
269 WCHAR szImeKey[20], szPreloadNumber[20], szPreloadKey[20];
289 cbData = (
wcslen(pchFileTitle) + 1) *
sizeof(
WCHAR);
295 cbData = (
wcslen(pszLayoutText) + 1) *
sizeof(
WCHAR);
306 default: pszLayoutFile =
L"kbdus.dll";
break;
310 cbData = (
wcslen(pszLayoutFile) + 1) *
sizeof(
WCHAR);
321#define MAX_PRELOAD 0x400
322 for (iPreload = 1; iPreload <
MAX_PRELOAD; ++iPreload)
327 cbData =
sizeof(szPreloadKey);
329 (
LPBYTE)szPreloadKey, &cbData);
338 ERR(
"iPreload: %u\n", iPreload);
380#define GET_FN(name) do { \
381 fn##name = (FN_##name)GetProcAddress(hinstLZ32, #name); \
382 if (!fn##name) goto Quit; \
397 hfSrc = fnLZOpenFileW((
PWSTR)pszOldFile, &OFStruct,
OF_READ);
404 ret = (fnLZCopy(hfSrc, hfDest) >= 0);
424 DWORD cbVerInfo, dwHandle;
438#define GET_FN(name) do { \
439 s_fn##name = (FN_##name)GetProcAddress(hinstVersion, #name); \
440 if (!s_fn##name) goto Quit; \
543 ERR(
"Can't get IME layouts\n");
548 for (iLayout = 0; iLayout < cLayouts; ++iLayout)
550 if (
_wcsicmp(pLayouts[iLayout].szFileName, pchFileTitle) == 0)
552 if (wLangID !=
LOWORD(pLayouts[iLayout].hKL))
554 ERR(
"The language is mismatched\n");
558 hNewKL = pLayouts[iLayout].
hKL;
568 ERR(
"Can't unload laybout\n");
577 if (
_wcsicmp(szImeFileName, szImeDestPath) != 0 &&
599 ERR(
"Can't write IME layout to registry\n");
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define UlongToHandle(ul)
#define RegCloseKey(hKey)
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
#define WideCharToMultiByte
HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle)
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
LCID WINAPI GetThreadLocale(void)
BOOL WINAPI GetFileVersionInfoW(LPCWSTR filename, DWORD handle, DWORD datasize, LPVOID data)
BOOL WINAPI VerQueryValueW(LPCVOID pBlock, LPCWSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen)
DWORD WINAPI GetFileVersionInfoSizeW(LPCWSTR filename, LPDWORD handle)
BOOL WINAPI ImmGetImeInfoEx(_Out_ PIMEINFOEX pImeInfoEx, _In_ IMEINFOEXCLASS SearchType, _In_ PVOID pvSearchKey)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
int WINAPI _lclose(HFILE hFile)
HFILE WINAPI LZOpenFileW(LPWSTR fn, LPOFSTRUCT ofs, WORD mode)
LONG WINAPI LZCopy(HFILE src, HFILE dest)
void WINAPI LZClose(HFILE fd)
#define _In_reads_bytes_(s)
#define _Out_writes_opt_(s)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP size_t __cdecl wcscspn(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_Control)
#define LANGIDFROMLCID(l)
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz, size_t cchMax, size_t *pcchLength)
#define VFT2_DRV_INPUTMETHOD
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_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
static HKL Imm32AssignNewLayout(_In_ UINT cKLs, _In_reads_(cKLs) const REG_IME_LAYOUT *pLayouts, _In_ WORD wLangID)
static BOOL Imm32LoadImeLangAndDesc(_Inout_ PIMEINFOEX pInfoEx, _In_reads_bytes_(cbVerInfo) LPCVOID pVerInfo, _In_ DWORD cbVerInfo)
#define MAX_USER_IMM_IME_ID
INT(WINAPI * FN_LZOpenFileW)(LPWSTR, LPOFSTRUCT, WORD)
static FN_GetFileVersionInfoW s_fnGetFileVersionInfoW
#define MIN_SYSTEM_IMM_IME_ID
struct tagREG_IME_LAYOUT REG_IME_LAYOUT
#define MIN_USER_IMM_IME_ID
static UINT Imm32GetImeLayoutList(_Out_writes_opt_(cLayouts) PREG_IME_LAYOUT pLayouts, _In_ UINT cLayouts)
BOOL(WINAPI * FN_VerQueryValueW)(LPCVOID, LPCWSTR, LPVOID *, PUINT)
LONG(WINAPI * FN_LZCopy)(INT, INT)
#define MAX_SYSTEM_IMM_IME_ID
BOOL Imm32LoadImeVerInfo(_Inout_ PIMEINFOEX pImeInfoEx)
static BOOL Imm32CopyImeFile(_In_ PCWSTR pszOldFile, _In_ PCWSTR pszNewFile)
DWORD(WINAPI * FN_GetFileVersionInfoSizeW)(LPCWSTR, LPDWORD)
static LPWSTR Imm32GetVerInfoValue(_In_reads_bytes_(cbVerInfo) LPCVOID pVerInfo, _In_ DWORD cbVerInfo, _Inout_ PWSTR pszKey, _In_ DWORD cchKey, _In_ PCWSTR pszName)
static BOOL Imm32LoadImeFixedInfo(_Out_ PIMEINFOEX pInfoEx, _In_reads_bytes_(cbVerInfo) LPCVOID pVerInfo, _In_ DWORD cbVerInfo)
static FN_GetFileVersionInfoSizeW s_fnGetFileVersionInfoSizeW
static BOOL Imm32WriteImeLayout(_In_ HKL hKL, _In_ PCWSTR pchFileTitle, _In_ PCWSTR pszLayoutText)
struct tagREG_IME_LAYOUT * PREG_IME_LAYOUT
BOOL(WINAPI * FN_GetFileVersionInfoW)(LPCWSTR, DWORD, DWORD, LPVOID)
HKL WINAPI ImmInstallIMEW(_In_ LPCWSTR lpszIMEFileName, _In_ LPCWSTR lpszLayoutText)
VOID(WINAPI * FN_LZClose)(INT)
static FN_VerQueryValueW s_fnVerQueryValueW
HKL WINAPI ImmInstallIMEA(_In_ LPCSTR lpszIMEFileName, _In_ LPCSTR lpszLayoutText)
#define IS_ZERO_UNEXPECTEDLY(p)
#define ImmLocalFree(lpData)
LPWSTR Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
#define REGKEY_KEYBOARD_LAYOUTS
#define IS_ERROR_UNEXPECTEDLY(x)
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
HRESULT Imm32UIntToStr(_In_ DWORD dwValue, _In_ ULONG nBase, _Out_ PWSTR pszBuff, _In_ USHORT cchBuff)
#define IS_NULL_UNEXPECTEDLY(p)
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
HRESULT Imm32StrToUInt(_In_ PCWSTR pszText, _Out_ PDWORD pdwValue, _In_ ULONG nBase)
DWORD WINAPI GetLastError(void)
struct _OFSTRUCT * LPOFSTRUCT
#define HKEY_LOCAL_MACHINE
#define HKEY_CURRENT_USER
BOOL WINAPI UnloadKeyboardLayout(_In_ HKL)
HKL WINAPI LoadKeyboardLayoutW(_In_ LPCWSTR, _In_ UINT)