- Add ctrl support to (most) keyboard layouts. Only tested for kbdus, added
  to a few other I was confident about. Still to do: kbddv, kbdgr, kbdru, kbdsg
- Prevent access outside array in TryToTranslateChar
- Revert r17830, it handles ctrl keys at the wrong location
This fixes bug 763.
Modified: trunk/reactos/lib/keyboard/kbdbe/kbdbe.c
Modified: trunk/reactos/lib/keyboard/kbdda/kbdda.c
Modified: trunk/reactos/lib/keyboard/kbddv/kbddv.c
Modified: trunk/reactos/lib/keyboard/kbdes/kbdes.c
Modified: trunk/reactos/lib/keyboard/kbdfr/kbdfr.c
Modified: trunk/reactos/lib/keyboard/kbdse/kbdse.c
Modified: trunk/reactos/lib/keyboard/kbduk/kbduk.c
Modified: trunk/reactos/lib/keyboard/kbdus/kbdus.c
Modified: trunk/reactos/subsys/win32k/ntuser/input.c
Modified: trunk/reactos/subsys/win32k/ntuser/keyboard.c

Modified: trunk/reactos/lib/keyboard/kbdbe/kbdbe.c
--- trunk/reactos/lib/keyboard/kbdbe/kbdbe.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbdbe/kbdbe.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -180,37 +180,6 @@
   { '8',           NOCAPS, {'!',       '8'} },
   { VK_OEM_2,      NOCAPS, {')',       0xB0} },
   
-  /* First letter row */
-  { 'A',           CAPS,   {'a',      'A'} },
-  { 'Z',           CAPS,   {'z',      'Z'} },
-  { 'R',           CAPS,   {'r',      'R'} },
-  { 'T',           CAPS,   {'t',      'T'} },
-  { 'Y',           CAPS,   {'y',      'Y'} },
-  { 'U',           CAPS,   {'u',      'U'} },
-  { 'I',           CAPS,   {'i',      'I'} },
-  { 'O',           CAPS,   {'o',      'O'} },
-  { 'P',           CAPS,   {'p',      'P'} },
-
-  /* Second letter row */
-  { 'Q',           CAPS,   {'q',      'Q'} },
-  { 'S',           CAPS,   {'s',      'S'} },
-  { 'D',           CAPS,   {'d',      'D'} },
-  { 'F',           CAPS,   {'f',      'F'} },
-  { 'G',           CAPS,   {'g',      'G'} },
-  { 'H',           CAPS,   {'h',      'H'} },
-  { 'J',           CAPS,   {'j',      'J'} },
-  { 'K',           CAPS,   {'k',      'K'} },
-  { 'L',           CAPS,   {'l',      'L'} },
-  { 'M',           CAPS,   {'m',      'M'} },
-  
-  /* Third letter row */
-  { 'W',           CAPS,   {'w',      'W'} },
-  { 'X',           CAPS,   {'x',      'X'} },
-  { 'C',           CAPS,   {'c',      'C'} },
-  { 'V',           CAPS,   {'v',      'V'} },
-  { 'B',           CAPS,   {'b',      'B'} },
-  { 'N',           CAPS,   {'n',      'N'} },
-
   /* Specials */
   { VK_OEM_COMMA,  CAPS,   {',',      '?'} },
   { VK_OEM_PERIOD, CAPS,   {';',      '.'} },
@@ -228,6 +197,33 @@
 
 ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
   /* Normal, Shifted, Ctrl */
+
+  /* The alphabet */
+  { 'A',         CAPS,   {'a', 'A', 0x01} },
+  { 'B',         CAPS,   {'b', 'B', 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04} },
+  { 'F',         CAPS,   {'f', 'F', 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08} },
+  { 'I',         CAPS,   {'i', 'I', 0x09} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c} },
+  { 'M',         CAPS,   {'m', 'M', 0x0d} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f} },
+  { 'P',         CAPS,   {'p', 'P', 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14} },
+  { 'U',         CAPS,   {'u', 'U', 0x15} },
+  { 'V',         CAPS,   {'v', 'V', 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a} },
   /* Legacy (telnet-style) ascii escapes */
   { VK_OEM_MINUS, NOCAPS, {'-',      '_',      0x1f} }, //0x1f unit separator 
   { VK_RETURN,    NOCAPS, {'\r',     '\r',     '\n'} },
