Guest User

Untitled

a guest
Jun 22nd, 2015
580
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /***************************************************************************\
  2. * Module Name: kbduk.C
  3. *
  4. * keyboard layout
  5. *
  6. * Copyright (c) 1985-2001, Microsoft Corporation
  7. *
  8. \***************************************************************************/
  9.  
  10. #include <windows.h>
  11. #include "kbd.h"
  12. #include "kbduk.h"
  13.  
  14. #if defined(_M_IA64)
  15. #pragma section(".data")
  16. #define ALLOC_SECTION_LDATA __declspec(allocate(".data"))
  17. #else
  18. #pragma data_seg(".data")
  19. #define ALLOC_SECTION_LDATA
  20. #endif
  21.  
  22. /***************************************************************************\
  23. * ausVK[] - Virtual Scan Code to Virtual Key conversion table
  24. \***************************************************************************/
  25.  
  26. static ALLOC_SECTION_LDATA USHORT ausVK[] = {
  27.     T00, T01, T02, T03, T04, T05, T06, T07,
  28.     T08, T09, T0A, T0B, T0C, T0D, T0E, T0F,
  29.     T10, T11, T12, T13, T14, T15, T16, T17,
  30.     T18, T19, T1A, T1B, T1C, T1D, T1E, T1F,
  31.     T20, T21, T22, T23, T24, T25, T26, T27,
  32.     T28, T29, T2A, T2B, T2C, T2D, T2E, T2F,
  33.     T30, T31, T32, T33, T34, T35,
  34.  
  35.     /*
  36.      * Right-hand Shift key must have KBDEXT bit set.
  37.      */
  38.     T36 | KBDEXT,
  39.  
  40.     T37 | KBDMULTIVK,               // numpad_* + Shift/Alt -> SnapShot
  41.  
  42.     T38, T39, T3A, T3B, T3C, T3D, T3E,
  43.     T3F, T40, T41, T42, T43, T44,
  44.  
  45.     /*
  46.      * NumLock Key:
  47.      *     KBDEXT     - VK_NUMLOCK is an Extended key
  48.      *     KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL)
  49.      */
  50.     T45 | KBDEXT | KBDMULTIVK,
  51.  
  52.     T46 | KBDMULTIVK,
  53.  
  54.     /*
  55.      * Number Pad keys:
  56.      *     KBDNUMPAD  - digits 0-9 and decimal point.
  57.      *     KBDSPECIAL - require special processing by Windows
  58.      */
  59.     T47 | KBDNUMPAD | KBDSPECIAL,   // Numpad 7 (Home)
  60.     T48 | KBDNUMPAD | KBDSPECIAL,   // Numpad 8 (Up),
  61.     T49 | KBDNUMPAD | KBDSPECIAL,   // Numpad 9 (PgUp),
  62.     T4A,
  63.     T4B | KBDNUMPAD | KBDSPECIAL,   // Numpad 4 (Left),
  64.     T4C | KBDNUMPAD | KBDSPECIAL,   // Numpad 5 (Clear),
  65.     T4D | KBDNUMPAD | KBDSPECIAL,   // Numpad 6 (Right),
  66.     T4E,
  67.     T4F | KBDNUMPAD | KBDSPECIAL,   // Numpad 1 (End),
  68.     T50 | KBDNUMPAD | KBDSPECIAL,   // Numpad 2 (Down),
  69.     T51 | KBDNUMPAD | KBDSPECIAL,   // Numpad 3 (PgDn),
  70.     T52 | KBDNUMPAD | KBDSPECIAL,   // Numpad 0 (Ins),
  71.     T53 | KBDNUMPAD | KBDSPECIAL,   // Numpad . (Del),
  72.  
  73.     T54, T55, T56, T57, T58, T59, T5A, T5B,
  74.     T5C, T5D, T5E, T5F, T60, T61, T62, T63,
  75.     T64, T65, T66, T67, T68, T69, T6A, T6B,
  76.     T6C, T6D, T6E, T6F, T70, T71, T72, T73,
  77.     T74, T75, T76, T77, T78, T79, T7A, T7B,
  78.     T7C, T7D, T7E
  79.  
  80. };
  81.  
  82. static ALLOC_SECTION_LDATA VSC_VK aE0VscToVk[] = {
  83.         { 0x10, X10 | KBDEXT              },  // Speedracer: Previous Track
  84.         { 0x19, X19 | KBDEXT              },  // Speedracer: Next Track
  85.         { 0x1D, X1D | KBDEXT              },  // RControl
  86.         { 0x20, X20 | KBDEXT              },  // Speedracer: Volume Mute
  87.         { 0x21, X21 | KBDEXT              },  // Speedracer: Launch App 2
  88.         { 0x22, X22 | KBDEXT              },  // Speedracer: Media Play/Pause
  89.         { 0x24, X24 | KBDEXT              },  // Speedracer: Media Stop
  90.         { 0x2E, X2E | KBDEXT              },  // Speedracer: Volume Down
  91.         { 0x30, X30 | KBDEXT              },  // Speedracer: Volume Up
  92.         { 0x32, X32 | KBDEXT              },  // Speedracer: Browser Home
  93.         { 0x35, X35 | KBDEXT              },  // Numpad Divide
  94.         { 0x37, X37 | KBDEXT              },  // Snapshot
  95.         { 0x38, X38 | KBDEXT              },  // RMenu
  96.         { 0x47, X47 | KBDEXT              },  // Home
  97.         { 0x48, X48 | KBDEXT              },  // Up
  98.         { 0x49, X49 | KBDEXT              },  // Prior
  99.         { 0x4B, X4B | KBDEXT              },  // Left
  100.         { 0x4D, X4D | KBDEXT              },  // Right
  101.         { 0x4F, X4F | KBDEXT              },  // End
  102.         { 0x50, X50 | KBDEXT              },  // Down
  103.         { 0x51, X51 | KBDEXT              },  // Next
  104.         { 0x52, X52 | KBDEXT              },  // Insert
  105.         { 0x53, X53 | KBDEXT              },  // Delete
  106.         { 0x5B, X5B | KBDEXT              },  // Left Win
  107.         { 0x5C, X5C | KBDEXT              },  // Right Win
  108.         { 0x5D, X5D | KBDEXT              },  // Application
  109.         { 0x5F, X5F | KBDEXT              },  // Speedracer: Sleep
  110.         { 0x65, X65 | KBDEXT              },  // Speedracer: Browser Search
  111.         { 0x66, X66 | KBDEXT              },  // Speedracer: Browser Favorites
  112.         { 0x67, X67 | KBDEXT              },  // Speedracer: Browser Refresh
  113.         { 0x68, X68 | KBDEXT              },  // Speedracer: Browser Stop
  114.         { 0x69, X69 | KBDEXT              },  // Speedracer: Browser Forward
  115.         { 0x6A, X6A | KBDEXT              },  // Speedracer: Browser Back
  116.         { 0x6B, X6B | KBDEXT              },  // Speedracer: Launch App 1
  117.         { 0x6C, X6C | KBDEXT              },  // Speedracer: Launch Mail
  118.         { 0x6D, X6D | KBDEXT              },  // Speedracer: Launch Media Selector
  119.         { 0x1C, X1C | KBDEXT              },  // Numpad Enter
  120.         { 0x46, X46 | KBDEXT              },  // Break (Ctrl + Pause)
  121.         { 0,      0                       }
  122. };
  123.  
  124. static ALLOC_SECTION_LDATA VSC_VK aE1VscToVk[] = {
  125.         { 0x1D, Y1D                       },  // Pause
  126.         { 0   ,   0                       }
  127. };
  128.  
  129. /***************************************************************************\
  130. * aVkToBits[]  - map Virtual Keys to Modifier Bits
  131. *
  132. * See kbd.h for a full description.
  133. *
  134. * The keyboard has only three shifter keys:
  135. *     SHIFT (L & R) affects alphabnumeric keys,
  136. *     CTRL  (L & R) is used to generate control characters
  137. *     ALT   (L & R) used for generating characters by number with numpad
  138. \***************************************************************************/
  139. static ALLOC_SECTION_LDATA VK_TO_BIT aVkToBits[] = {
  140.     { VK_SHIFT    ,   KBDSHIFT     },
  141.     { VK_CONTROL  ,   KBDCTRL      },
  142.     { VK_MENU     ,   KBDALT       },
  143.     { 0           ,   0           }
  144. };
  145.  
  146. /***************************************************************************\
  147. * aModification[]  - map character modifier bits to modification number
  148. *
  149. * See kbd.h for a full description.
  150. *
  151. \***************************************************************************/
  152.  
  153. static ALLOC_SECTION_LDATA MODIFIERS CharModifiers = {
  154.     &aVkToBits[0],
  155.     7,
  156.     {
  157.     //  Modification# //  Keys Pressed
  158.     //  ============= // =============
  159.         0,            //
  160.         1,            // Shift
  161.         2,            // Control
  162.         SHFT_INVALID, // Shift + Control
  163.         SHFT_INVALID, // Menu
  164.         SHFT_INVALID, // Shift + Menu
  165.         3,            // Control + Menu
  166.         4             // Shift + Control + Menu
  167.      }
  168. };
  169.  
  170. /***************************************************************************\
  171. *
  172. * aVkToWch2[]  - Virtual Key to WCHAR translation for 2 shift states
  173. * aVkToWch3[]  - Virtual Key to WCHAR translation for 3 shift states
  174. * aVkToWch4[]  - Virtual Key to WCHAR translation for 4 shift states
  175. * aVkToWch5[]  - Virtual Key to WCHAR translation for 5 shift states
  176. * aVkToWch6[]  - Virtual Key to WCHAR translation for 6 shift states
  177. *
  178. * Table attributes: Unordered Scan, null-terminated
  179. *
  180. * Search this table for an entry with a matching Virtual Key to find the
  181. * corresponding unshifted and shifted WCHAR characters.
  182. *
  183. * Special values for VirtualKey (column 1)
  184. *     0xff          - dead chars for the previous entry
  185. *     0             - terminate the list
  186. *
  187. * Special values for Attributes (column 2)
  188. *     CAPLOK bit    - CAPS-LOCK affect this key like SHIFT
  189. *
  190. * Special values for wch[*] (column 3 & 4)
  191. *     WCH_NONE      - No character
  192. *     WCH_DEAD      - Dead Key (diaresis) or invalid (US keyboard has none)
  193. *     WCH_LGTR      - Ligature (generates multiple characters)
  194. *
  195. \***************************************************************************/
  196.  
  197. static ALLOC_SECTION_LDATA VK_TO_WCHARS2 aVkToWch2[] = {
  198. //                      |         |  Shift  |
  199. //                      |=========|=========|
  200.   {VK_TAB       ,0      ,'\t'     ,'\t'     },
  201.   {VK_ADD       ,0      ,'+'      ,'+'      },
  202.   {VK_DIVIDE    ,0      ,'/'      ,'/'      },
  203.   {VK_MULTIPLY  ,0      ,'*'      ,'*'      },
  204.   {VK_SUBTRACT  ,0      ,'-'      ,'-'      },
  205.   {0            ,0      ,0        ,0        }
  206. };
  207.  
  208. static ALLOC_SECTION_LDATA VK_TO_WCHARS3 aVkToWch3[] = {
  209. //                      |         |  Shift  |  Ctrl   |
  210. //                      |=========|=========|=========|
  211.   {VK_BACK      ,0      ,'\b'     ,'\b'     ,0x007f   },
  212.   {VK_ESCAPE    ,0      ,0x001b   ,0x001b   ,0x001b   },
  213.   {VK_RETURN    ,0      ,'\r'     ,'\r'     ,'\n'     },
  214.   {VK_CANCEL    ,0      ,0x0003   ,0x0003   ,0x0003   },
  215.   {0            ,0      ,0        ,0        ,0        }
  216. };
  217.  
  218. static ALLOC_SECTION_LDATA VK_TO_WCHARS5 aVkToWch5[] = {
  219. //                      |         |  Shift  |  Ctrl   |  Ctl+Alt|S+Ctl+Alt|
  220. //                      |=========|=========|=========|=========|=========|
  221.   {'1'          ,0      ,'1'      ,'!'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  222.   {'2'          ,0      ,'2'      ,'\"'     ,WCH_NONE ,WCH_DEAD ,WCH_NONE },
  223.   {0xff         ,0      ,WCH_NONE ,WCH_NONE ,WCH_NONE ,0x00a8   ,WCH_NONE },
  224.   {'3'          ,0      ,'3'      ,0x00a3   ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  225.   {'4'          ,0      ,'4'      ,'$'      ,WCH_NONE ,0x20ac   ,WCH_NONE },
  226.   {'5'          ,0      ,'5'      ,'%'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  227.   {'6'          ,0      ,'6'      ,'^'      ,WCH_NONE ,WCH_DEAD ,WCH_NONE },
  228.   {0xff         ,0      ,WCH_NONE ,WCH_NONE ,WCH_NONE ,'^'      ,WCH_NONE },
  229.   {'7'          ,0      ,'7'      ,'&'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  230.   {'8'          ,0      ,'8'      ,'*'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  231.   {'9'          ,0      ,'9'      ,'('      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  232.   {'0'          ,0      ,'0'      ,')'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  233.   {VK_OEM_MINUS ,0      ,'-'      ,'_'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  234.   {VK_OEM_PLUS  ,0      ,'='      ,'+'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  235.   {'Q'          ,CAPLOK ,'q'      ,'Q'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  236.   {'W'          ,CAPLOK | CAPLOKALTGR,'w'      ,'W'      ,WCH_NONE ,0x1e83   ,0x1e82   },
  237.   {'E'          ,CAPLOK | CAPLOKALTGR,'e'      ,'E'      ,WCH_NONE ,0x00e9   ,0x00c9   },
  238.   {'R'          ,CAPLOK ,'r'      ,'R'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  239.   {'T'          ,CAPLOK ,'t'      ,'T'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  240.   {'Y'          ,CAPLOK | CAPLOKALTGR,'y'      ,'Y'      ,WCH_NONE ,0x00fd   ,0x00dd   },
  241.   {'U'          ,CAPLOK | CAPLOKALTGR,'u'      ,'U'      ,WCH_NONE ,0x00fa   ,0x00da   },
  242.   {'I'          ,CAPLOK | CAPLOKALTGR,'i'      ,'I'      ,WCH_NONE ,0x00ed   ,0x00cd   },
  243.   {'O'          ,CAPLOK | CAPLOKALTGR,'o'      ,'O'      ,WCH_NONE ,0x00f3   ,0x00d3   },
  244.   {'P'          ,CAPLOK ,'p'      ,'P'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  245.   {VK_OEM_4     ,0      ,'['      ,'{'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  246.   {VK_OEM_6     ,0      ,']'      ,'}'      ,WCH_NONE ,WCH_NONE ,'|'      },
  247.   {'A'          ,CAPLOK | CAPLOKALTGR,'a'      ,'A'      ,WCH_NONE ,0x00e1   ,0x00c1   },
  248.   {'S'          ,CAPLOK ,'s'      ,'S'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  249.   {'D'          ,CAPLOK ,'d'      ,'D'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  250.   {'F'          ,CAPLOK ,'f'      ,'F'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  251.   {'G'          ,CAPLOK ,'g'      ,'G'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  252.   {'H'          ,CAPLOK ,'h'      ,'H'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  253.   {'J'          ,CAPLOK ,'j'      ,'J'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  254.   {'K'          ,CAPLOK ,'k'      ,'K'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  255.   {'L'          ,CAPLOK ,'l'      ,'L'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  256.   {VK_OEM_1     ,0      ,';'      ,':'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  257.   {VK_OEM_3     ,0      ,'\''     ,'@'      ,WCH_NONE ,WCH_DEAD ,'`'      },
  258.   {0xff         ,0      ,WCH_NONE ,WCH_NONE ,WCH_NONE ,0x00b4   ,WCH_NONE },
  259.   {VK_OEM_8     ,0      ,WCH_DEAD ,0x00ac   ,WCH_NONE ,0x00a6   ,WCH_NONE },
  260.   {0xff         ,0      ,'`'      ,WCH_NONE ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  261.   {VK_OEM_7     ,0      ,'#'      ,'~'      ,WCH_NONE ,WCH_DEAD ,'\\'     },
  262.   {0xff         ,0      ,WCH_NONE ,WCH_NONE ,WCH_NONE ,'~'      ,WCH_NONE },
  263.   {'Z'          ,CAPLOK ,'z'      ,'Z'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  264.   {'X'          ,CAPLOK ,'x'      ,'X'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  265.   {'C'          ,CAPLOK | CAPLOKALTGR,'c'      ,'C'      ,WCH_NONE ,0x00e7   ,0x00c7   },
  266.   {'V'          ,CAPLOK ,'v'      ,'V'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  267.   {'B'          ,CAPLOK ,'b'      ,'B'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  268.   {'N'          ,CAPLOK ,'n'      ,'N'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  269.   {'M'          ,CAPLOK ,'m'      ,'M'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  270.   {VK_OEM_COMMA ,0      ,','      ,'<'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  271.   {VK_OEM_PERIOD,0      ,'.'      ,'>'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  272.   {VK_OEM_2     ,0      ,'/'      ,'?'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  273.   {VK_SPACE     ,0      ,' '      ,' '      ,' '      ,WCH_NONE ,WCH_NONE },
  274.   {VK_OEM_5     ,0      ,'\\'     ,'|'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  275.   {VK_DECIMAL   ,0      ,'.'      ,'.'      ,WCH_NONE ,WCH_NONE ,WCH_NONE },
  276.   {0            ,0      ,0        ,0        ,0        ,0        ,0        }
  277. };
  278.  
  279. // Put this last so that VkKeyScan interprets number characters
  280. // as coming from the main section of the kbd (aVkToWch2 and
  281. // aVkToWch5) before considering the numpad (aVkToWch1).
  282.  
  283. static ALLOC_SECTION_LDATA VK_TO_WCHARS1 aVkToWch1[] = {
  284.     { VK_NUMPAD0   , 0      ,  '0'   },
  285.     { VK_NUMPAD1   , 0      ,  '1'   },
  286.     { VK_NUMPAD2   , 0      ,  '2'   },
  287.     { VK_NUMPAD3   , 0      ,  '3'   },
  288.     { VK_NUMPAD4   , 0      ,  '4'   },
  289.     { VK_NUMPAD5   , 0      ,  '5'   },
  290.     { VK_NUMPAD6   , 0      ,  '6'   },
  291.     { VK_NUMPAD7   , 0      ,  '7'   },
  292.     { VK_NUMPAD8   , 0      ,  '8'   },
  293.     { VK_NUMPAD9   , 0      ,  '9'   },
  294.     { 0            , 0      ,  '\0'  }
  295. };
  296.  
  297. static ALLOC_SECTION_LDATA VK_TO_WCHAR_TABLE aVkToWcharTable[] = {
  298.     {  (PVK_TO_WCHARS1)aVkToWch3, 3, sizeof(aVkToWch3[0]) },
  299.     {  (PVK_TO_WCHARS1)aVkToWch5, 5, sizeof(aVkToWch5[0]) },
  300.     {  (PVK_TO_WCHARS1)aVkToWch2, 2, sizeof(aVkToWch2[0]) },
  301.     {  (PVK_TO_WCHARS1)aVkToWch1, 1, sizeof(aVkToWch1[0]) },
  302.     {                       NULL, 0, 0                    },
  303. };
  304.  
  305. /***************************************************************************\
  306. * aKeyNames[], aKeyNamesExt[]  - Virtual Scancode to Key Name tables
  307. *
  308. * Table attributes: Ordered Scan (by scancode), null-terminated
  309. *
  310. * Only the names of Extended, NumPad, Dead and Non-Printable keys are here.
  311. * (Keys producing printable characters are named by that character)
  312. \***************************************************************************/
  313.  
  314. static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNames[] = {
  315.     0x01,    L"Esc",
  316.     0x0e,    L"Backspace",
  317.     0x0f,    L"Tab",
  318.     0x1c,    L"Enter",
  319.     0x1d,    L"Ctrl",
  320.     0x2a,    L"Shift",
  321.     0x36,    L"Right Shift",
  322.     0x37,    L"Num *",
  323.     0x38,    L"Alt",
  324.     0x39,    L"Space",
  325.     0x3a,    L"Caps Lock",
  326.     0x3b,    L"F1",
  327.     0x3c,    L"F2",
  328.     0x3d,    L"F3",
  329.     0x3e,    L"F4",
  330.     0x3f,    L"F5",
  331.     0x40,    L"F6",
  332.     0x41,    L"F7",
  333.     0x42,    L"F8",
  334.     0x43,    L"F9",
  335.     0x44,    L"F10",
  336.     0x45,    L"Pause",
  337.     0x46,    L"Scroll Lock",
  338.     0x47,    L"Num 7",
  339.     0x48,    L"Num 8",
  340.     0x49,    L"Num 9",
  341.     0x4a,    L"Num -",
  342.     0x4b,    L"Num 4",
  343.     0x4c,    L"Num 5",
  344.     0x4d,    L"Num 6",
  345.     0x4e,    L"Num +",
  346.     0x4f,    L"Num 1",
  347.     0x50,    L"Num 2",
  348.     0x51,    L"Num 3",
  349.     0x52,    L"Num 0",
  350.     0x53,    L"Num Del",
  351.     0x54,    L"Sys Req",
  352.     0x57,    L"F11",
  353.     0x58,    L"F12",
  354.     0x7c,    L"F13",
  355.     0x7d,    L"F14",
  356.     0x7e,    L"F15",
  357.     0x7f,    L"F16",
  358.     0x80,    L"F17",
  359.     0x81,    L"F18",
  360.     0x82,    L"F19",
  361.     0x83,    L"F20",
  362.     0x84,    L"F21",
  363.     0x85,    L"F22",
  364.     0x86,    L"F23",
  365.     0x87,    L"F24",
  366.     0   ,    NULL
  367. };
  368.  
  369. static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNamesExt[] = {
  370.     0x1c,    L"Num Enter",
  371.     0x1d,    L"Right Ctrl",
  372.     0x35,    L"Num /",
  373.     0x37,    L"Prnt Scrn",
  374.     0x38,    L"Right Alt",
  375.     0x45,    L"Num Lock",
  376.     0x46,    L"Break",
  377.     0x47,    L"Home",
  378.     0x48,    L"Up",
  379.     0x49,    L"Page Up",
  380.     0x4b,    L"Left",
  381.     0x4d,    L"Right",
  382.     0x4f,    L"End",
  383.     0x50,    L"Down",
  384.     0x51,    L"Page Down",
  385.     0x52,    L"Insert",
  386.     0x53,    L"Delete",
  387.     0x54,    L"<00>",
  388.     0x56,    L"Help",
  389.     0x5b,    L"Left Windows",
  390.     0x5c,    L"Right Windows",
  391.     0x5d,    L"Application",
  392.     0   ,    NULL
  393. };
  394.  
  395. static ALLOC_SECTION_LDATA DEADKEY_LPWSTR aKeyNamesDead[] = {
  396.     L"\x00a8"   L"DIAERESIS",
  397.     L"^"    L"CIRCUMFLEX ACCENT",
  398.     L"\x00b4"   L"ACUTE ACCENT",
  399.     L"`"    L"GRAVE ACCENT",
  400.     L"~"    L"TILDE",
  401.     NULL
  402. };
  403.  
  404. static ALLOC_SECTION_LDATA DEADKEY aDeadKey[] = {
  405.     DEADTRANS( L'a'   , 0x00a8 , 0x00e4 , 0x0000),
  406.     DEADTRANS( L'w'   , 0x00a8 , 0x1e85 , 0x0000),
  407.     DEADTRANS( L'e'   , 0x00a8 , 0x00eb , 0x0000),
  408.     DEADTRANS( L'u'   , 0x00a8 , 0x00fc , 0x0000),
  409.     DEADTRANS( L'i'   , 0x00a8 , 0x00ef , 0x0000),
  410.     DEADTRANS( L'y'   , 0x00a8 , 0x00ff , 0x0000),
  411.     DEADTRANS( L'o'   , 0x00a8 , 0x00f6 , 0x0000),
  412.     DEADTRANS( L'A'   , 0x00a8 , 0x00c4 , 0x0000),
  413.     DEADTRANS( L'W'   , 0x00a8 , 0x1e84 , 0x0000),
  414.     DEADTRANS( L'E'   , 0x00a8 , 0x00cb , 0x0000),
  415.     DEADTRANS( L'U'   , 0x00a8 , 0x00dc , 0x0000),
  416.     DEADTRANS( L'I'   , 0x00a8 , 0x00cf , 0x0000),
  417.     DEADTRANS( L'Y'   , 0x00a8 , 0x0178 , 0x0000),
  418.     DEADTRANS( L'O'   , 0x00a8 , 0x00d6 , 0x0000),
  419.     DEADTRANS( L' '   , 0x00a8 , 0x00a8 , 0x0000),
  420.  
  421.     DEADTRANS( L'a'   , L'^'   , 0x00e2 , 0x0000),
  422.     DEADTRANS( L'w'   , L'^'   , 0x0175 , 0x0000),
  423.     DEADTRANS( L'e'   , L'^'   , 0x00ea , 0x0000),
  424.     DEADTRANS( L'u'   , L'^'   , 0x00fb , 0x0000),
  425.     DEADTRANS( L'i'   , L'^'   , 0x00ee , 0x0000),
  426.     DEADTRANS( L'y'   , L'^'   , 0x0177 , 0x0000),
  427.     DEADTRANS( L'o'   , L'^'   , 0x00f4 , 0x0000),
  428.     DEADTRANS( L'A'   , L'^'   , 0x00c2 , 0x0000),
  429.     DEADTRANS( L'W'   , L'^'   , 0x0174 , 0x0000),
  430.     DEADTRANS( L'E'   , L'^'   , 0x00ca , 0x0000),
  431.     DEADTRANS( L'U'   , L'^'   , 0x00db , 0x0000),
  432.     DEADTRANS( L'I'   , L'^'   , 0x00ce , 0x0000),
  433.     DEADTRANS( L'Y'   , L'^'   , 0x0176 , 0x0000),
  434.     DEADTRANS( L'O'   , L'^'   , 0x00d4 , 0x0000),
  435.     DEADTRANS( L' '   , L'^'   , L'^'   , 0x0000),
  436.  
  437.     DEADTRANS( L'a'   , 0x00b4 , 0x00e1 , 0x0000),
  438.     DEADTRANS( L'w'   , 0x00b4 , 0x1e83 , 0x0000),
  439.     DEADTRANS( L'e'   , 0x00b4 , 0x00e9 , 0x0000),
  440.     DEADTRANS( L'u'   , 0x00b4 , 0x00fa , 0x0000),
  441.     DEADTRANS( L'i'   , 0x00b4 , 0x00ed , 0x0000),
  442.     DEADTRANS( L'y'   , 0x00b4 , 0x00fd , 0x0000),
  443.     DEADTRANS( L'o'   , 0x00b4 , 0x00f3 , 0x0000),
  444.     DEADTRANS( L'A'   , 0x00b4 , 0x00c1 , 0x0000),
  445.     DEADTRANS( L'W'   , 0x00b4 , 0x1e82 , 0x0000),
  446.     DEADTRANS( L'E'   , 0x00b4 , 0x00c9 , 0x0000),
  447.     DEADTRANS( L'U'   , 0x00b4 , 0x00da , 0x0000),
  448.     DEADTRANS( L'I'   , 0x00b4 , 0x00cd , 0x0000),
  449.     DEADTRANS( L'Y'   , 0x00b4 , 0x00dd , 0x0000),
  450.     DEADTRANS( L'O'   , 0x00b4 , 0x00d3 , 0x0000),
  451.     DEADTRANS( L' '   , 0x00b4 , 0x00b4 , 0x0000),
  452.  
  453.     DEADTRANS( L'a'   , L'`'   , 0x00e0 , 0x0000),
  454.     DEADTRANS( L'w'   , L'`'   , 0x1e81 , 0x0000),
  455.     DEADTRANS( L'e'   , L'`'   , 0x00e8 , 0x0000),
  456.     DEADTRANS( L'u'   , L'`'   , 0x00f9 , 0x0000),
  457.     DEADTRANS( L'i'   , L'`'   , 0x00ec , 0x0000),
  458.     DEADTRANS( L'y'   , L'`'   , 0x1ef3 , 0x0000),
  459.     DEADTRANS( L'o'   , L'`'   , 0x00f2 , 0x0000),
  460.     DEADTRANS( L'A'   , L'`'   , 0x00c0 , 0x0000),
  461.     DEADTRANS( L'W'   , L'`'   , 0x1e80 , 0x0000),
  462.     DEADTRANS( L'E'   , L'`'   , 0x00c8 , 0x0000),
  463.     DEADTRANS( L'U'   , L'`'   , 0x00d9 , 0x0000),
  464.     DEADTRANS( L'I'   , L'`'   , 0x00cc , 0x0000),
  465.     DEADTRANS( L'Y'   , L'`'   , 0x1ef2 , 0x0000),
  466.     DEADTRANS( L'O'   , L'`'   , 0x00d2 , 0x0000),
  467.     DEADTRANS( L' '   , L'`'   , L'`'   , 0x0000),
  468.  
  469.     DEADTRANS( L'n'   , L'~'   , 0x00f1 , 0x0000),
  470.     DEADTRANS( L'a'   , L'~'   , 0x00e3 , 0x0000),
  471.     DEADTRANS( L'o'   , L'~'   , 0x00f5 , 0x0000),
  472.     DEADTRANS( L'N'   , L'~'   , 0x00d1 , 0x0000),
  473.     DEADTRANS( L'A'   , L'~'   , 0x00c3 , 0x0000),
  474.     DEADTRANS( L'O'   , L'~'   , 0x00d5 , 0x0000),
  475.     DEADTRANS( L' '   , L'~'   , L'~'   , 0x0000),
  476.  
  477.     0, 0
  478. };
  479.  
  480. static ALLOC_SECTION_LDATA KBDTABLES KbdTables = {
  481.     /*
  482.      * Modifier keys
  483.      */
  484.     &CharModifiers,
  485.  
  486.     /*
  487.      * Characters tables
  488.      */
  489.     aVkToWcharTable,
  490.  
  491.     /*
  492.      * Diacritics
  493.      */
  494.     aDeadKey,
  495.  
  496.     /*
  497.      * Names of Keys
  498.      */
  499.     aKeyNames,
  500.     aKeyNamesExt,
  501.     aKeyNamesDead,
  502.  
  503.     /*
  504.      * Scan codes to Virtual Keys
  505.      */
  506.     ausVK,
  507.     sizeof(ausVK) / sizeof(ausVK[0]),
  508.     aE0VscToVk,
  509.     aE1VscToVk,
  510.  
  511.     /*
  512.      * Locale-specific special processing
  513.      */
  514.     MAKELONG(KLLF_ALTGR, KBD_VERSION),
  515.  
  516.     /*
  517.      * Ligatures
  518.      */
  519.     0,
  520.     0,
  521.     NULL
  522. };
  523.  
  524. PKBDTABLES KbdLayerDescriptor(VOID)
  525. {
  526.     return &KbdTables;
  527. }
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540. /****************************** Module Header ******************************\
  541. * Module Name: kbduk.H
  542. *
  543. * keyboard layout header
  544. *
  545. * Copyright (c) 1985-2001, Microsoft Corporation
  546. *
  547. * Various defines for use by keyboard input code.
  548. *
  549. \***************************************************************************/
  550.  
  551. /*
  552.  * kbd type should be controlled by cl command-line argument
  553.  */
  554. #define KBD_TYPE 4
  555.  
  556. /*
  557. * Include the basis of all keyboard table values
  558. */
  559. #include "kbd.h"
  560. /***************************************************************************\
  561. * The table below defines the virtual keys for various keyboard types where
  562. * the keyboard differ from the US keyboard.
  563. *
  564. * _EQ() : all keyboard types have the same virtual key for this scancode
  565. * _NE() : different virtual keys for this scancode, depending on kbd type
  566. *
  567. *     +------+ +----------+----------+----------+----------+----------+----------+
  568. *     | Scan | |    kbd   |    kbd   |    kbd   |    kbd   |    kbd   |    kbd   |
  569. *     | code | |   type 1 |   type 2 |   type 3 |   type 4 |   type 5 |   type 6 |
  570. \****+-------+_+----------+----------+----------+----------+----------+----------+*/
  571.  
  572. #undef  T28
  573.  #define T28 _EQ(                                      OEM_3                      )
  574. #undef  T29
  575.  #define T29 _EQ(                                      OEM_8                      )
  576. #undef  T2B
  577.  #define T2B _EQ(                                      OEM_7                      )
  578. #undef  T56
  579.  #define T56 _EQ(                                      OEM_5                      )
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589. LIBRARY kbduk
  590.  
  591.  EXPORTS
  592.     KbdLayerDescriptor @1
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605. #include "winver.h"
  606. 1 VERSIONINFO
  607.  FILEVERSION       1,0,3,40
  608.  PRODUCTVERSION    1,0,3,40
  609.  FILEFLAGSMASK 0x3fL
  610.  FILEFLAGS 0x0L
  611. FILEOS 0x40004L
  612.  FILETYPE VFT_DLL
  613.  FILESUBTYPE VFT2_DRV_KEYBOARD
  614. BEGIN
  615.    BLOCK "StringFileInfo"
  616.    BEGIN
  617.        BLOCK "000004B0"
  618.        BEGIN
  619.            VALUE "CompanyName",     "Microsoft Corporation\0"
  620.            VALUE "FileDescription", "United Kingdom Keyboard Layout Keyboard Layout\0"
  621.            VALUE "FileVersion",     "1, 0, 3, 40\0"
  622.            VALUE "InternalName",    "kbduk (3.13)\0"
  623.            VALUE "ProductName","Microsoft® Windows® Operating System\0"
  624.            VALUE "LegalCopyright",  "© Microsoft Corporation. All rights reserved.\0"
  625.            VALUE "OriginalFilename","kbduk\0"
  626.            VALUE "ProductVersion",  "1, 0, 3, 40\0"
  627.        END
  628.    END
  629.    BLOCK "VarFileInfo"
  630.    BEGIN
  631.        VALUE "Translation", 0x0000, 0x04B0
  632.    END
  633. END
  634.  
  635. STRINGTABLE DISCARDABLE
  636. LANGUAGE 9, 1
  637. BEGIN
  638.     1200    "en-GB"
  639. END
  640.  
  641.  
  642. STRINGTABLE DISCARDABLE
  643. LANGUAGE 9, 1
  644. BEGIN
  645.     1000    "United Kingdom Keyboard Layout"
  646. END
  647.  
  648.  
  649. STRINGTABLE DISCARDABLE
  650. LANGUAGE 9, 1
  651. BEGIN
  652.     1100    "English (United Kingdom)"
  653. END
Advertisement
Add Comment
Please, Sign In to add comment