View difference between Paste ID: rRg54Www and 1qZKcaUY
SHOW: | | - or go back to the newest paste.
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 "kbd109.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