@@ -242,6 +238,7 @@
 
 ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = {
   /* Normal, Shifted, Ctrl, Ctrl-Alt */
+
   /* Legacy Ascii generators */
   { '1',	 NOCAPS, {'&',      '1',     WCH_NONE, '|'     } },       
   { '2',         NOCAPS, {0xE9,     '2',     WCH_NONE, '@'     } },
@@ -257,7 +254,7 @@
   { VK_OEM_7,    NOCAPS, {0xF9,     '%',     WCH_NONE, WCH_DEAD} },
   { VK_EMPTY ,   NOCAPS, {0xb4,     '`',      '|',     WCH_NONE} },
 
-  { 'E',         CAPS,   {'e',      'E',      WCH_NONE, 0x20ac} },
+  { 'E',         CAPS,   {'e',      'E',      0x05, 0x20ac} },
   { VK_EMPTY ,   NOCAPS, {0xa8,     '^',      WCH_NONE, '~'} },
 
   { VK_OEM_102,  NOCAPS, {'<',      '>',      0x001c,   '\\'} },

Modified: trunk/reactos/lib/keyboard/kbdda/kbdda.c
--- trunk/reactos/lib/keyboard/kbdda/kbdda.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbdda/kbdda.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -173,35 +173,7 @@
   { '1',           NOCAPS, {'1',      '!'} },
   /* Ctrl-2 generates NUL */
   { VK_OEM_PLUS,   NOCAPS, {'+',      '?'} },
-  /* First letter row */
-  { 'Q',           CAPS,   {'q',      'Q'} },
-  { 'W',           CAPS,   {'w',      'W'} },
-  { 'R',           CAPS,   {'r',      'R'} },
-  { 'T',           CAPS,   {'t',      'T'} },
-  { 'Y',           CAPS,   {'y',      'Y'} },
-  { 'U',           CAPS,   {'u',      'U'} },
-  { 'I',           CAPS,   {'i',      'I'} },
-  { 'O',           CAPS,   {'o',      'O'} },
-  { 'P',           CAPS,   {'p',      'P'} },
   { VK_OEM_6,      CAPS,   {0xe5,     0xc5} }, /* ? */
-  /* Second letter row */
-  { 'A',           CAPS,   {'a',      'A'} },
-  { 'S',           CAPS,   {'s',      'S'} },
-  { 'D',           CAPS,   {'d',      'D'} },
-  { 'F',           CAPS,   {'f',      'F'} },
-  { 'G',           CAPS,   {'g',      'G'} },
-  { 'H',           CAPS,   {'h',      'H'} },
-  { 'J',           CAPS,   {'j',      'J'} },
-  { 'K',           CAPS,   {'k',      'K'} },
-  { 'L',           CAPS,   {'l',      'L'} },
-  
-  /* Third letter row */
-  { 'Z',           CAPS,   {'z',      'Z'} },
-  { 'X',           CAPS,   {'x',      'X'} },
-  { 'C',           CAPS,   {'c',      'C'} },
-  { 'V',           CAPS,   {'v',      'V'} },
-  { 'B',           CAPS,   {'b',      'B'} },
-  { 'N',           CAPS,   {'n',      'N'} },
 
   /* Specials */
   { VK_OEM_7,	     CAPS,   {0xf8,     0xd8} }, /* Ï */
@@ -222,6 +194,34 @@
 
 ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
   /* Normal, Shifted, Ctrl */
+
+  /* The alphabet */
+  { 'A',         CAPS,   {'a', 'A', 0x01} },
+  { 'B',         CAPS,   {'b', 'B', 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04} },
+  { 'F',         CAPS,   {'f', 'F', 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08} },
+  { 'I',         CAPS,   {'i', 'I', 0x09} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c} },
+  { 'M',         CAPS,   {'m', 'M', 0x0d} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f} },
+  { 'P',         CAPS,   {'p', 'P', 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14} },
+  { 'U',         CAPS,   {'u', 'U', 0x15} },
+  { 'V',         CAPS,   {'v', 'V', 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a} },
+
   /* Legacy (telnet-style) ascii escapes */
   { VK_OEM_MINUS, NOCAPS, {'-',      '_',      0x1f /* US */} },
   { VK_RETURN,    NOCAPS, {'\r',     '\r',     '\n'} },
@@ -248,11 +248,11 @@
   { VK_OEM_4,    NOCAPS, {WCH_DEAD, WCH_DEAD, WCH_DEAD, '|'} },
   { VK_EMPTY ,   NOCAPS, {0xb4,     '`',      '|',      WCH_NONE} },
 
-  { 'E',         CAPS,   {'e',      'E',      WCH_NONE, 0x20ac} },
+  { 'E',         CAPS,   {'e',      'E',      0x05, 0x20ac} },
   { VK_OEM_1,    NOCAPS, {WCH_DEAD, WCH_DEAD, WCH_NONE, WCH_DEAD} },
   { VK_EMPTY ,   NOCAPS, {0xa8,     '^',      WCH_NONE, '~'} },
 
