96 *ppIndicatorTrans = pRet;
180 WARN(
"NtDeviceIoControlFile() failed, ignored\n");
204 ERR(
"NtDeviceIoControlFile() failed, ignored\n");
206 TRACE(
"Keyboard type %u, subtype %u and number of func keys %u\n",
308 TRACE(
"Current Mod Bits: %lx\n", dwModBits);
328 PVK_TO_WCHARS10 pVkToVch;
329 DWORD i, dwModBits, dwVkModBits, dwModNumber = 0;
334 dwModBits = pKeyState ?
IntGetModBits(pKbdTbl, pKeyState) : 0;
338 TRACE(
"TryToTranslate: %04x %x\n", wVirtKey, dwModBits);
353 pVkToVch = (PVK_TO_WCHARS10)(pVkToVchTbl->
pVkToWchars);
354 while (pVkToVch->VirtualKey)
356 if (wVirtKey == (pVkToVch->VirtualKey & 0xFF))
358 dwVkModBits = dwModBits;
361 if ((pVkToVch->Attributes & wCaplokAttr) &&
381 wch = pVkToVch->wch[dwModNumber];
387 *pwcTranslatedChar = wch;
389 TRACE(
"%lu %04x: dwModNumber %08x Char %04x\n",
390 i, wVirtKey, dwModNumber, wch);
395 pVkToVch = (PVK_TO_WCHARS10)(((
BYTE *)pVkToVch) + pVkToVchTbl->
cbSize);
396 if (pVkToVch->VirtualKey != 0xFF)
398 WARN(
"Found dead key with no trailer in the table.\n");
399 WARN(
"VK: %04x, ADDR: %p\n", wVirtKey, pVkToVch);
402 *pwcTranslatedChar = pVkToVch->wch[dwModNumber];
406 pVkToVch = (PVK_TO_WCHARS10)(((
BYTE *)pVkToVch) + pVkToVchTbl->
cbSize);
412 if (wVirtKey >=
'A' && wVirtKey <=
'Z' &&
416 *pwcTranslatedChar = (wVirtKey -
'A') + 1;
440 WCHAR wchTranslatedChar;
441 BOOL bDead, bLigature;
442 static WCHAR wchDead = 0;
459 WARN(
"Not handling ligature (yet)\n" );
467 WCHAR wchFirst, wchSecond;
468 TRACE(
"Previous dead char: %lc (%x)\n", wchDead, wchDead);
476 if (wchFirst == wchDead && wchSecond == wchTranslatedChar)
487 #if defined(__GNUC__) 488 if (wchDead == 0x8000)
490 ERR(
"GCC is inventing bits, ignoring fake dead key\n");
496 TRACE(
"Final char: %lc (%x)\n", wchTranslatedChar, wchTranslatedChar);
504 pwszBuff[iRet++] = wchDead;
510 pwszBuff[iRet++] = wchTranslatedChar;
513 wchDead = bDead ? wchTranslatedChar : 0;
515 return bDead ? -iRet : iRet;
569 if ((wScanCode & 0xFF00) == 0xE000)
579 else if ((wScanCode & 0xFF00) == 0xE100)
589 else if (wScanCode < pKbdTbl->bMaxVSCtoVK)
595 return wVk != 0xFF ? wVk : 0;
608 BOOL bDead, bLigature;
636 TRACE(
"Enter NtUserGetAsyncKeyState\n");
638 if (
Key >= 0x100 ||
Key < 0)
641 ERR(
"Invalid parameter Key\n");
655 TRACE(
"Leave NtUserGetAsyncKeyState, ret=%u\n", wRet);
694 KbdHookData.
flags = 0;
740 ERR(
"Invalid window\n");
747 ERR(
"UserGetDCEx failed!\n");
757 ERR(
"NtGdiCreateCompatibleBitmap failed!\n");
764 ERR(
"NtGdiCreateCompatibleDC failed!\n");
769 NtGdiBitBlt(
hdcMem, 0, 0,
cx,
cy,
hdc, 0, 0,
SRCCOPY, 0, 0);
802 WORD wSimpleVk = 0, wFixedVk, wVk2;
845 ERR(
"Kbd msg dropped by WH_KEYBOARD_LL hook\n");
852 TRACE(
"HotKey Processed\n");
856 wFixedVk =
IntFixVk(wSimpleVk, bExt);
862 TRACE(
"ProcessKeyEvent Q 0x%p Active pWnd 0x%p Focus pWnd 0x%p\n",
869 (wSimpleVk ==
VK_MENU && bMenuDownRecently) ||
875 bMenuDownRecently =
FALSE;
882 bMenuDownRecently =
TRUE;
901 if (bIsSimpleDown && !bWasSimpleDown &&
906 TRACE(
"Alt-Tab/Esc Pressed wParam %x\n",wVk);
921 else if (pFocusQueue && bPostMsg)
932 if (Wnd) pti = Wnd->
head.pti;
936 Msg.wParam = wFixedVk & 0xFF;
948 ERR(
"Set last input\n");
978 TRACE(
"Posting keyboard msg %u wParam 0x%x lParam 0x%x\n",
Msg.message,
Msg.wParam,
Msg.lParam);
979 if (!Wnd) {
ERR(
"Window is NULL\n");}
1009 ERR(
"No keyboard layout!\n");
1016 wScanCode = pKbdInput->
wScan;
1018 if (pKbdInput->
dwFlags & KEYEVENTF_UNICODE)
1027 if (pKbdInput->
dwFlags & KEYEVENTF_SCANCODE)
1030 wVk =
IntVscToVk(wScanCode | (bExt ? 0xE000 : 0), pKbdTbl);
1036 wVk = pKbdInput->
wVk;
1044 if (pKbdInput->
time)
1070 WORD wScanCode, wVk;
1076 wScanCode = pKbdInputData->
MakeCode & 0x7F;
1078 wScanCode |= 0xE000;
1080 wScanCode |= 0xE100;
1101 TRACE(
"UserProcessKeyboardInput: %x (break: %u) -> %x\n",
1115 KbdInput.
wVk = wVk & 0xFF;
1116 KbdInput.
wScan = wScanCode & 0x7F;
1157 WCHAR wch[3] = { 0 };
1199 NewMsg.pt =
gpsi->ptCursor;
1200 NewMsg.hwnd = lpMsg->
hwnd;
1203 TRACE(
"Enter IntTranslateKbdMessage msg %s, vk %x\n",
1206 if (lpMsg->
wParam == VK_PACKET)
1219 sizeof(wch) /
sizeof(wch[0]),
1233 NewMsg.lParam = lpMsg->
lParam;
1236 for (
i = 0;
i <
cch; ++
i)
1238 TRACE(
"Msg: %x '%lc' (%04x) %08x\n", NewMsg.message, wch[
i], wch[
i], NewMsg.lParam);
1239 NewMsg.wParam = wch[
i];
1245 TRACE(
"Leave IntTranslateKbdMessage ret %d, cch %d, msg %x, wch %x\n",
1246 bResult,
cch, NewMsg.message, NewMsg.wParam);
1301 ERR(
"Wrong type value: %u\n",
Type);
1320 TRACE(
"Enter NtUserMapVirtualKeyEx\n");
1344 TRACE(
"Leave NtUserMapVirtualKeyEx, ret=%u\n",
ret);
1358 PBYTE pKeyStateUnsafe,
1365 BYTE afKeyState[256 * 2 / 8] = {0};
1371 TRACE(
"Enter NtUserSetKeyboardState\n");
1374 if (wScanCode &
SC_KEY_UP || wVirtKey >= 0x100)
1376 ERR(
"Invalid parameter\n");
1384 for (
i = 0;
i < 256; ++
i)
1394 ERR(
"Cannot copy key state\n");
1403 ERR(
"ExAllocatePoolWithTag(%u) failed\n",
sizeof(
WCHAR) * cchBuff);
1436 ERR(
"No keyboard layout ?!\n");
1449 TRACE(
"Leave NtUserSetKeyboardState, ret=%i\n", iRet);
1470 WCHAR KeyNameBuf[2];
1472 TRACE(
"Enter NtUserGetKeyNameText\n");
1480 if (!pKbdTbl || cchSize < 1)
1482 ERR(
"Invalid parameter\n");
1502 for (
i = 0; pKeyNames[
i].
pwsz;
i++)
1504 if (pKeyNames[
i].vsc == wScanCode)
1506 pKeyName = pKeyNames[
i].
pwsz;
1520 pKeyName = KeyNameBuf;
1526 cchKeyName =
wcslen(pKeyName);
1527 if (cchKeyName > (cchSize - 1
UL))
1528 cchKeyName = cchSize - 1
UL;
1550 TRACE(
"Leave NtUserGetKeyNameText, ret=%lu\n", dwRet);
1572 ERR(
"Unknown type!\n");
1592 PVK_TO_WCHARS10 pVkToWch;
1594 DWORD i, dwModBits = 0, dwModNumber = 0, Ret = (
DWORD)-1;
1596 TRACE(
"NtUserVkKeyScanEx() wch %u, KbdLayout 0x%p\n", wch, dwhkl);
1620 pVkToWch = (PVK_TO_WCHARS10)(pVkToWchTbl->
pVkToWchars);
1623 while (pVkToWch->VirtualKey)
1625 for (dwModNumber = 0; dwModNumber < pVkToWchTbl->
nModifications; dwModNumber++)
1627 if (pVkToWch->wch[dwModNumber] == wch)
1630 TRACE(
"i %lu wC %04x: dwModBits %08x dwModNumber %08x MaxModBits %08x\n",
1632 Ret = (dwModBits << 8) | (pVkToWch->VirtualKey & 0xFF);
1636 pVkToWch = (PVK_TO_WCHARS10)(((
BYTE *)pVkToWch) + pVkToWchTbl->
cbSize);
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
#define ERROR_INVALID_PARAMETER
VOID FASTCALL UserEnterShared(VOID)
PVK_TO_WCHARS1 pVkToWchars
return STATUS_NOT_SUPPORTED
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
VSC_LPWSTR * pKeyNamesExt
NTSYSAPI NTSTATUS NTAPI ZwDeviceIoControlFile(IN HANDLE DeviceHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, IN PVOID UserApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG IoControlCode, IN PVOID InputBuffer, IN ULONG InputBufferSize, OUT PVOID OutputBuffer, IN ULONG OutputBufferSize)
#define IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION
#define STATUS_INSUFFICIENT_RESOURCES
BOOL NTAPI co_UserProcessHotKeys(WORD wVk, BOOL bIsDown)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiCreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
PVOID FASTCALL UserAssignmentLock(PVOID *ppvObj, PVOID pvNew)
BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL)
#define EngGetTickCount32()
BYTE gafAsyncKeyState[256 *2/8]
BOOL FASTCALL IntTranslateKbdMessage(LPMSG lpMsg, UINT flags)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
DWORD gdwLanguageToggleKey
INDICATOR_LIST IndicatorList[1]
static KEYBOARD_INDICATOR_PARAMETERS gIndicators
static BOOL IntTranslateChar(WORD wVirtKey, PBYTE pKeyState, PBOOL pbDead, PBOOL pbLigature, PWCHAR pwcTranslatedChar, PKBDTABLES pKbdTbl)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiSelectBitmap(_In_ HDC hdc, _In_ HBITMAP hbm)
static WORD FASTCALL IntVscToVk(WORD wScanCode, PKBDTABLES pKbdTbl)
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
#define MmCopyToCaller(x, y, z)
#define KEYBOARD_CAPS_LOCK_ON
NTSTATUS NTAPI InitKeyboardImpl(VOID)
BOOL NTAPI UserOpenClipboard(HWND hWnd)
BOOL NTAPI UserSendKeyboardInput(KEYBDINPUT *pKbdInput, BOOL bInjected)
VOID NTAPI UserProcessKeyboardInput(PKEYBOARD_INPUT_DATA pKbdInputData)
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
#define MAPVK_VSC_TO_VK_EX
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
int gLanguageToggleKeyState
#define STATUS_INVALID_HANDLE
static LRESULT co_CallLowLevelKeyboardHook(WORD wVk, WORD wScanCode, DWORD dwFlags, BOOL bInjected, DWORD dwTime, DWORD dwExtraInfo)
#define STATUS_BUFFER_TOO_SMALL
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
USHORT NumberOfIndicatorKeys
BOOL NTAPI UserCloseClipboard(VOID)
_Out_opt_ int _Out_opt_ int * cy
static WORD FASTCALL IntVkToVsc(WORD wVk, PKBDTABLES pKbdTbl)
PPROCESSINFO gppiInputProvider
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBitBlt(_In_ HDC hdcDst, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD rop4, _In_ DWORD crBackColor, _In_ FLONG fl)
UINT APIENTRY NtUserMapVirtualKeyEx(UINT uCode, UINT uType, DWORD keyboardId, HKL dwhkl)
PVK_TO_WCHAR_TABLE pVkToWcharTable
static DWORD IntGetModBits(PKBDTABLES pKbdTbl, PBYTE pKeyState)
PWND FASTCALL UserGetWindowObject(HWND hWnd)
static PKEYBOARD_INDICATOR_TRANSLATION gpKeyboardIndicatorTrans
VOID FASTCALL UserEnterExclusive(VOID)
#define UserHMGetHandle(obj)
#define IOCTL_KEYBOARD_QUERY_INDICATORS
struct _THREADINFO * PTHREADINFO
#define NT_SUCCESS(StatCode)
#define EXCEPTION_EXECUTE_HANDLER
#define MAPVK_VK_TO_VSC_EX
static int APIENTRY IntToUnicodeEx(UINT wVirtKey, UINT wScanCode, PBYTE pKeyState, LPWSTR pwszBuff, int cchBuff, UINT wFlags, PKBDTABLES pKbdTbl)
static NTSTATUS APIENTRY IntKeyboardUpdateLeds(HANDLE hKeyboardDevice, WORD wVk, WORD wScanCode)
VOID FASTCALL MsqPostMessage(PTHREADINFO pti, MSG *Msg, BOOLEAN HardwareMessage, DWORD MessageBits, DWORD dwQEvent, LONG_PTR ExtraInfo)
static WORD IntTranslateNumpadKey(WORD wVk)
struct _CLIENTINFO * pClientInfo
VOID FASTCALL IntCoalesceMouseMove(PTHREADINFO pti)
DWORD APIENTRY NtUserGetKeyNameText(LONG lParam, LPWSTR lpString, int cchSize)
#define ExAllocatePoolWithTag(hernya, size, tag)
static BYTE gafAsyncKeyStateRecentDown[256/8]
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
SHORT APIENTRY NtUserGetAsyncKeyState(INT Key)
struct _KBDTABLES * pKbdTbl
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
static VOID NTAPI UpdateAsyncKeyState(WORD wVk, BOOL bIsDown)
KEYBOARD_ID KeyboardIdentifier
struct _KEYBOARD_INDICATOR_TRANSLATION KEYBOARD_INDICATOR_TRANSLATION
struct tagKL * KeyboardLayout
VOID FASTCALL SetLastNtError(NTSTATUS Status)
__kernel_entry W32KAPI HDC APIENTRY NtGdiCreateCompatibleDC(_In_opt_ HDC hdc)
VOID NTAPI UserInitKeyboard(HANDLE hKeyboardDevice)
DWORD APIENTRY NtUserVkKeyScanEx(WCHAR wch, HKL dwhkl, BOOL bUsehKL)
static UINT IntMapVirtualKeyEx(UINT uCode, UINT Type, PKBDTABLES pKbdTbl)
static WORD IntSimplifyVk(WORD wVk)
BOOL NTAPI UserEmptyClipboard(VOID)
_In_ DWORD _Out_ _In_ WORD wFlags
struct _USER_MESSAGE_QUEUE * MessageQueue
VOID FASTCALL UserLeave(VOID)
HWND FASTCALL IntGetDesktopWindow(VOID)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
USHORT NumberOfFunctionKeys
static WORD IntFixVk(WORD wVk, BOOL bExt)
BOOL NTAPI ProcessKeyEvent(WORD wVk, WORD wScanCode, DWORD dwFlags, BOOL bInjected, DWORD dwTime, DWORD dwExtraInfo)
#define KEYBOARD_SCROLL_LOCK_ON
DBG_DEFAULT_CHANNEL(UserKbd)
PMODIFIERS pCharModifiers
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
static WCHAR FASTCALL IntVkToChar(WORD wVk, PKBDTABLES pKbdTbl)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define KEYEVENTF_EXTENDEDKEY
DWORD FASTCALL UserGetKeyboardType(DWORD dwTypeFlag)
#define IOCTL_KEYBOARD_QUERY_ATTRIBUTES
#define KEYBOARD_NUM_LOCK_ON
NTSTATUS APIENTRY IntKeyboardGetIndicatorTrans(HANDLE hKeyboardDevice, PKEYBOARD_INDICATOR_TRANSLATION *ppIndicatorTrans)
#define RtlZeroMemory(Destination, Length)
KEYBOARD_ATTRIBUTES gKeyboardInfo
char * cleanup(char *str)
#define RtlCopyMemory(Destination, Source, Length)
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionCode()
#define _SEH2_YIELD(__stmt)
#define IOCTL_KEYBOARD_SET_INDICATORS
#define ExFreePoolWithTag(_P, _T)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
HANDLE NTAPI UserSetClipboardData(UINT fmt, HANDLE hData, PSETCLIPBDATA scd)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
int APIENTRY NtUserToUnicodeEx(UINT wVirtKey, UINT wScanCode, PBYTE pKeyStateUnsafe, LPWSTR pwszBuffUnsafe, INT cchBuff, UINT wFlags, HKL dwhkl)
static VOID SnapWindow(HWND hWnd)