53 ASSERT(cbValue <= cbVerInfo);
71 ERR(
"Translation not available\n");
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));
162 for (iKL = 0; iKL < cKLs; ++iKL)
164 if (pLayouts[iKL].hKL == hKL)
173 ERR(
"No empty room for new IME HKL\n");
193 WCHAR szImeFileName[80], szImeKey[20];
196 for (iKey = nCount = 0; ; ++iKey)
203 if (szImeKey[0] !=
L'E' && szImeKey[0] !=
L'e')
206 if (pLayouts ==
NULL)
212 if (cLayouts <= nCount)
216 lError =
RegOpenKeyW(hkeyLayouts, szImeKey, &hkeyIME);
222 cbData =
sizeof(szImeFileName);
229 if (!szImeFileName[0] ||
wcscspn(szImeFileName,
L":\\/") !=
wcslen(szImeFileName))
239 WARN(
"Not IMM IME HKL: %p\n", hKL);
244 pLayouts[nCount].hKL = hKL;
263 HKEY hkeyLayouts, hkeyIME, hkeyPreload;
264 WCHAR szImeKey[20], szPreloadNumber[20], szPreloadKey[20];
301 default: pszLayoutFile =
L"kbdus.dll";
break;
316#define MAX_PRELOAD 0x400
317 for (iPreload = 1; iPreload <
MAX_PRELOAD; ++iPreload)
322 cbData =
sizeof(szPreloadKey);
333 ERR(
"iPreload: %u\n", iPreload);
375#define GET_FN(name) do { \
376 fn##name = (FN_##name)GetProcAddress(hinstLZ32, #name); \
377 if (!fn##name) goto Quit; \
392 hfSrc = fnLZOpenFileW((
PWSTR)pszOldFile, &OFStruct,
OF_READ);
399 ret = (fnLZCopy(hfSrc, hfDest) >= 0);
419 DWORD cbVerInfo, dwHandle;
433#define GET_FN(name) do { \
434 s_fn##name = (FN_##name)GetProcAddress(hinstVersion, #name); \
435 if (!s_fn##name) goto Quit; \
538 ERR(
"Can't get IME layouts\n");
543 for (iLayout = 0; iLayout < cLayouts; ++iLayout)
545 if (
_wcsicmp(pLayouts[iLayout].szFileName, pchFileTitle) == 0)
547 if (wLangID !=
LOWORD(pLayouts[iLayout].hKL))
549 ERR(
"The language is mismatched\n");
553 hNewKL = pLayouts[iLayout].
hKL;
563 ERR(
"Can't unload laybout\n");
572 if (
_wcsicmp(szImeFileName, szImeDestPath) != 0 &&
594 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)
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP size_t __cdecl wcscspn(const wchar_t *, const wchar_t *)
BOOL WINAPI ImmGetImeInfoEx(_Out_ PIMEINFOEX pImeInfoEx, _In_ IMEINFOEXCLASS SearchType, _In_ PVOID pvSearchKey)
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)
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
_In_opt_ LPCSTR _In_opt_ LPCSTR pszValue
#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 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 HKL Imm32AssignNewLayout(_In_ UINT cKLs, _In_reads_(cKLs) const REG_IME_LAYOUT *pLayouts, _In_ LANGID wLangID)
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)