-  { 'M',         CAPS,   {'m',      'M',      WCH_NONE, 0x00b5} },
+  { 'M',         CAPS,   {'m',      'M',      0x0d, 0x00b5} },
   { VK_OEM_102,  NOCAPS, {'<',      '>',      0x001c,   '\\'} },
   { 0, 0 }
 };

Modified: trunk/reactos/lib/keyboard/kbddv/kbddv.c
--- trunk/reactos/lib/keyboard/kbddv/kbddv.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbddv/kbddv.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -143,35 +143,6 @@
   { '8',         NOCAPS, {'8', '*'} },
   { '9',         NOCAPS, {'9', '('} },
   { '0',         NOCAPS, {'0', ')'} },
-  /* First letter row */
-  { 'P',         CAPS,   {'p', 'P'} },
-  { 'Y',         CAPS,   {'y', 'Y'} },
-  { 'F',         CAPS,   {'f', 'F'} },
-  { 'G',         CAPS,   {'g', 'G'} },
-  { 'C',         CAPS,   {'c', 'C'} },
-  { 'R',         CAPS,   {'r', 'R'} },
-  { 'L',         CAPS,   {'l', 'L'} }, 
-  /* Second letter row */
-  { 'A',         CAPS,   {'a', 'A'} },
-  { 'O',         CAPS,   {'o', 'O'} },
-  { 'E',         CAPS,   {'e', 'E'} },
-  { 'U',         CAPS,   {'u', 'U'} },
-  { 'I',         CAPS,   {'i', 'I'} },
-  { 'D',         CAPS,   {'d', 'D'} },
-  { 'H',         CAPS,   {'h', 'H'} },
-  { 'T',         CAPS,   {'t', 'T'} },
-  { 'N',         CAPS,   {'n', 'N'} },
-  { 'S',         CAPS,   {'s', 'S'} },
-  /* Third letter row */
-  { 'Q',         CAPS,   {'q', 'Q'} },
-  { 'J',         CAPS,   {'j', 'J'} },
-  { 'K',         CAPS,   {'k', 'K'} },
-  { 'X',         CAPS,   {'x', 'X'} },
-  { 'B',         CAPS,   {'b', 'B'} },
-  { 'M',         CAPS,   {'m', 'M'} },
-  { 'W',         CAPS,   {'w', 'W'} },
-  { 'V',         CAPS,   {'v', 'V'} },
-  { 'Z',         CAPS,   {'z', 'Z'} },
 
   /* Specials */
   /* Ctrl-_ generates US */
@@ -205,6 +176,35 @@
 
 ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = {
   /* Normal, Shifted, Ctrl, C-S-x */
+
+  /* The alphabet */
+  { 'A',         CAPS,   {'a', 'A', 0x01, 0x01} },
+  { 'B',         CAPS,   {'b', 'B', 0x02, 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03, 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04, 0x04} },
+  { 'E',         CAPS,   {'e', 'E', 0x05, 0x05} },
+  { 'F',         CAPS,   {'f', 'F', 0x06, 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07, 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08, 0x08} },
+  { 'I',         CAPS,   {'i', 'I', 0x09, 0x09} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a, 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b, 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c, 0x0c} },
+  { 'M',         CAPS,   {'m', 'M', 0x0d, 0x0d} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e, 0x0e} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f, 0x0f} },
+  { 'P',         CAPS,   {'p', 'P', 0x10, 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11, 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12, 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13, 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14, 0x14} },
+  { 'U',         CAPS,   {'u', 'U', 0x15, 0x15} },
+  { 'V',         CAPS,   {'v', 'V', 0x16, 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17, 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18, 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19, 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a, 0x1a} },
+
   /* Legacy Ascii generators */
   { '2', NOCAPS, {'2', '@', WCH_NONE, 0} },
   { '6', NOCAPS, {'6', '^', WCH_NONE, 0x1e /* RS */} },

Modified: trunk/reactos/lib/keyboard/kbdes/kbdes.c
--- trunk/reactos/lib/keyboard/kbdes/kbdes.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbdes/kbdes.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -249,36 +249,7 @@
   { '8',         NOCAPS, {'8', '('} },
   { '9',         NOCAPS, {'9', ')'} },
   { '0',         NOCAPS, {'0', '='} },
