Author: gschneider
Date: Sun May 9 00:26:48 2010
New Revision: 47138
URL:
http://svn.reactos.org/svn/reactos?rev=47138&view=rev
Log:
[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.
Modified:
trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c [iso-8859-1] Sun May 9
00:26:48 2010
@@ -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 @@
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 @@
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 @@
MmCopyToCaller(pwszBuff,OutPwszBuff,sizeof(WCHAR)*cchBuff);
ExFreePoolWithTag(OutPwszBuff, TAG_STRING);
}
- else
- ret = 0;
RETURN(ret);