test: kbdlk41a.c Source File

Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

# kbdlk41a.c

Go to the documentation of this file.

    00001 /***************************************************************************\
    00002 * Module Name: kbdlk41a.c
    00003 *
    00004 * DEC LK411-AJ keyboard layout driver
    00005 *
    00006 * History:
    00007 * 20-SEP-1996: Nakazato(v-mnakaz, DEC-J) created
    00008 \***************************************************************************/
    00009
    00010 #include <windows.h>
    00011 #include <ime.h>
    00012 #include "vkoem.h"
    00013 #include "kbdjpn.h"
    00014 #include "kbdlk41a.h"
    00015
    00016 #if defined(_M_IA64)
    00017 #pragma section(".data")
    00018 #define ALLOC_SECTION_LDATA __declspec(allocate(".data"))
    00019 #else
    00020 #pragma data_seg(".data")
    00021 #define ALLOC_SECTION_LDATA
    00022 #endif
    00023
    00024 /***************************************************************************\
    00025 * ausVK[] - Virtual Scan Code to Virtual Key conversion table for LK411-AJ
    00026 \***************************************************************************/
    00027
    00028 static ALLOC_SECTION_LDATA USHORT ausVK[] = {
    00029     T00, T01, T02, T03, T04, T05, T06, T07,
    00030     T08, T09, T0A, T0B, T0C, T0D, T0E, T0F,
    00031     T10, T11, T12, T13, T14, T15, T16, T17,
    00032     T18, T19, T1A, T1B, T1C, T1D, T1E, T1F,
    00033     T20, T21, T22, T23, T24, T25, T26, T27,
    00034     T28,
    00035
    00036     // LK411-AJ uses "<>" key as SBCS/DBCS (NLS key)
    00037     T29 | KBDSPECIAL,
    00038
    00039     T2A, T2B, T2C, T2D, T2E, T2F,
    00040     T30, T31, T32, T33, T34, T35,
    00041
    00042      // Right-hand Shift key must have KBDEXT bit set.
    00043     T36 | KBDEXT,
    00044
    00045      // numpad_* + Shift/Alt -> SnapShot
    00046     T37 | KBDMULTIVK,
    00047
    00048     T38, T39,
    00049
    00050      // Lock key(CapsLock) must have KBDSPECIAL bit set (NLS key)
    00051     T3A | KBDSPECIAL,
    00052
    00053     T3B, T3C, T3D, T3E, T3F,
    00054     T40, T41, T42, T43, T44,
    00055
    00056      // NumLock Key:
    00057      //     KBDEXT     - VK_NUMLOCK is an Extended key
    00058      //     KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL)
    00059     T45 | KBDEXT | KBDMULTIVK,
    00060
    00061     T46 | KBDMULTIVK,
    00062
    00063      // Number Pad keys:
    00064      //    KBDNUMPAD  - digits 0-9 and decimal point.
    00065      //    KBDSPECIAL - require special processing by Windows
    00066     T47 | KBDNUMPAD | KBDSPECIAL,   // Numpad 7 (Home)
    00067     T48 | KBDNUMPAD | KBDSPECIAL,   // Numpad 8 (Up),
    00068     T49 | KBDNUMPAD | KBDSPECIAL,   // Numpad 9 (PgUp),
    00069     T4A,
    00070     T4B | KBDNUMPAD | KBDSPECIAL,   // Numpad 4 (Left),
    00071     T4C | KBDNUMPAD | KBDSPECIAL,   // Numpad 5 (Clear),
    00072     T4D | KBDNUMPAD | KBDSPECIAL,   // Numpad 6 (Right),
    00073     T4E,
    00074     T4F | KBDNUMPAD | KBDSPECIAL,   // Numpad 1 (End),
    00075     T50 | KBDNUMPAD | KBDSPECIAL,   // Numpad 2 (Down),
    00076     T51 | KBDNUMPAD | KBDSPECIAL,   // Numpad 3 (PgDn),
    00077     T52 | KBDNUMPAD | KBDSPECIAL,   // Numpad 0 (Ins),
    00078     T53 | KBDNUMPAD | KBDSPECIAL,   // Numpad . (Del),
    00079
    00080     T54, T55, T56, T57, T58, T59, T5A, T5B,
    00081     T5C, T5D, T5E, T5F, T60, T61, T62, T63,
    00082     T64, T65, T66, T67, T68, T69, T6A, T6B,
    00083     T6C, T6D, T6E, T6F,
    00084
    00085      // Hiragana/Katakana/Roman key must have KBDSPECIAL bit set (NLS key)
    00086     T70 | KBDSPECIAL,
    00087
    00088     T71, T72, T73,
    00089     T74, T75, T76, T77, T78,
    00090
    00091      // Conversion key must have KBDSPECIAL bit set (NLS key)
    00092     T79 | KBDSPECIAL,
    00093
    00094     T7A,
    00095
    00096      // Non-Conversion key must have KBDSPECIAL bit set (NLS key)
    00097     T7B | KBDSPECIAL,
    00098
    00099     T7C, T7D, T7E, T7F
    00100 };
    00101
    00102
    00103 static ALLOC_SECTION_LDATA VSC_VK aE0VscToVk[] = {
    00104         { 0x0F, X0F | KBDEXT | KBDSPECIAL | KBDMULTIVK },       // LK411 added (kana key)
    00105         { 0x1C, X1C | KBDEXT              },  // Numpad Enter
    00106         { 0x1D, X1D | KBDEXT              },  // RControl
    00107         { 0x35, X35 | KBDEXT              },  // Numpad Divide
    00108         { 0x37, X37 | KBDEXT              },  // Snapshot
    00109         { 0x38, X38 | KBDEXT              },  // RMenu
    00110         { 0x3D, X3D | KBDEXT              },  // F13            // LK411 added
    00111         { 0x3E, X3E | KBDEXT              },  // F14            // LK411 added
    00112         { 0x3F, X3F | KBDEXT              },  // F15 (Help)     // LK411 added
    00113         { 0x40, X40 | KBDEXT              },  // F16 (Do)       // LK411 added
    00114         { 0x41, X41 | KBDEXT              },  // F17            // LK411 added
    00115         { 0x46, X46 | KBDEXT              },  // Break (Ctrl + Pause)   // LK411 removed (@@ check)
    00116         { 0x47, X47 | KBDEXT              },  // Home
    00117         { 0x48, X48 | KBDEXT              },  // Up
    00118         { 0x49, X49 | KBDEXT              },  // Prior
    00119         { 0x4B, X4B | KBDEXT              },  // Left
    00120         { 0x4D, X4D | KBDEXT              },  // Right
    00121         { 0x4E, X4E | KBDEXT              },  // Keypad Minus       // LK411
    00122         { 0x4F, X4F | KBDEXT              },  // End
    00123         { 0x50, X50 | KBDEXT              },  // Down
    00124         { 0x51, X51 | KBDEXT              },  // Next
    00125         { 0x52, X52 | KBDEXT              },  // Insert
    00126         { 0x53, X53 | KBDEXT              },  // Delete
    00127 //      { 0x5B, X5B | KBDEXT              },  // Left Win       // LK411 remove
    00128 //      { 0x5C, X5C | KBDEXT              },  // Right Win      // LK411 remove
    00129 //      { 0x5D, X5D | KBDEXT              },  // Application        // LK411 remove
    00130         { 0,      0                       }
    00131 };
    00132
    00133
    00134 static ALLOC_SECTION_LDATA VSC_VK aE1VscToVk[] = {
    00135         { 0x1D, Y1D                       },  // Pause
    00136         { 0   ,   0                       }
    00137 };
    00138
    00139
    00140
    00141 /***************************************************************************\
    00142 * aVkToBits[]  - map Virtual Keys to Modifier Bits
    00143 *
    00144 * See kbd.h for a full description.
    00145 *
    00146 * US Keyboard has only three shifter keys:
    00147 *     SHIFT (L & R) affects alphabnumeric keys,
    00148 *     CTRL  (L & R) is used to generate control characters
    00149 *     ALT   (L & R) used for generating characters by number with numpad
    00150 \***************************************************************************/
    00151
    00152 static ALLOC_SECTION_LDATA VK_TO_BIT aVkToBits[] = {
    00153     { VK_SHIFT,   KBDSHIFT },   // 1st bit (0001)
    00154     { VK_CONTROL, KBDCTRL  },   // 2nd bit (0010)
    00155     { VK_MENU,    KBDALT   },   // 4th bit (0100)
    00156     { VK_KANA,    KBDKANA  },   // 8th bit (1000)
    00157     { 0,          0        }
    00158 };
    00159
    00160
    00161
    00162 /***************************************************************************\
    00163 * aModification[]  - map character modifier bits to modification number
    00164 *
    00165 * See kbd.h for a full description.
    00166 *
    00167 \***************************************************************************/
    00168
    00169 static ALLOC_SECTION_LDATA MODIFIERS CharModifiers = {
    00170     &aVkToBits[0],
    00171     11,
    00172     {
    00173     //  Modification# // bit    Keys Pressed  : Explanation
    00174     //  ============= // ====  ============== : =============================
    00175         0,            // 0000                 : unshifted characters
    00176         1,            // 0001           SHIFT : capitals, ~!@#$%^&*()_+{}:"<>? etc.
    00177         4,            // 0010      CTRL       : control characters
    00178         6,            // 0011      CTRL SHIFT :
    00179         SHFT_INVALID, // 0100  ALT            : invalid
    00180         SHFT_INVALID, // 0101  ALT      SHIFT : invalid
    00181         SHFT_INVALID, // 0110  ALT CTRL       : invalid
    00182         SHFT_INVALID, // 0111  ALT CTRL SHIFT : invalid
    00183         2,            // 1000  KANA
    00184         3,            // 1001  KANA      SHIFT
    00185         5,            // 1010  KANA CTRL
    00186         7             // 1011  KANA CTRL SHIFT
    00187     }
    00188 };
    00189
    00190
    00191
    00192 /***************************************************************************\
    00193 *
    00194 * aVkToWch4[]  - Virtual Key to WCHAR translation for 4 shift states
    00195 * aVkToWch6[]  - Virtual Key to WCHAR translation for 6 shift states
    00196 * aVkToWch8[]  - Virtual Key to WCHAR translation for 8 shift states
    00197 * aVkToWch1[]  - Virtual Key to WCHAR translation for NUMPAD
    00198 *
    00199 * Table attributes: Unordered Scan, null-terminated
    00200 *
    00201 * Search this table for an entry with a matching Virtual Key to find the
    00202 * corresponding unshifted and shifted WCHAR characters.
    00203 *
    00204 * Reserved VirtualKey values (first column)
    00205 *     -1            - this line contains dead characters (diacritic)
    00206 *     0             - terminator
    00207 *
    00208 * Reserved Attribute values (second column)
    00209 *     CAPLOK        - CapsLock affects this key like Shift
    00210 *     KANALOK       - The KANA-LOCK key affects this key like KANA
    00211 *
    00212 * Reserved character values (third through last column)
    00213 *     WCH_NONE      - No character
    00214 *     WCH_DEAD      - Dead character (diacritic) value is in next line
    00215 *
    00216 \***************************************************************************/
    00217
    00218 static ALLOC_SECTION_LDATA VK_TO_WCHARS4 aVkToWch4[] = {
    00219     //                               |          |   SHIFT  |  KANA  | K+SHFT |
    00220     //                               |          |==========|========|========|
    00221     {'0'          ,          KANALOK ,'0'       ,')'       ,WCH_WA  ,WCH_WO  },
    00222     {'1'          ,          KANALOK ,'1'       ,'!'       ,WCH_NU  ,WCH_NU  },
    00223     {'3'          ,          KANALOK ,'3'       ,'#'       ,WCH_A   ,WCH_AA  },
    00224     {'4'          ,          KANALOK ,'4'       ,'$'       ,WCH_U   ,WCH_UU  },
    00225     {'5'          ,          KANALOK ,'5'       ,'%'       ,WCH_E   ,WCH_EE  },
    00226     {'7'          ,          KANALOK ,'7'       ,'&'       ,WCH_YA  ,WCH_YAA },
    00227     {'8'          ,          KANALOK ,'8'       ,'*'       ,WCH_YU  ,WCH_YUU },
    00228     {'9'          ,          KANALOK ,'9'       ,'('       ,WCH_YO  ,WCH_YOO },
    00229     {'A'          , CAPLOK | KANALOK ,'a'       ,'A'       ,WCH_TI  ,WCH_TI  },
    00230     {'B'          , CAPLOK | KANALOK ,'b'       ,'B'       ,WCH_KO  ,WCH_KO  },
    00231     {'C'          , CAPLOK | KANALOK ,'c'       ,'C'       ,WCH_SO  ,WCH_SO  },
    00232     {'D'          , CAPLOK | KANALOK ,'d'       ,'D'       ,WCH_SI  ,WCH_SI  },
    00233     {'E'          , CAPLOK | KANALOK ,'e'       ,'E'       ,WCH_I   ,WCH_II  },
    00234     {'F'          , CAPLOK | KANALOK ,'f'       ,'F'       ,WCH_HA  ,WCH_HA  },
    00235     {'G'          , CAPLOK | KANALOK ,'g'       ,'G'       ,WCH_KI  ,WCH_KI  },
    00236     {'H'          , CAPLOK | KANALOK ,'h'       ,'H'       ,WCH_KU  ,WCH_KU  },
    00237     {'I'          , CAPLOK | KANALOK ,'i'       ,'I'       ,WCH_NI  ,WCH_NI  },
    00238     {'J'          , CAPLOK | KANALOK ,'j'       ,'J'       ,WCH_MA  ,WCH_MA  },
    00239     {'K'          , CAPLOK | KANALOK ,'k'       ,'K'       ,WCH_NO  ,WCH_NO  },
    00240     {'L'          , CAPLOK | KANALOK ,'l'       ,'L'       ,WCH_RI  ,WCH_RI  },
    00241     {'M'          , CAPLOK | KANALOK ,'m'       ,'M'       ,WCH_MO  ,WCH_MO  },
    00242     {'N'          , CAPLOK | KANALOK ,'n'       ,'N'       ,WCH_MI  ,WCH_MI  },
    00243     {'O'          , CAPLOK | KANALOK ,'o'       ,'O'       ,WCH_RA  ,WCH_RA  },
    00244     {'P'          , CAPLOK | KANALOK ,'p'       ,'P'       ,WCH_SE  ,WCH_SE  },
    00245     {'Q'          , CAPLOK | KANALOK ,'q'       ,'Q'       ,WCH_TA  ,WCH_TA  },
    00246     {'R'          , CAPLOK | KANALOK ,'r'       ,'R'       ,WCH_SU  ,WCH_SU  },
    00247     {'S'          , CAPLOK | KANALOK ,'s'       ,'S'       ,WCH_TO  ,WCH_TO  },
    00248     {'T'          , CAPLOK | KANALOK ,'t'       ,'T'       ,WCH_KA  ,WCH_KA  },
    00249     {'U'          , CAPLOK | KANALOK ,'u'       ,'U'       ,WCH_NA  ,WCH_NA  },
    00250     {'V'          , CAPLOK | KANALOK ,'v'       ,'V'       ,WCH_HI  ,WCH_HI  },
    00251     {'W'          , CAPLOK | KANALOK ,'w'       ,'W'       ,WCH_TE  ,WCH_TE  },
    00252     {'X'          , CAPLOK | KANALOK ,'x'       ,'X'       ,WCH_SA  ,WCH_SA  },
    00253     {'Y'          , CAPLOK | KANALOK ,'y'       ,'Y'       ,WCH_NN  ,WCH_NN  },
    00254     {'Z'          , CAPLOK | KANALOK ,'z'       ,'Z'       ,WCH_TU  ,WCH_TUU },
    00255     {VK_OEM_1     ,          KANALOK ,';'       ,':'       ,WCH_RE  ,WCH_RE  },
    00256     {VK_OEM_2     ,          KANALOK ,'/'       ,'?'       ,WCH_ME  ,WCH_MD  },
    00257     {VK_OEM_7     ,          KANALOK ,0x27      ,'"'       ,WCH_KE  ,WCH_KE  },
    00258 //  {VK_OEM_8     , 0                ,','       ,','       ,','     ,','     },     //LK411 removed
    00259     {VK_OEM_COMMA ,          KANALOK ,','       ,'<'       ,WCH_NE  ,WCH_IC  },
    00260     {VK_OEM_PERIOD,          KANALOK ,'.'       ,'>'       ,WCH_RU  ,WCH_IP  },
    00261     {VK_OEM_PLUS  ,          KANALOK ,'='       ,'+'       ,WCH_HE  ,WCH_HE  },
    00262     {VK_DBE_SBCSCHAR, 0              ,'`'       ,'~'       ,'`'     ,'~'     },     //LK411 added
    00263     {VK_TAB       , 0                ,'\t'      ,'\t'      ,'\t'    ,'\t'    },
    00264     {VK_ADD       , 0                ,'+'       ,'+'       ,'+'     ,'+'     },
    00265     {VK_DECIMAL   , 0                ,'.'       ,'.'       ,'.'     ,'.'     },
    00266     {VK_DIVIDE    , 0                ,'/'       ,'/'       ,'/'     ,'/'     },
    00267     {VK_MULTIPLY  , 0                ,'*'       ,'*'       ,'*'     ,'*'     },
    00268     {VK_SUBTRACT  , 0                ,'-'       ,'-'       ,'-'     ,'-'     },
    00269     {0            , 0                ,0         ,0         ,0       ,0       }
    00270 };
    00271
    00272
    00273 static ALLOC_SECTION_LDATA VK_TO_WCHARS6 aVkToWch6[] = {
    00274     //                      |          |   SHIFT  |  KANA  | K+SHFT |  CONTROL  |  K+CTRL   |
    00275     //                      |          |==========|========|========|===========|===========|
    00276     {VK_BACK      , 0       ,'\b'      ,'\b'      ,'\b'    ,'\b'    , 0x7f      , 0x7f      },
    00277     {VK_CANCEL    , 0       ,0x03      ,0x03      ,0x03    ,0x03    , 0x03      , 0x03      },
    00278     {VK_ESCAPE    , 0       ,0x1b      ,0x1b      ,0x1b    ,0x1b    , 0x1b      , 0x1b      },
    00279     {VK_OEM_4     , KANALOK ,'['       ,'{'       ,WCH_RO  ,WCH_VS  , 0x1b      , 0x1b      },  // LK411 modified
    00280     {VK_OEM_5     , KANALOK ,'\\'      ,'|'       ,WCH_OB  ,WCH_CB  , 0x1c      , 0x1c      },  // LK411 modified
    00281     {VK_OEM_6     , KANALOK ,']'       ,'}'       ,WCH_MU  ,WCH_SVS , 0x1d      , 0x1d      },  // LK411 modified
    00282     {VK_RETURN    , 0       ,'\r'      ,'\r'      ,'\r'    ,'\r'    , '\n'      , '\n'      },
    00283     {VK_SPACE     , 0       ,' '       ,' '       ,' '     ,' '     , 0x20      , 0x20      },
    00284     {0            , 0       ,0         ,0         ,0       ,0       , 0         , 0         }
    00285 };
    00286
    00287
    00288 static ALLOC_SECTION_LDATA VK_TO_WCHARS8 aVkToWch8[] = {
    00289     //                      |          |   SHIFT  |  KANA  | K+SHFT |  CONTROL  |  K+CTRL   | SHFT+CTRL |K+SHFT+CTRL|
    00290     //                      |          |==========|========|========|===========|===========|===========|===========|
    00291     {'2'          , KANALOK ,'2'       ,'@'       ,WCH_HU  ,WCH_HU  , WCH_NONE  , WCH_NONE  , 0x00      , 0x00      },
    00292     {'6'          , KANALOK ,'6'       ,'^'       ,WCH_O   ,WCH_OO  , WCH_NONE  , WCH_NONE  , 0x1e      , 0x1e      },
    00293     {VK_OEM_MINUS , KANALOK ,'-'       ,'_'       ,WCH_HO  ,WCH_HO  , WCH_NONE  , WCH_NONE  , 0x1f      , 0x1f      },  // LK411
    00294     {0            , 0       ,0         ,0         ,0       ,0       , 0         , 0         , 0         , 0         }
    00295 };
    00296
    00297
    00298 // Put this last so that VkKeyScan interprets number characters
    00299 // as coming from the main section of the kbd (aVkToWch2 and
    00300 // aVkToWch4) before considering the numpad (aVkToWch1).
    00301 //
    00302 // LK411 doesn't use this table. (Because it doesn't use NUMPAD VK)
    00303
    00304 static ALLOC_SECTION_LDATA VK_TO_WCHARS4 aVkToWch1[] = {
    00305     //                     |          |   SHIFT  |  KANA  | K+SHFT |
    00306     //                     |          |==========|========|========|
    00307     { VK_NUMPAD0   , 0      ,  '0'    , WCH_NONE ,   '0'  ,WCH_NONE},
    00308     { VK_NUMPAD1   , 0      ,  '1'    , WCH_NONE ,   '1'  ,WCH_NONE},
    00309     { VK_NUMPAD2   , 0      ,  '2'    , WCH_NONE ,   '2'  ,WCH_NONE},
    00310     { VK_NUMPAD3   , 0      ,  '3'    , WCH_NONE ,   '3'  ,WCH_NONE},
    00311     { VK_NUMPAD4   , 0      ,  '4'    , WCH_NONE ,   '4'  ,WCH_NONE},
    00312     { VK_NUMPAD5   , 0      ,  '5'    , WCH_NONE ,   '5'  ,WCH_NONE},
    00313     { VK_NUMPAD6   , 0      ,  '6'    , WCH_NONE ,   '6'  ,WCH_NONE},
    00314     { VK_NUMPAD7   , 0      ,  '7'    , WCH_NONE ,   '7'  ,WCH_NONE},
    00315     { VK_NUMPAD8   , 0      ,  '8'    , WCH_NONE ,   '8'  ,WCH_NONE},
    00316     { VK_NUMPAD9   , 0      ,  '9'    , WCH_NONE ,   '9'  ,WCH_NONE},
    00317     { 0            , 0      ,  '\0'   , 0        ,   0    ,0       }   //null terminator
    00318 };
    00319
    00320
    00321 /***************************************************************************\
    00322 * aVkToWcharTable: table of pointers to Character Tables
    00323 *
    00324 * Describes the character tables and the order they should be searched.
    00325 *
    00326 * Note: the order determines the behavior of VkKeyScan() : this function
    00327 *       takes a character and attempts to find a Virtual Key and character-
    00328 *       modifier key combination that produces that character.  The table
    00329 *       containing the numeric keypad (aVkToWch1) must appear last so that
    00330 *       VkKeyScan('0') will be interpreted as one of keys from the main
    00331 *       section, not the numpad.  etc.
    00332 \***************************************************************************/
    00333
    00334 static ALLOC_SECTION_LDATA VK_TO_WCHAR_TABLE aVkToWcharTable[] = {
    00335     {  (PVK_TO_WCHARS1)aVkToWch6, 6, sizeof(aVkToWch6[0]) },
    00336     {  (PVK_TO_WCHARS1)aVkToWch8, 8, sizeof(aVkToWch8[0]) },
    00337     {  (PVK_TO_WCHARS1)aVkToWch4, 4, sizeof(aVkToWch4[0]) },
    00338     {  (PVK_TO_WCHARS1)aVkToWch1, 4, sizeof(aVkToWch1[0]) },  // must come last
    00339     {                       NULL, 0, 0                    }
    00340 };
    00341
    00342
    00343
    00344 /***************************************************************************\
    00345 * aKeyNames[], aKeyNamesExt[]  - Scan Code -> Key Name tables
    00346 *
    00347 * For the GetKeyNameText() API function
    00348 *
    00349 * Tables for non-extended and extended (KBDEXT) keys.
    00350 * (Keys producing printable characters are named by the character itself)
    00351 \***************************************************************************/
    00352
    00353 static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNames[] = {
    00354     0x01,    L"Esc",
    00355     0x0e,    L"Backspace",
    00356     0x0f,    L"Tab",
    00357     0x1c,    L"Enter",
    00358     0x1d,    L"Ctrl",
    00359     0x29,    L"<>",
    00360     0x2a,    L"Shift",
    00361     0x36,    L"Right Shift",
    00362     0x37,    L"Num *",
    00363     0x38,    L"Alt",
    00364     0x39,    L"Space",
    00365     0x3a,    L"Caps Lock",
    00366     0x3b,    L"F1",
    00367     0x3c,    L"F2",
    00368     0x3d,    L"F3",
    00369     0x3e,    L"F4",
    00370     0x3f,    L"F5",
    00371     0x40,    L"F6",
    00372     0x41,    L"F7",
    00373     0x42,    L"F8",
    00374     0x43,    L"F9",
    00375     0x44,    L"F10",
    00376     0x45,    L"Num Lock",
    00377     0x46,    L"Scroll Lock",
    00378     0x47,    L"Num 7",
    00379     0x48,    L"Num 8",
    00380     0x49,    L"Num 9",
    00381     0x4a,    L"Num -",
    00382     0x4b,    L"Num 4",
    00383     0x4c,    L"Num 5",
    00384     0x4d,    L"Num 6",
    00385     0x4e,    L"Num +",
    00386     0x4f,    L"Num 1",
    00387     0x50,    L"Num 2",
    00388     0x51,    L"Num 3",
    00389     0x52,    L"Num 0",
    00390     0x53,    L"Num Del",
    00391     0x54,    L"Sys Req",
    00392     0x57,    L"F11",
    00393     0x58,    L"F12",
    00394     0x70,    (LPWSTR)SZ_KEY_NAME_HIRAGANA,
    00395     0x79,    (LPWSTR)SZ_KEY_NAME_HENKAN,
    00396     0x7b,    (LPWSTR)SZ_KEY_NAME_MUHENKAN,
    00397     0   ,    NULL
    00398 };
    00399
    00400
    00401 static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNamesExt[] = {
    00402     0x0f,    (LPWSTR)SZ_KEY_NAME_KANA,  //LK411 added, (@@ check), this macro defined by NEC
    00403     0x1c,    L"Num Enter",
    00404     0x1d,    L"Right Control",
    00405     0x35,    L"Num /",
    00406     0x37,    L"Prnt Scrn",
    00407     0x38,    L"Right Alt",
    00408     0x3d,    L"F13",            // LK411 added
    00409     0x3e,    L"F14",            // LK411 added
    00410     0x3f,    L"F15",            // LK411 added (Help)
    00411     0x40,    L"F16",            // LK411 added (Do)
    00412     0x41,    L"F17",            // LK411 added
    00413 //  0x45,    L"Num Lock",       // LK411 removed
    00414     0x46,    L"Break",
    00415     0x47,    L"Home",
    00416     0x48,    L"Up",
    00417     0x49,    L"Page Up",
    00418     0x4b,    L"Left",
    00419     0x4d,    L"Right",
    00420     0x4e,    L"Num +",          // LK411 modified(same KP,)
    00421     0x4f,    L"End",
    00422     0x50,    L"Down",
    00423     0x51,    L"Page Down",
    00424     0x52,    L"Insert",
    00425     0x53,    L"Delete",
    00426 //  0x54,    L"<00>",           // LK411 removed
    00427 //  0x56,    L"Help",           // LK411 removed
    00428 //  0x5B,    L"Left Windows",       // LK411 removed
    00429 //  0x5C,    L"Right Windows",      // LK411 removed
    00430 //  0x5D,    L"Application",        // LK411 removed
    00431     0   ,    NULL
    00432 };
    00433
    00434
    00435
    00436 static ALLOC_SECTION_LDATA KBDTABLES KbdTables = {
    00437     /*
    00438      * Modifier keys
    00439      */
    00440     &CharModifiers,
    00441
    00442     /*
    00443      * Characters tables
    00444      */
    00445     aVkToWcharTable,
    00446
    00447     /*
    00448      * Diacritics  (none for US English)
    00449      */
    00450     NULL,
    00451
    00452     /*
    00453      * Names of Keys  (no dead keys)
    00454      */
    00455     aKeyNames,
    00456     aKeyNamesExt,
    00457     NULL,
    00458
    00459     /*
    00460      * Scan codes to Virtual Keys
    00461      */
    00462     ausVK,
    00463     sizeof(ausVK) / sizeof(ausVK[0]),
    00464     aE0VscToVk,
    00465     aE1VscToVk,
    00466
    00467     /*
    00468      * No Locale-specific special processing
    00469      */
    00470     0
    00471 };
    00472
    00473
    00474 PKBDTABLES KbdLayerDescriptor(VOID)
    00475 {
    00476     return &KbdTables;
    00477 }
    00478
    00479
    00480
    00481 /***********************************************************************\
    00482 * VkToFuncTable_LK411[]
    00483 *
    00484 \***********************************************************************/
    00485
    00486 static ALLOC_SECTION_LDATA VK_F VkToFuncTable_LK411[] = {
    00487     /* LOCK key */
    00488     {
    00489         VK_CAPITAL,           // Base Vk
    00490         KBDNLS_TYPE_TOGGLE,   // NLSFEProcType
    00491         KBDNLS_INDEX_NORMAL,  // NLSFEProcCurrent
    00492         0x32, /* 0011 0010 */ // NLSFEProcSwitch
    00493         {                     // NLSFEProc
    00494             {KBDNLS_SEND_BASE_VK,0},         // Base
    00495             {KBDNLS_ALPHANUM,0},             // Shift
    00496             {KBDNLS_NOEVENT,0},              // Control
    00497             {KBDNLS_NOEVENT,0},              // Shift+Control
    00498             {KBDNLS_ALPHANUM,0},             // Alt
    00499             {KBDNLS_ALPHANUM,0},             // Shift+Alt
    00500             {KBDNLS_CODEINPUT,0},            // Control+Alt
    00501             {KBDNLS_CODEINPUT,0}             // Shift+Control+Alt
    00502         },
    00503         {                     // NLSFEProcAlt
    00504             {KBDNLS_ALPHANUM,0},             // Base
    00505             {KBDNLS_ALPHANUM,0},             // Shift
    00506             {KBDNLS_NOEVENT,0},              // Control
    00507             {KBDNLS_NOEVENT,0},              // Shift+Control
    00508             {KBDNLS_ALPHANUM,0},             // Alt
    00509             {KBDNLS_ALPHANUM,0},             // Shift+Alt
    00510             {KBDNLS_NOEVENT,0},              // Control+Alt
    00511             {KBDNLS_NOEVENT,0}               // Shift+Control+Alt
    00512         }
    00513     },
    00514
    00515     /* KANA key */
    00516     {
    00517         VK_KANA,              // Base Vk
    00518         KBDNLS_TYPE_TOGGLE,   // NLSFEProcType
    00519         KBDNLS_INDEX_NORMAL,  // NLSFEProcCurrent
    00520         0x08, /* 0000 1000 */ // NLSFEProcSwitch
    00521         {                     // NLSFEProc
    00522             {KBDNLS_SEND_BASE_VK,0},         // Base
    00523             {KBDNLS_NOEVENT,0},              // Shift
    00524             {KBDNLS_NOEVENT,0},              // Control
    00525             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Shift+Control
    00526             {KBDNLS_NOEVENT,0},              // Alt
    00527             {KBDNLS_NOEVENT,0},              // Shift+Alt
    00528             {KBDNLS_NOEVENT,0},              // Control+Alt
    00529             {KBDNLS_NOEVENT,0}               // Shift+Control+Alt
    00530         },
    00531         {                    // NLSFEProcIndexAlt
    00532             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Base
    00533             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Shift
    00534             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Control
    00535             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Shift+Control
    00536             {KBDNLS_NOEVENT,0},              // Alt
    00537             {KBDNLS_NOEVENT,0},              // Shift+Alt
    00538             {KBDNLS_NOEVENT,0},              // Control+Alt
    00539             {KBDNLS_NOEVENT,0}               // Shift+Control+Alt
    00540         }
    00541     },
    00542
    00543     /* Hiragana/Katakana key */
    00544     {
    00545         VK_DBE_HIRAGANA,      // Base Vk
    00546         KBDNLS_TYPE_TOGGLE,   // NLSFEProcType
    00547         KBDNLS_INDEX_NORMAL,  // NLSFEProcCurrent
    00548         0x08, /* 0000 1000 */ // NLSFEProcSwitch
    00549         {                     // NLSFEProc
    00550             {KBDNLS_HIRAGANA,0},             // Base
    00551             {KBDNLS_KATAKANA,0},             // Shift
    00552             {KBDNLS_SBCSDBCS,0},             // Control
    00553             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Shift+Control
    00554             {KBDNLS_ROMAN,0},                // Alt
    00555             {KBDNLS_ROMAN,0},                // Shift+Alt
    00556             {KBDNLS_ROMAN,0},                // Control+Alt
    00557             {KBDNLS_NOEVENT,0}               // Shift+Control+Alt
    00558         },
    00559         {                    // NLSFEProcIndexAlt
    00560             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Base
    00561             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Shift
    00562             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Control
    00563             {KBDNLS_SEND_PARAM_VK,VK_KANA},  // Shift+Control
    00564             {KBDNLS_NOEVENT,0},              // Alt
    00565             {KBDNLS_NOEVENT,0},              // Shift+Alt
    00566             {KBDNLS_NOEVENT,0},              // Control+Alt
    00567             {KBDNLS_NOEVENT,0}               // Shift+Control+Alt
    00568         }
    00569     },
    00570
    00571     /* SBCS/DBCS key */
    00572     {
    00573         VK_DBE_SBCSCHAR,      // Base Vk
    00574         KBDNLS_TYPE_TOGGLE,   // NLSFEProcType
    00575         KBDNLS_INDEX_NORMAL,  // NLSFEProcCurrent
    00576         0x30, /* 0011 0000 */ // NLSFEProcSwitch
    00577         {                     // NLSFEProc
    00578             {KBDNLS_SEND_BASE_VK,0},         // Base  ("<")
    00579             {KBDNLS_SEND_BASE_VK,0},         // Shift (">")
    00580             {KBDNLS_SBCSDBCS,0},             // Control
    00581             {KBDNLS_SBCSDBCS,0},             // Shift+Control
    00582             {KBDNLS_SEND_PARAM_VK,VK_KANJI}, // Alt
    00583             {KBDNLS_SEND_PARAM_VK,VK_KANJI}, // Shift+Alt
    00584             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERIMECONFIGMODE}, // Control+Alt
    00585             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERIMECONFIGMODE}  // Shift+Control+Alt
    00586         },
    00587         {                    // NLSFEProcIndexAlt
    00588             {KBDNLS_SEND_PARAM_VK,VK_KANJI},  // Base
    00589             {KBDNLS_SEND_PARAM_VK,VK_KANJI},  // Shift
    00590             {KBDNLS_NOEVENT,0},              // Control
    00591             {KBDNLS_NOEVENT,0},              // Shift+Control
    00592             {KBDNLS_SEND_PARAM_VK,VK_KANJI}, // Alt
    00593             {KBDNLS_SEND_PARAM_VK,VK_KANJI}, // Shift+Alt
    00594             {KBDNLS_NOEVENT,0},              // Control+Alt
    00595             {KBDNLS_NOEVENT,0}               // Shift+Control+Alt
    00596         }
    00597     },
    00598
    00599     /* CONVERT key */
    00600     {
    00601         VK_CONVERT,          // Base Vk
    00602         KBDNLS_TYPE_NORMAL,  // NLSFEProcType
    00603         KBDNLS_INDEX_NORMAL, // NLSFEProcCurrent
    00604         0x0,                 // NLSFEProcSwitch
    00605         {                    // NLSFEProc
    00606             {KBDNLS_SEND_BASE_VK,0},         // Base
    00607             {KBDNLS_SEND_BASE_VK,0},         // Shift
    00608             {KBDNLS_NOEVENT,0},              // Control
    00609             {KBDNLS_NOEVENT,0},              // Shift+Control
    00610             {KBDNLS_SEND_PARAM_VK,VK_KANJI}, // Alt
    00611             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERIMECONFIGMODE}, // Shift+Alt (LK411: Shift+Alt+NoConv -> IME config)
    00612             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERWORDREGISTERMODE}, // Control+Alt
    00613             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERWORDREGISTERMODE}  // Shift+Control+Alt
    00614         },
    00615         {                         // NLSFEProcIndexAlt
    00616             {KBDNLS_NULL,0},  // Base
    00617             {KBDNLS_NULL,0},  // Shift
    00618             {KBDNLS_NULL,0},  // Control
    00619             {KBDNLS_NULL,0},  // Shift+Control
    00620             {KBDNLS_NULL,0},  // Alt
    00621             {KBDNLS_NULL,0},  // Shift+Alt
    00622             {KBDNLS_NULL,0},  // Control+Alt
    00623             {KBDNLS_NULL,0}   // Shift+Control+Alt
    00624         }
    00625     },
    00626
    00627     /* NONE-CONVERT key */
    00628     {
    00629         VK_NONCONVERT,       // Base Vk
    00630         KBDNLS_TYPE_NORMAL,  // NLSFEProcType
    00631         KBDNLS_INDEX_NORMAL, // NLSFEProcCurrent
    00632         0x0,                 // NLSFEProcSwitch
    00633         {                    // NLSFEProc
    00634             {KBDNLS_SEND_BASE_VK,0},         // Base
    00635             {KBDNLS_NOEVENT,0},              // Shift
    00636             {KBDNLS_NOEVENT,0},              // Control
    00637             {KBDNLS_NOEVENT,0},              // Shift+Control
    00638             {KBDNLS_SBCSDBCS,0},             // Alt  (LK411: Alt+NoConv -> SBCS/DBCS)
    00639             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERIMECONFIGMODE}, // Shift+Alt (LK411: Shift+Alt+NoConv -> IME config)
    00640             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERWORDREGISTERMODE}, // Control+Alt
    00641             {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERWORDREGISTERMODE}  // Shift+Control+Alt
    00642         },
    00643         {                         // NLSFEProcIndexAlt
    00644             {KBDNLS_NULL,0},  // Base
    00645             {KBDNLS_NULL,0},  // Shift
    00646             {KBDNLS_NULL,0},  // Control
    00647             {KBDNLS_NULL,0},  // Shift+Control
    00648             {KBDNLS_NULL,0},  // Alt
    00649             {KBDNLS_NULL,0},  // Shift+Alt
    00650             {KBDNLS_NULL,0},  // Control+Alt
    00651             {KBDNLS_NULL,0}   // Shift+Control+Alt
    00652         }
    00653     }
    00654 };
    00655
    00656
    00657 /***********************************************************************\
    00658 * KbdNlsTables
    00659 *
    00660 \***********************************************************************/
    00661
    00662 static ALLOC_SECTION_LDATA KBDNLSTABLES KbdNlsTables = {
    00663     NLSKBD_OEM_DEC,                      // OEM ID
    00664     NLSKBD_INFO_EMURATE_101_KEYBOARD,    // Information
    00665     6,                                   // Number of VK_F entry
    00666     VkToFuncTable_LK411,                 // Pointer to VK_F array
    00667     0,                                   // Pointer to MouseVk entry
    00668     NULL                                 // Pointer to MouseVk array
    00669 };
    00670
    00671
    00672 PKBDNLSTABLES KbdNlsLayerDescriptor(VOID)
    00673 {
    00674     return &KbdNlsTables;
    00675 }
    00676
    00677 /* EOF */