-  /* First letter row */
-  { 'Q',         CAPS,   {'q', 'Q'} },
-  { 'W',         CAPS,   {'w', 'W'} },
-  //La E tiene 3 estados
-  { 'R',         CAPS,   {'r', 'R'} },
-  { 'T',         CAPS,   {'t', 'T'} },
-  { 'Y',         CAPS,   {'y', 'Y'} },
-  { 'U',         CAPS,   {'u', 'U'} },
-  { 'I',         CAPS,   {'i', 'I'} },
-  { 'O',         CAPS,   {'o', 'O'} },
-  { 'P',         CAPS,   {'p', 'P'} },
-  /* Second letter row */
-  { 'A',         CAPS,   {'a', 'A'} },
-  { 'S',         CAPS,   {'s', 'S'} },
-  { 'D',         CAPS,   {'d', 'D'} },
-  { 'F',         CAPS,   {'f', 'F'} },
-  { 'G',         CAPS,   {'g', 'G'} },
-  { 'H',         CAPS,   {'h', 'H'} },
-  { 'J',         CAPS,   {'j', 'J'} },
-  { 'K',         CAPS,   {'k', 'K'} },
-  { 'L',         CAPS,   {'l', 'L'} },
   { VK_OEM_3,    CAPS,   {0x00F1, 0x00D1} }, // ±Ð
-  /* Third letter row */
-  { 'Z',         CAPS,   {'z', 'Z'} },
-  { 'X',         CAPS,   {'x', 'X'} },
-  { 'C',         CAPS,   {'c', 'C'} },
-  { 'V',         CAPS,   {'v', 'V'} },
-  { 'B',         CAPS,   {'b', 'B'} },
-  { 'N',         CAPS,   {'n', 'N'} },
-  { 'M',         CAPS,   {'m', 'M'} },
   
   /* Specials */
   /* Ctrl-_ generates ES */
@@ -303,6 +274,34 @@
 
 ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
   /* Normal, Shifted, Ctrl */
+
+  /* The alphabet */
+  { 'A',         CAPS,   {'a', 'A', 0x01} },
+  { 'B',         CAPS,   {'b', 'B', 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04} },
+  { 'F',         CAPS,   {'f', 'F', 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08} },
+  { 'I',         CAPS,   {'i', 'I', 0x09} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c} },
+  { 'M',         CAPS,   {'m', 'M', 0x0d} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f} },
+  { 'P',         CAPS,   {'p', 'P', 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14} },
+  { 'U',         CAPS,   {'u', 'U', 0x15} },
+  { 'V',         CAPS,   {'v', 'V', 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a} },
+
   /* Legacy (telnet-style) ascii escapes */
   { VK_RETURN, 	NOCAPS, {'\r',     '\r',     '\n'}    },
   { 0,0 }
@@ -315,7 +314,7 @@
   { '2', 		NOCAPS, {'2',  	'"',      WCH_NONE,  '@'}     }, // 2"@
   { '3', 		NOCAPS, {'3', 	0x00B7,   WCH_NONE,  '#'}     }, // 3À#
   { '6', 		NOCAPS, {'6', 	'&',      WCH_NONE,  0x00AC}  }, // 6&¼
-  { 'E', 		CAPS,   {'e', 	'E',      WCH_NONE,  0x20AC}  }, // eEÇ
+  { 'E', 		CAPS,   {'e', 	'E',      0x05,  0x20AC}  }, // eEÇ
   { VK_OEM_PLUS,  NOCAPS, {'+',      '*', 	    WCH_NONE,  0x005d}  }, // +*]
   { VK_OEM_2,  	NOCAPS, {0x00e7,   0x00c7,   WCH_NONE,  '}'}     }, // þÃ} 
   

Modified: trunk/reactos/lib/keyboard/kbdfr/kbdfr.c
--- trunk/reactos/lib/keyboard/kbdfr/kbdfr.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbdfr/kbdfr.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -162,35 +162,6 @@
   //{ '8',         NOCAPS, {'_', '8'} },
   //{ '9',         NOCAPS, {'þ', '9'} },
   //{ '0',         NOCAPS, {'Ó', '0'} },
-  /* First letter row */
-  { 'A',         CAPS,   {'a', 'A'} },
-  { 'Z',         CAPS,   {'z', 'Z'} },
-  //{ 'E',         CAPS,   {'e', 'E'} },
-  { 'R',         CAPS,   {'r', 'R'} },
-  { 'T',         CAPS,   {'t', 'T'} },
-  { 'Y',         CAPS,   {'y', 'Y'} },
-  { 'U',         CAPS,   {'u', 'U'} },
-  { 'I',         CAPS,   {'i', 'I'} },
-  { 'O',         CAPS,   {'o', 'O'} },
-  { 'P',         CAPS,   {'p', 'P'} },
-  /* Second letter row */
-  { 'Q',         CAPS,   {'q', 'Q'} },
-  { 'S',         CAPS,   {'s', 'S'} },
-  { 'D',         CAPS,   {'d', 'D'} },
-  { 'F',         CAPS,   {'f', 'F'} },
-  { 'G',         CAPS,   {'g', 'G'} },
-  { 'H',         CAPS,   {'h', 'H'} },
-  { 'J',         CAPS,   {'j', 'J'} },
-  { 'K',         CAPS,   {'k', 'K'} },
-  { 'L',         CAPS,   {'l', 'L'} },
-  { 'M',         CAPS,   {'m', 'M'} },
-  /* Third letter row */
-  { 'W',         CAPS,   {'w', 'W'} },
-  { 'X',         CAPS,   {'x', 'X'} },
-  { 'C',         CAPS,   {'c', 'C'} },
-  { 'V',         CAPS,   {'v', 'V'} },
-  { 'B',         CAPS,   {'b', 'B'} },
-  { 'N',         CAPS,   {'n', 'N'} },
 
   /* Specials */
   /* Ctrl-_ generates US */
