30 return dwImeThreadId != dwCurrentThreadId;
38 return WndPID != CurrentPID;
76 TRACE(
"The country has no special IME support\n");
93 DWORD ib, cbBytes, cColors;
96 cbBytes = *(
const DWORD *)pb;
107 ERR(
"Invalid bitmap\n");
113 case 1: cColors = 2;
break;
114 case 4: cColors = 16;
break;
115 case 8: cColors = 256;
break;
120 ERR(
"Invalid bitmap\n");
131 ib += bm.bmWidthBytes * bm.bmHeight;
134 ERR(
"Invalid bitmap\n");
147 DWORD cbBytes, cColors;
156 ERR(
"Invalid bitmap\n");
167 switch (bm.bmBitsPixel)
169 case 1: cColors = 2;
break;
170 case 4: cColors = 16;
break;
171 case 8: cColors = 256;
break;
176 ERR(
"Invalid bitmap\n");
180 cbBytes =
sizeof(
DWORD);
183 cbBytes += bm.bmWidthBytes * bm.bmHeight;
184 if (cbBytes > cbDataMax)
241 INT cchA = (cchW + 1) *
sizeof(
WCHAR);
255 for (cchWide = 0; cchAnsi > 0; ++cchWide)
276 for (cchAnsi = 0; cchWide > 0; ++cchAnsi, ++pchWide, --cchWide)
290 ERR(
"Invalid filename\n");
331 if (
pdi->pvDesktopBase <=
ptr && ptr < pdi->pvDesktopLimit)
348 WARN(
"Not a handle\n");
405 if (dwPID1 != dwPID2)
407 WARN(
"PID 0x%X != 0x%X\n", dwPID1, dwPID2);
446 pImeDpi->NotifyIME(hIMC, dwAction, dwIndex, dwValue);
453 if (
hwnd && dwCommand)
462#define INITIAL_COUNT 0x40
488 ERR(
"Abnormal status\n");
493 *pphList = phNewList;
505 pItemW->cbSize = pItemA->
cbSize;
506 pItemW->fType = pItemA->
fType;
507 pItemW->fState = pItemA->
fState;
508 pItemW->wID = pItemA->
wID;
513 pItemW->hbmpItem = pItemA->
hbmpItem;
517 pItemW->szString,
_countof(pItemW->szString));
521 pItemW->szString[0] = 0;
532 pItemA->cbSize = pItemW->
cbSize;
533 pItemA->fType = pItemW->
fType;
534 pItemA->fState = pItemW->
fState;
535 pItemA->wID = pItemW->
wID;
539 pItemA->hbmpItem = pItemW->
hbmpItem;
545 pItemA->szString[0] = 0;
556 for (pState = pIC->
pState; pState; pState = pState->
pNext)
558 if (pState->
wLang == Lang)
566 pState->
wLang = Lang;
579 for (pSubState = pState->
pSubState; pSubState; pSubState = pSubState->
pNext)
581 if (pSubState->
hKL == hKL)
588 pSubState->
hKL = hKL;
602 pIC->fdwSentence |= pSubState->
dwValue;
614 pSubState->
dwValue = (pIC->fdwSentence & 0xffff0000);
630 DWORD cch0, cchDest, cbDest;
634 if (pSrc->dwVersion != 0)
642 cbDest =
sizeof(RECONVERTSTRING) + (cchDest + 1) *
sizeof(
WCHAR);
646 if (pDest->dwSize < cbDest)
653 pDest->dwSize = cbDest;
656 pDest->dwVersion = 0;
659 pDest->dwStrOffset =
sizeof(RECONVERTSTRING);
663 pDest->dwCompStrOffset = cch0 *
sizeof(
WCHAR);
666 cch0 =
IchWideFromAnsi(pSrc->dwCompStrOffset + pSrc->dwCompStrLen, pchSrc, uCodePage);
667 pDest->dwCompStrLen = (cch0 *
sizeof(
WCHAR) - pDest->dwCompStrOffset) /
sizeof(
WCHAR);
671 pDest->dwTargetStrOffset = cch0 *
sizeof(
WCHAR);
674 cch0 =
IchWideFromAnsi(pSrc->dwTargetStrOffset + pSrc->dwTargetStrLen, pchSrc, uCodePage);
675 pDest->dwTargetStrLen = (cch0 *
sizeof(
WCHAR) - pSrc->dwTargetStrOffset) /
sizeof(
WCHAR);
678 pDest->dwStrLen = cchDest;
684 pchDest[cchDest] = 0;
686 TRACE(
"cbDest: 0x%X\n", cbDest);
693 DWORD cch0, cch1, cchDest, cbDest;
697 if (pSrc->dwVersion != 0)
705 cbDest =
sizeof(RECONVERTSTRING) + (cchDest + 1) *
sizeof(
CHAR);
709 if (pDest->dwSize < cbDest)
716 pDest->dwSize = cbDest;
719 pDest->dwVersion = 0;
722 pDest->dwStrOffset =
sizeof(RECONVERTSTRING);
725 cch1 = pSrc->dwCompStrOffset /
sizeof(
WCHAR);
727 pDest->dwCompStrOffset = cch0 *
sizeof(
CHAR);
731 pDest->dwCompStrLen = cch0 *
sizeof(
CHAR) - pDest->dwCompStrOffset;
734 cch1 = pSrc->dwTargetStrOffset /
sizeof(
WCHAR);
736 pDest->dwTargetStrOffset = cch0 *
sizeof(
CHAR);
739 cch0 =
IchAnsiFromWide(cch1 + pSrc->dwTargetStrLen, pchSrc, uCodePage);
740 pDest->dwTargetStrLen = cch0 *
sizeof(
CHAR) - pDest->dwTargetStrOffset;
743 pDest->dwStrLen = cchDest;
746 pchDest = (
LPSTR)pDest + pDest->dwStrOffset;
749 pchDest[cchDest] = 0;
751 TRACE(
"cchDest: 0x%X\n", cchDest);
770 ERR(
"Fixed version info not available\n");
798 pszKey[cchExtra] = 0;
800 return (cbValue ? pszValue :
NULL);
817 ERR(
"Translation not available\n");
851 DWORD cbVerInfo, dwHandle;
865#define GET_FN(name) do { \
866 s_fn##name = (FN_##name)GetProcAddress(hinstVersion, #name); \
867 if (!s_fn##name) goto Quit; \
904 UINT iKL, wID, wLow = 0xE0FF, wHigh = 0xE01F, wNextID = 0;
906 for (iKL = 0; iKL < cKLs; ++iKL)
908 wHigh =
max(wHigh,
HIWORD(pLayouts[iKL].hKL));
909 wLow =
min(wLow,
HIWORD(pLayouts[iKL].hKL));
916 else if (wLow > 0xE001)
922 for (wID = 0xE020; wID <= 0xE0FF; ++wID)
924 for (iKL = 0; iKL < cKLs; ++iKL)
926 if (
LOWORD(pLayouts[iKL].hKL) == wLangID &&
927 HIWORD(pLayouts[iKL].hKL) == wID)
950 HKEY hkeyLayouts, hkeyIME;
951 WCHAR szImeFileName[80], szImeKey[20];
963 for (iKey = nCount = 0; ; ++iKey)
970 if (szImeKey[0] !=
L'E' && szImeKey[0] !=
L'e')
973 if (pLayouts ==
NULL)
979 if (cLayouts <= nCount)
982 lError =
RegOpenKeyW(hkeyLayouts, szImeKey, &hkeyIME);
987 szImeFileName[0] = 0;
988 cbData =
sizeof(szImeFileName);
995 if (!szImeFileName[0] ||
wcscspn(szImeFileName,
L":\\/") !=
wcslen(szImeFileName))
1010 pLayouts[nCount].
hKL = hKL;
1026 HKEY hkeyLayouts, hkeyIME, hkeyPreload;
1027 WCHAR szImeKey[20], szPreloadNumber[20], szPreloadKey[20];
1047 cbData = (
wcslen(pchFilePart) + 1) *
sizeof(
WCHAR);
1053 cbData = (
wcslen(pszLayoutText) + 1) *
sizeof(
WCHAR);
1063 case LANG_KOREAN: pszLayoutFile =
L"kbdkor.dll";
break;
1064 default: pszLayoutFile =
L"kbdus.dll";
break;
1068 cbData = (
wcslen(pszLayoutFile) + 1) *
sizeof(
WCHAR);
1079#define MAX_PRELOAD 0x400
1080 for (iPreload = 1; iPreload <
MAX_PRELOAD; ++iPreload)
1085 cbData =
sizeof(szPreloadKey);
1087 (
LPBYTE)szPreloadKey, &cbData);
1130 HFILE hfDest, hfSrc;
1143#define GET_FN(name) do { \
1144 fn##name = (FN_##name)GetProcAddress(hinstLZ32, #name); \
1145 if (!fn##name) goto Quit; \
1154 szDestA[
_countof(szDestA) - 1] = 0;
1156 hfSrc = fnLZOpenFileW(pszOldFile, &OFStruct,
OF_READ);
1163 ret = (fnLZCopy(hfSrc, hfDest) >= 0);
1288 FIXME(
"(%p)\n", pImePro);
1297 FIXME(
"(%p)\n", pImePro);
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define UlongToHandle(ul)
#define RegCloseKey(hKey)
#define NT_SUCCESS(StatCode)
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 ERROR_INVALID_HANDLE
#define WideCharToMultiByte
#define MultiByteToWideChar
PIMEDPI WINAPI ImmLockImeDpi(HKL hKL)
VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi)
VOID WINAPI ImmUnlockClientImc(PCLIENTIMC pClientImc)
PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
#define IS_ZERO_UNEXPECTEDLY(p)
#define ImmLocalFree(lpData)
#define REGKEY_KEYBOARD_LAYOUTS
#define IS_ERROR_UNEXPECTEDLY(x)
#define IS_NULL_UNEXPECTEDLY(p)
BOOL WINAPI ImmIMPQueryIMEA(LPIMEPROA pImePro)
VOID APIENTRY LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
INT(WINAPI * FN_LZOpenFileW)(LPWSTR, LPOFSTRUCT, WORD)
LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
static FN_GetFileVersionInfoW s_fnGetFileVersionInfoW
BOOL APIENTRY Imm32WriteImeLayout(HKL hKL, LPCWSTR pchFilePart, LPCWSTR pszLayoutText)
BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC)
BOOL APIENTRY Imm32MakeIMENotify(HIMC hIMC, HWND hwnd, DWORD dwAction, DWORD_PTR dwIndex, DWORD_PTR dwValue, DWORD_PTR dwCommand, DWORD_PTR dwData)
PIME_SUBSTATE APIENTRY Imm32FetchImeSubState(PIME_STATE pState, HKL hKL)
BOOL WINAPI ImmIMPGetIMEW(HWND hWnd, LPIMEPROW pImePro)
LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes)
BOOL WINAPI ImmUnlockIMCC(HIMCC imcc)
HRESULT APIENTRY Imm32StrToUInt(LPCWSTR pszText, LPDWORD pdwValue, ULONG nBase)
struct tagBITMAPCOREINFO256 * PBITMAPCOREINFO256
BOOL APIENTRY Imm32IsCrossThreadAccess(HIMC hIMC)
VOID APIENTRY LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
BOOL Imm32StoreBitmapToBytes(HBITMAP hbm, LPBYTE pbData, DWORD cbDataMax)
BOOL APIENTRY Imm32CopyImeFile(LPWSTR pszOldFile, LPCWSTR pszNewFile)
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
BOOL(WINAPI * FN_VerQueryValueW)(LPCVOID, LPCWSTR, LPVOID *, PUINT)
BOOL WINAPI ImmIMPGetIMEA(HWND hWnd, LPIMEPROA pImePro)
LONG(WINAPI * FN_LZCopy)(INT, INT)
DWORD WINAPI ImmGetIMCLockCount(HIMC hIMC)
UINT APIENTRY Imm32GetImeLayout(PREG_IME pLayouts, UINT cLayouts)
DWORD WINAPI ImmGetIMCCLockCount(HIMCC imcc)
HIMCC WINAPI ImmCreateIMCC(DWORD size)
DWORD WINAPI ImmGetIMCCSize(HIMCC imcc)
BOOL APIENTRY Imm32CheckImcProcess(PIMC pIMC)
BOOL APIENTRY Imm32LoadImeVerInfo(PIMEINFOEX pImeInfoEx)
BOOL WINAPI ImmIMPSetIMEA(HWND hWnd, LPIMEPROA pImePro)
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
BOOL WINAPI ImmIMPQueryIMEW(LPIMEPROW pImePro)
LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
BOOL APIENTRY Imm32IsCrossProcessAccess(HWND hWnd)
DWORD(WINAPI * FN_GetFileVersionInfoSizeW)(LPCWSTR, LPDWORD)
HIMCC WINAPI ImmReSizeIMCC(HIMCC imcc, DWORD size)
LPVOID WINAPI ImmLockIMCC(HIMCC imcc)
static FN_GetFileVersionInfoSizeW s_fnGetFileVersionInfoSizeW
DWORD APIENTRY Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR pszFileName)
HIMCC WINAPI ImmDestroyIMCC(HIMCC block)
BOOL(WINAPI * FN_GetFileVersionInfoW)(LPCWSTR, DWORD, DWORD, LPVOID)
DWORD APIENTRY Imm32BuildHimcList(DWORD dwThreadId, HIMC **pphList)
LPVOID FASTCALL ValidateHandle(HANDLE hObject, UINT uType)
VOID(WINAPI * FN_LZClose)(INT)
BOOL APIENTRY Imm32LoadImeLangAndDesc(PIMEINFOEX pInfoEx, LPCVOID pVerInfo)
PIME_STATE APIENTRY Imm32FetchImeState(LPINPUTCONTEXTDX pIC, HKL hKL)
BOOL APIENTRY Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
static FN_VerQueryValueW s_fnVerQueryValueW
static BOOL APIENTRY Imm32LoadImeFixedInfo(PIMEINFOEX pInfoEx, LPCVOID pVerInfo)
static LPWSTR APIENTRY Imm32GetVerInfoValue(LPCVOID pVerInfo, LPWSTR pszKey, DWORD cchKey, LPCWSTR pszName)
static PVOID FASTCALL DesktopPtrToUser(PVOID ptr)
HRESULT APIENTRY Imm32UIntToStr(DWORD dwValue, ULONG nBase, LPWSTR pszBuff, USHORT cchBuff)
struct tagBITMAPCOREINFO256 BITMAPCOREINFO256
BOOL WINAPI ImmIMPSetIMEW(HWND hWnd, LPIMEPROW pImePro)
BOOL APIENTRY Imm32IsSystemJapaneseOrKorean(VOID)
HKL APIENTRY Imm32AssignNewLayout(UINT cKLs, const REG_IME *pLayouts, WORD wLangID)
HBITMAP Imm32LoadBitmapFromBytes(const BYTE *pb)
BOOL APIENTRY Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL)
INT APIENTRY Imm32ImeMenuWideToAnsi(const IMEMENUITEMINFOW *pItemW, LPIMEMENUITEMINFOA pItemA, UINT uCodePage)
INT APIENTRY Imm32ImeMenuAnsiToWide(const IMEMENUITEMINFOA *pItemA, LPIMEMENUITEMINFOW pItemW, UINT uCodePage, BOOL bBitmap)
LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
DWORD APIENTRY Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle)
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
LCID WINAPI GetThreadLocale(void)
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
BOOL WINAPI IsDBCSLeadByteEx(UINT codepage, BYTE testchar)
LCID WINAPI GetSystemDefaultLCID(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)
_In_ uint64_t _In_ uint64_t _In_ uint64_t generation
HLOCAL NTAPI LocalReAlloc(HLOCAL hMem, SIZE_T dwBytes, UINT uFlags)
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
LPVOID NTAPI LocalLock(HLOCAL hMem)
BOOL NTAPI LocalUnlock(HLOCAL hMem)
SIZE_T NTAPI LocalSize(HLOCAL hMem)
UINT NTAPI LocalFlags(HLOCAL hMem)
HLOCAL NTAPI LocalFree(HLOCAL hMem)
static const struct newhuff ht[]
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
DWORD_PTR NTAPI NtUserCallOneParam(DWORD_PTR Param, DWORD Routine)
@ THREADSTATE_GETTHREADINFO
#define ONEPARAM_ROUTINE_GETDESKTOPMAPPING
DWORD_PTR NTAPI NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
#define HANDLEENTRY_DESTROY
DWORD_PTR NTAPI NtUserQueryWindow(HWND hWnd, DWORD Index)
NTSTATUS NTAPI NtUserBuildHimcList(DWORD dwThreadId, DWORD dwCount, HIMC *phList, LPDWORD pdwCount)
#define GetWin32ClientInfo()
#define QUERY_WINDOW_UNIQUE_PROCESS_ID
BOOL NTAPI NtUserValidateHandleSecure(HANDLE hHdl)
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
struct _USER_HANDLE_ENTRY * PUSER_HANDLE_ENTRY
#define FIRST_USER_HANDLE
int WINAPI _lclose(HFILE hFile)
int WINAPI lstrlenA(LPCSTR lpString)
HFILE WINAPI LZOpenFileW(LPWSTR fn, LPOFSTRUCT ofs, WORD mode)
LONG WINAPI LZCopy(HFILE src, HFILE dest)
void WINAPI LZClose(HFILE fd)
static DWORD DWORD void LPSTR DWORD cch
static HANDLE ULONG_PTR dwData
static HMODULE MODULEINFO DWORD cb
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
#define offsetof(TYPE, MEMBER)
_Check_return_ _CRTIMP size_t __cdecl wcscspn(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_Control)
#define LANGIDFROMLCID(l)
#define STATUS_BUFFER_TOO_SMALL
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
STRSAFEAPI StringCchLengthA(STRSAFE_LPCSTR psz, size_t cchMax, size_t *pcchLength)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz, size_t cchMax, size_t *pcchLength)
struct IME_SUBSTATE * pNext
struct IME_STATE * pState
CHAR lfFaceName[LF_FACESIZE]
WCHAR lfFaceName[LF_FACESIZE]
RGBTRIPLE bmciColors[256]
BITMAPCOREHEADER bmciHeader
WCHAR wszImeDescription[50]
CHAR lfFaceName[LF_FACESIZE]
WCHAR lfFaceName[LF_FACESIZE]
#define RtlCopyMemory(Destination, Source, Length)
WORD WORD PSZ PSZ pszFileName
#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
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
DWORD WINAPI GetCurrentThreadId(void)
struct _OFSTRUCT * LPOFSTRUCT
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
_In_ HCRYPTHASH _In_ BOOL _In_ DWORD _Inout_updates_bytes_to_ pdwDataLen BYTE * pbData
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO * pdi
#define ERROR_INVALID_WINDOW_HANDLE
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
struct tagRGBTRIPLE RGBTRIPLE
struct tagBITMAPCOREHEADER BITMAPCOREHEADER
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI DeleteDC(_In_ HDC)
#define HKEY_LOCAL_MACHINE
#define HKEY_CURRENT_USER
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LPWSTR WINAPI CharUpperW(_Inout_ LPWSTR)
static unsigned int block