[ros-diffs] [gschneider] 47138: [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.

gschneider at svn.reactos.org gschneider at svn.reactos.org
Sun May 9 00:26:48 CEST 2010


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/ntuser/keyboard.c?rev=47138&r1=47137&r2=47138&view=diff
==============================================================================
--- 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);
 




More information about the Ros-diffs mailing list