@@ -214,6 +185,34 @@
 
 ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
   /* Normal, Shifted, Ctrl */
+
+  /* The alphabet */
+  { 'A',         CAPS,   {'a', 'A', 0x01} },
+  { 'B',         CAPS,   {'b', 'B', 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04} },
+  { 'F',         CAPS,   {'f', 'F', 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08} },
+  { 'I',         CAPS,   {'i', 'I', 0x09} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c} },
+  { 'M',         CAPS,   {'m', 'M', 0x0d} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f} },
+  { 'P',         CAPS,   {'p', 'P', 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14} },
+  { 'U',         CAPS,   {'u', 'U', 0x15} },
+  { 'V',         CAPS,   {'v', 'V', 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a} },
+
   /* Legacy (telnet-style) ascii escapes */
   { VK_OEM_102, 0, {'<', '>', 0x1c /* FS */} },
   { VK_OEM_6, 0, {WCH_DEAD, WCH_DEAD, WCH_NONE} },
@@ -234,7 +233,7 @@
   { '9' ,       1, {'þ',   '9',      WCH_NONE, '^'} },
   { '0' ,       1, {'Ó',   '0',      WCH_NONE, '@'} },
   { VK_OEM_PLUS,0, {'=',       '+',      WCH_NONE, '}'} },
-  { 'E' ,       1, {'e',       'E',      WCH_NONE, 'Ç' /* euro */} },
+  { 'E' ,       1, {'e',       'E',      0x05, 'Ç' /* euro */} },
   { VK_OEM_1,   0, {'$',       'ú',  WCH_NONE, 'ñ'} },
   { VK_OEM_4,   0, {')',       '?',   WCH_NONE, ']'} },
   { 0, 0 }

Modified: trunk/reactos/lib/keyboard/kbdse/kbdse.c
--- trunk/reactos/lib/keyboard/kbdse/kbdse.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbdse/kbdse.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -176,35 +176,6 @@
   /* The numbers */
   { '1',         NOCAPS, {'1', '!'} },
   /* Ctrl-2 generates NUL */
-       
-  /* First letter row */
-  { 'Q',         CAPS,   {'q', 'Q'} },
-  { 'W',         CAPS,   {'w', 'W'} },
-  { 'R',         CAPS,   {'r', 'R'} },
-  { 'T',         CAPS,   {'t', 'T'} },
-  { 'Y',         CAPS,   {'y', 'Y'} },
-  { 'U',         CAPS,   {'u', 'U'} },
-  { 'I',         CAPS,   {'i', 'I'} },
-  { 'O',         CAPS,   {'o', 'O'} },
-  { 'P',         CAPS,   {'p', 'P'} },
-  /* Second letter row */
-  { 'A',         CAPS,   {'a', 'A'} },
-  { 'S',         CAPS,   {'s', 'S'} },
-  { 'D',         CAPS,   {'d', 'D'} },
-  { 'F',         CAPS,   {'f', 'F'} },
-  { 'G',         CAPS,   {'g', 'G'} },
-  { 'H',         CAPS,   {'h', 'H'} },
-  { 'J',         CAPS,   {'j', 'J'} },
-  { 'K',         CAPS,   {'k', 'K'} },
-  { 'L',         CAPS,   {'l', 'L'} },
-  
-  /* Third letter row */
-  { 'Z',         CAPS,   {'z', 'Z'} },
-  { 'X',         CAPS,   {'x', 'X'} },
-  { 'C',         CAPS,   {'c', 'C'} },
-  { 'V',         CAPS,   {'v', 'V'} },
-  { 'B',         CAPS,   {'b', 'B'} },
-  { 'N',         CAPS,   {'n', 'N'} },
 
   /* Specials */
   { VK_OEM_4, 	NOCAPS, {WCH_DEAD, WCH_DEAD} },
