[ros-diffs] [jimtabor] 35117: - Patch by Yuriy Sidorov <jura at cp-lab.com> , NtUserToUnicodeEx should return zero if key in lpKeyState array is not pressed.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Tue Aug 5 06:05:28 CEST 2008


Author: jimtabor
Date: Mon Aug  4 23:05:28 2008
New Revision: 35117

URL: http://svn.reactos.org/svn/reactos?rev=35117&view=rev
Log:
- Patch by Yuriy Sidorov <jura at cp-lab.com> , NtUserToUnicodeEx should return zero if key in lpKeyState array is not pressed.

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=35117&r1=35116&r2=35117&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] Mon Aug  4 23:05:28 2008
@@ -711,25 +711,32 @@
       DPRINT1( "Couldn't copy key state from caller.\n" );
       RETURN(0);
    }
-   OutPwszBuff = ExAllocatePoolWithTag(NonPagedPool,sizeof(WCHAR) * cchBuff, TAG_STRING);
-   if( !OutPwszBuff )
-   {
-      DPRINT1( "ExAllocatePool(%d) failed\n", sizeof(WCHAR) * cchBuff);
-      RETURN(0);
-   }
-   RtlZeroMemory( OutPwszBuff, sizeof( WCHAR ) * cchBuff );
-
-   ret = ToUnicodeInner( wVirtKey,
-                         wScanCode,
-                         KeyStateBuf,
-                         OutPwszBuff,
-                         cchBuff,
-                         wFlags,
-                         PsGetCurrentThreadWin32Thread() ?
-                            PsGetCurrentThreadWin32Thread()->KeyboardLayout->KBTables : 0 );
-
-   MmCopyToCaller(pwszBuff,OutPwszBuff,sizeof(WCHAR)*cchBuff);
-   ExFreePool(OutPwszBuff);
+   
+   /* Virtual code is correct and key is pressed currently? */
+   if (wVirtKey < 0x100 && KeyStateBuf[wVirtKey] & KS_DOWN_BIT)
+   {
+      OutPwszBuff = ExAllocatePoolWithTag(NonPagedPool,sizeof(WCHAR) * cchBuff, TAG_STRING);
+      if( !OutPwszBuff )
+      {
+         DPRINT1( "ExAllocatePool(%d) failed\n", sizeof(WCHAR) * cchBuff);
+         RETURN(0);
+      }
+      RtlZeroMemory( OutPwszBuff, sizeof( WCHAR ) * cchBuff );
+
+      ret = ToUnicodeInner( wVirtKey,
+                            wScanCode,
+                            KeyStateBuf,
+                            OutPwszBuff,
+                            cchBuff,
+                            wFlags,
+                            PsGetCurrentThreadWin32Thread() ?
+                               PsGetCurrentThreadWin32Thread()->KeyboardLayout->KBTables : 0 );
+
+      MmCopyToCaller(pwszBuff,OutPwszBuff,sizeof(WCHAR)*cchBuff);
+      ExFreePool(OutPwszBuff);
+   }
+   else
+      ret = 0;
 
    RETURN(ret);
 



More information about the Ros-diffs mailing list