From 428dff1a79ed6a592bd486c77e4110c0949d3188 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 8 May 2010 22:26:48 +0000 Subject: [PATCH] [WIN32K] - Check the supplied scancode instead of the state buffer whether a key is up - Fixes the calculator keyboard input regression introduced with r35117 - Ref: http://www.osronline.com/ddkx/w98ddk/keycnt_4ilz.htm and wine implementation See issue #3727 for more details. svn path=/trunk/; revision=47138 --- reactos/subsystems/win32/win32k/ntuser/keyboard.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index 242147c6659..075d79336d0 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -42,7 +42,9 @@ /* Key States */ #define KS_DOWN_MASK 0xc0 #define KS_DOWN_BIT 0x80 -#define KS_LOCK_BIT 0x01 +#define KS_LOCK_BIT 0x01 +/* Scan Codes */ +#define SC_KEY_UP 0x8000 /* lParam bits */ #define LP_EXT_BIT (1<<24) /* From kbdxx.c -- Key changes with numlock */ @@ -720,6 +722,11 @@ NtUserToUnicodeEx( DPRINT("Enter NtUserSetKeyboardState\n"); UserEnterShared();//fixme: this syscall doesnt seem to need any locking... + /* Key up? */ + if (wScanCode & SC_KEY_UP) + { + RETURN(0); + } if( !NT_SUCCESS(MmCopyFromCaller(KeyStateBuf, lpKeyState, @@ -729,8 +736,8 @@ NtUserToUnicodeEx( RETURN(0); } - /* Virtual code is correct and key is pressed currently? */ - if (wVirtKey < 0x100 && KeyStateBuf[wVirtKey] & KS_DOWN_BIT) + /* Virtual code is correct? */ + if (wVirtKey < 0x100) { OutPwszBuff = ExAllocatePoolWithTag(NonPagedPool,sizeof(WCHAR) * cchBuff, TAG_STRING); if( !OutPwszBuff ) @@ -752,8 +759,6 @@ NtUserToUnicodeEx( MmCopyToCaller(pwszBuff,OutPwszBuff,sizeof(WCHAR)*cchBuff); ExFreePoolWithTag(OutPwszBuff, TAG_STRING); } - else - ret = 0; RETURN(ret);