@@ -226,6 +197,33 @@
 
 ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
   /* Normal, Shifted, Ctrl */
+
+  /* The alphabet */
+  { 'A',         CAPS,   {'a', 'A', 0x01} },
+  { 'B',         CAPS,   {'b', 'B', 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04} },
+  { 'F',         CAPS,   {'f', 'F', 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08} },
+  { 'I',         CAPS,   {'i', 'I', 0x09} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f} },
+  { 'P',         CAPS,   {'p', 'P', 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14} },
+  { 'U',         CAPS,   {'u', 'U', 0x15} },
+  { 'V',         CAPS,   {'v', 'V', 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a} },
+
   /* Legacy (telnet-style) ascii escapes */
   {VK_OEM_6, CAPS, {0xe5,0xc5, 0x1d /* GS */} },
   { VK_OEM_5, NOCAPS, {0xa7,0xbd, 0x1c /* FS */} },
@@ -253,9 +251,9 @@
   { '9', NOCAPS, {'9', ')', WCH_NONE, ']'} },
   { '0', NOCAPS, {'0', '=', WCH_NONE, '}'} },
   { VK_OEM_PLUS ,NOCAPS, {'+', '?', WCH_NONE, '\\'} },
-  { 'E', CAPS,   {'e', 'E' , WCH_NONE, 0x00ac} },
+  { 'E', CAPS,   {'e', 'E' , 0x05, 0x00ac} },
   { VK_OEM_1 ,NOCAPS, {0xa8, '^', 0x001d, '~'} },
-  { 'M', CAPS,   {'m', 'M', WCH_NONE, 0x00b5} },
+  { 'M', CAPS,   {'m', 'M', 0x0d, 0x00b5} },
   {VK_OEM_102, NOCAPS, {'<', '>' ,0x001c,'|'} },
   { 0, 0 }
 };

Modified: trunk/reactos/lib/keyboard/kbduk/kbduk.c
--- trunk/reactos/lib/keyboard/kbduk/kbduk.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbduk/kbduk.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -146,32 +146,7 @@
   { '9',      	NOCAPS, {'9', '('} },
   { '0',      	NOCAPS, {'0', ')'} },
   { VK_OEM_PLUS ,NOCAPS, {'=', '+'} },
-  /* First letter row */
-  { 'Q',         CAPS,   {'q', 'Q'} },
-  { 'W',         CAPS,   {'w', 'W'} },
-  { 'R',         CAPS,   {'r', 'R'} },
-  { 'T',         CAPS,   {'t', 'T'} },
-  { 'Y',         CAPS,   {'y', 'Y'} },
-  { 'P',         CAPS,   {'p', 'P'} },
-  /* Second letter row */
-  { 'S',         CAPS,   {'s', 'S'} },
-  { 'D',         CAPS,   {'d', 'D'} },
-  { 'F',         CAPS,   {'f', 'F'} },
-  { 'G',         CAPS,   {'g', 'G'} },
-  { 'H',         CAPS,   {'h', 'H'} },
-  { 'J',         CAPS,   {'j', 'J'} },
-  { 'K',         CAPS,   {'k', 'K'} },
-  { 'L',         CAPS,   {'l', 'L'} },
   { VK_OEM_1 ,NOCAPS, {';', ':'} },
-  
-  /* Third letter row */
-  { 'Z',         CAPS,   {'z', 'Z'} },
-  { 'X',         CAPS,   {'x', 'X'} },
-  { 'C',         CAPS,   {'c', 'C'} },
-  { 'V',         CAPS,   {'v', 'V'} },
-  { 'B',         CAPS,   {'b', 'B'} },
-  { 'N',         CAPS,   {'n', 'N'} },
-  { 'M',         CAPS,   {'m', 'M'} },
   { VK_OEM_COMMA,	NOCAPS, {',', '<'} },
   { VK_OEM_PERIOD,	NOCAPS, {'.', '>'} },
   { VK_OEM_2,		NOCAPS, {'/', '?'} },
@@ -201,6 +176,30 @@
 
 ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = {
   /* Normal, Shifted, Ctrl, C-Shift */
+
+  /* The alphabet */
+  { 'B',         CAPS,   {'b', 'B', 0x02, 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03, 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04, 0x04} },
+  { 'F',         CAPS,   {'f', 'F', 0x06, 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07, 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08, 0x08} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a, 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b, 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c, 0x0c} },
+  { 'M',         CAPS,   {'m', 'M', 0x0d, 0x0d} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e, 0x0e} },
+  { 'P',         CAPS,   {'p', 'P', 0x10, 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11, 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12, 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13, 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14, 0x14} },
+  { 'V',         CAPS,   {'v', 'V', 0x16, 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17, 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18, 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19, 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a, 0x1a} },
+
   /* Legacy Ascii generators */
   
  { '6', NOCAPS, {'6', '^', WCH_NONE, 0x1e} },
@@ -220,11 +219,11 @@
 ROSDATA VK_TO_WCHARS6 key_to_chars_6mod[] = {
   /* Normal, Shifted, Ctrl, Sh-Ctrl,Sh-Alt,Ctl-Alt,Ctl-Sh-Alt */
  
-  { 'E',         CAPS,   {'e', 'E', WCH_NONE, WCH_NONE, 0x00e9, 0x00c9} },
-  { 'U',         CAPS,   {'u', 'U', WCH_NONE, WCH_NONE, 0x00fa, 0x00da} },
-  { 'I',         CAPS,   {'i', 'I', WCH_NONE, WCH_NONE, 0x00ed, 0x00cd} },
-  { 'O',         CAPS,   {'o', 'O', WCH_NONE, WCH_NONE, 0x00f3, 0x00d3} },
-  { 'A',         CAPS,   {'a', 'A', WCH_NONE, WCH_NONE, 0x00e1, 0x00c1} },
+  { 'E',         CAPS,   {'e', 'E', 0x05, 0x05, 0x00e9, 0x00c9} },
+  { 'U',         CAPS,   {'u', 'U', 0x15, 0x15, 0x00fa, 0x00da} },
+  { 'I',         CAPS,   {'i', 'I', 0x09, 0x09, 0x00ed, 0x00cd} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f, 0x0f, 0x00f3, 0x00d3} },
+  { 'A',         CAPS,   {'a', 'A', 0x01, 0x01, 0x00e1, 0x00c1} },
   { 0, 0 }
 };
 

Modified: trunk/reactos/lib/keyboard/kbdus/kbdus.c
--- trunk/reactos/lib/keyboard/kbdus/kbdus.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/lib/keyboard/kbdus/kbdus.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -143,35 +143,6 @@
   { '8',         NOCAPS, {'8', '*'} },
   { '9',         NOCAPS, {'9', '('} },
   { '0',         NOCAPS, {'0', ')'} },
-  /* First letter row */
-  { 'Q',         CAPS,   {'q', 'Q'} },
-  { 'W',         CAPS,   {'w', 'W'} },
-  { 'E',         CAPS,   {'e', 'E'} },
-  { 'R',         CAPS,   {'r', 'R'} },
-  { 'T',         CAPS,   {'t', 'T'} },
-  { 'Y',         CAPS,   {'y', 'Y'} },
-  { 'U',         CAPS,   {'u', 'U'} },
-  { 'I',         CAPS,   {'i', 'I'} },
-  { 'O',         CAPS,   {'o', 'O'} },
-  { 'P',         CAPS,   {'p', 'P'} },
-  /* Second letter row */
-  { 'A',         CAPS,   {'a', 'A'} },
-  { 'S',         CAPS,   {'s', 'S'} },
-  { 'D',         CAPS,   {'d', 'D'} },
-  { 'F',         CAPS,   {'f', 'F'} },
-  { 'G',         CAPS,   {'g', 'G'} },
-  { 'H',         CAPS,   {'h', 'H'} },
-  { 'J',         CAPS,   {'j', 'J'} },
-  { 'K',         CAPS,   {'k', 'K'} },
-  { 'L',         CAPS,   {'l', 'L'} },
-  /* Third letter row */
-  { 'Z',         CAPS,   {'z', 'Z'} },
-  { 'X',         CAPS,   {'x', 'X'} },
-  { 'C',         CAPS,   {'c', 'C'} },
-  { 'V',         CAPS,   {'v', 'V'} },
-  { 'B',         CAPS,   {'b', 'B'} },
-  { 'N',         CAPS,   {'n', 'N'} },
-  { 'M',         CAPS,   {'m', 'M'} },
 
   /* Specials */
   /* Ctrl-_ generates US */
@@ -205,6 +176,35 @@
 
 ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = {
   /* Normal, Shifted, Ctrl, C-S-x */
+
+  /* The alphabet */
+  { 'A',         CAPS,   {'a', 'A', 0x01, 0x01} },
+  { 'B',         CAPS,   {'b', 'B', 0x02, 0x02} },
+  { 'C',         CAPS,   {'c', 'C', 0x03, 0x03} },
+  { 'D',         CAPS,   {'d', 'D', 0x04, 0x04} },
+  { 'E',         CAPS,   {'e', 'E', 0x05, 0x05} },
+  { 'F',         CAPS,   {'f', 'F', 0x06, 0x06} },
+  { 'G',         CAPS,   {'g', 'G', 0x07, 0x07} },
+  { 'H',         CAPS,   {'h', 'H', 0x08, 0x08} },
+  { 'I',         CAPS,   {'i', 'I', 0x09, 0x09} },
+  { 'J',         CAPS,   {'j', 'J', 0x0a, 0x0a} },
+  { 'K',         CAPS,   {'k', 'K', 0x0b, 0x0b} },
+  { 'L',         CAPS,   {'l', 'L', 0x0c, 0x0c} },
+  { 'M',         CAPS,   {'m', 'M', 0x0d, 0x0d} },
+  { 'N',         CAPS,   {'n', 'N', 0x0e, 0x0e} },
+  { 'O',         CAPS,   {'o', 'O', 0x0f, 0x0f} },
+  { 'P',         CAPS,   {'p', 'P', 0x10, 0x10} },
+  { 'Q',         CAPS,   {'q', 'Q', 0x11, 0x11} },
+  { 'R',         CAPS,   {'r', 'R', 0x12, 0x12} },
+  { 'S',         CAPS,   {'s', 'S', 0x13, 0x13} },
+  { 'T',         CAPS,   {'t', 'T', 0x14, 0x14} },
+  { 'U',         CAPS,   {'u', 'U', 0x15, 0x15} },
+  { 'V',         CAPS,   {'v', 'V', 0x16, 0x16} },
+  { 'W',         CAPS,   {'w', 'W', 0x17, 0x17} },
+  { 'X',         CAPS,   {'x', 'X', 0x18, 0x18} },
+  { 'Y',         CAPS,   {'y', 'Y', 0x19, 0x19} },
+  { 'Z',         CAPS,   {'z', 'Z', 0x1a, 0x1a} },
+
   /* Legacy Ascii generators */
   { '2', NOCAPS, {'2', '@', WCH_NONE, 0} },
   { '6', NOCAPS, {'6', '^', WCH_NONE, 0x1e /* RS */} },

Modified: trunk/reactos/subsys/win32k/ntuser/input.c
--- trunk/reactos/subsys/win32k/ntuser/input.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/subsys/win32k/ntuser/input.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -516,7 +516,7 @@
                ModifierState |= fsModifiers;
 
                if (ModifierState == fsModifiers &&
-                     (fsModifiers == MOD_ALT || fsModifiers == MOD_WIN || fsModifiers == MOD_CONTROL))
+                     (fsModifiers == MOD_ALT || fsModifiers == MOD_WIN))
                {
                   /* First send out special notifications
                    * (For alt, the message that turns on accelerator
@@ -637,31 +637,7 @@
                else
                   msg.message = WM_SYSKEYUP;
             }
-            else if (ModifierState & MOD_CONTROL)
-			{
-			   if(NextKeyInput.MakeCode == 0x2E)/* Ctrl-C */
-			   {
-			      DPRINT1("Ctrl-C pressed\n");
-               /* FIXME: this seems wrong! this bypass hotkeys and all and the winhellos CRTL+C hotkey test
-                  dont work (anymore) */
-			      co_MsqPostKeyboardMessage(WM_COPY,0,0);
-                  continue;
-			   }
-			   else if(NextKeyInput.MakeCode == 0x2F) /* Ctrl-V */
-			   {
-				 DPRINT1("Ctrl-V pressed\n");
-				 co_MsqPostKeyboardMessage(WM_PASTE,0,0);
-                 continue;
-			   }
-			   else
-			   {
-				  DPRINT1("Ctrl with unknown combination %04x\n",NextKeyInput.MakeCode);
-                  if (!(KeyInput.Flags & KEY_BREAK))
-                    msg.message = WM_KEYDOWN;
-                  else
-                    msg.message = WM_KEYUP;
-			   }
-			}else
+            else
             {
                if (!(KeyInput.Flags & KEY_BREAK))
                   msg.message = WM_KEYDOWN;

Modified: trunk/reactos/subsys/win32k/ntuser/keyboard.c
--- trunk/reactos/subsys/win32k/ntuser/keyboard.c	2005-09-19 20:01:29 UTC (rev 17935)
+++ trunk/reactos/subsys/win32k/ntuser/keyboard.c	2005-09-19 21:11:41 UTC (rev 17936)
@@ -261,7 +261,7 @@
                       [ModBits ^
                        ((CapsState & CAPITAL_BIT) ? vkPtr->Attributes : 0)];
 
-            if( CapsMod > keyLayout->pVkToWcharTable[nMod].nModifications )
+            if( CapsMod >= keyLayout->pVkToWcharTable[nMod].nModifications )
             {
                DWORD MaxBit = 1;
                while( MaxBit <