|
|
/* cmdkeyb.h - Keyboard layout support routines
* include file for CMDKEYB.C * * Modification History: * * YST 14-Jan_1993 Created */
#define DOSKEYBCODES "DOSKeybCodes" // section name in layout.inf
#define LAYOUT_FILE "\\LAYOUT.INF" // INF file name
#define DEFAULT_KB_ID "US" // Default keyboard ID
#define KEYBOARD_SYS "\\KEYBOARD.SYS" // Data file for KEYB.COM
#define US_CODE "00000409" // Code for US keyboard in REGISTER.INI
#define KEYB_COM "\\KB16.COM" // File name for keyboard program
#define KBDLAYOUT_PATH "System\\CurrentControlSet\\Control\\Keyboard Layout\\"
#define DOSCODES_PATH "DosKeybCodes"
#define DOSIDS_PATH "DosKeybIDs"
#define REG_STR_ALTKDF_FILES "AlternativeKDFs"
#define REG_STR_WOW "SYSTEM\\CurrentControlSet\\Control\\Wow"
#define KDF_SIGNATURE "\xFFKEYB "
#define LANGID_BUFFER_SIZE 20
#define KEYBOARDID_BUFFER_SIZE 20
#define KDF_AX "\\KEYAX.SYS" // AX standard keyboard
#define KDF_106 "\\KEY01.SYS" // 106 keys
#define KDF_IBM5576_02_03 "\\KEY02.SYS" // IBM 5576 002/003 keyboard
#define KDF_TOSHIBA_J3100 "\\KEYJ31.SYS" // Toshiba J3100 keyboard
//
// Dos KDF(Keyboard Definition File) format description:
//
// The file starts with a header(KDF_HEADER), followed
// by an array of KDF_LANGID_OFFSET and then by an array of
// KDF_KEYBOARDID_OFFSET. The KDF_LANGID_OFFSET array size is
// determined by KDF_HEADER.TotalLangIDs while the KDF_KEYBOARDID_OFFSET
// array size is determined by KDF_HEADER.TotalKeybIDs
//
// Each KDF_LANGID_OFFSET contains a file offset to its KDF_LANGID_ENTRY.
// Each KDF_LANGID_ENTRY is followed by an array of KDF_CODEPAGEID_OFFSET.
// The KDF_CODEPAGEID_OFFSET array size is determined by its assocated
// KDF_LANGID_ENTRY's TotalCodePageIDs.
//
// For a language ID with multiple keyboard IDs, Only one entry
// will be in the KDF_LANGID_OFFSET table. The rest of them are
// stored in the KDF_KEYBOARDID_OFFSET table.
//
// Each KDF_LANGID_ENTRY plus its code page table is enough
// to determine if a (language id, keyboard id, code page id) is
// support by the kdf file.
//
// KDF file header
//
// must pack the structures
#pragma pack(1)
typedef struct tagKDFHeader { CHAR Signature[8]; // signature, must be 0xFF"KEYB "
CHAR Reserved1[8]; WORD MaxCommXlatSize; // maximum common xlat section size
WORD MaxSpecialXlatSize; // maximum special xlat section size
WORD MaxStateLogicSize; // maximum state logic section size
WORD Reserved2; WORD TotalKeybIDs; // total keyboard ids defined in this file
WORD TotalLangIDs; // total language ids defined in this file
}KDF_HEADER, *PKDF_HEADER;
#define IS_LANGID_EQUAL(src, dst) (toupper(src[0]) == toupper(dst[0]) && \
toupper(src[1]) == toupper(dst[1]) ) //
//
//
typedef struct tagKDFLangIdOffset { CHAR ID[2]; // the id, "us" for U.S.A
DWORD DataOffset; // file offset to its KDF_LANGID_ENTRY
}KDF_LANGID_OFFSET, *PKDF_LANGID_OFFSET;
typedef struct tagKDFKeyboardIdOffset { WORD ID; // the id
DWORD DataOffset; // file offset to its KDF_LANGID_ENTRY
}KDF_KEYBOARDID_OFFSET, *PKDF_KEYBOARDID_OFFSET;
// A single lang id may associate with multiple keyboard ids and for each
// keyboard id, there is one KDF_LANGID_ENTRY allocated for it.
// The TotalKaybordIDs is tricky. Suppose the language id has <n> different
// keyboard ids, the <i>th KDF_LANGID_ENTRY's TotalKeyboardIDs contains
// the value of <n - i + 1>. As far as we are only interested in if
// the kdf supports a given (language id, keyboard id, code page id> combination
// we donot care how the value is set by simply following these steps:
// (1). Read the KDF_LANGID_OFFSET table and for each KDF_LANGID_OFFSET,
// compare the language id. If it matches, go get its KDF_LANGID_ENTRY
// and compare the primary keyboard id and all its code page. If
// the combination matches, we are done, otherwise, go to step 2.
// (2). Read KDF_KEYBOARDID_OFFSET table and for each KDF_KEYBOARDID_OFFSET,
// compare the keyboard id. If the keyboard id matches, go get its
// KDF_LANGID_ENTRY and compare the language id and code page against
// the KDF_LANGID_ENTRY. If both the language id and the code page id
// match, we are done, otherwise, goto step 3.
// (3). We conclude that this kdf does not meet the requirement.
//
typedef struct tagLangEntry { CHAR ID[2]; // the id
WORD PrimaryKeybId; // primary keyboard id
DWORD DataOffset; // file offset to state logic section
BYTE TotalKeyboardIDs; // total keyboard ids
BYTE TotalCodePageIDs; // total code pages
}KDF_LANGID_ENTRY, *PKDF_LANGID_ENTRY; //
// An array of supported KDF_CODEPAGEID_OFFSET immediately follow its
// KDF_LANGID_ENTRY. The size of the array is determined by
// KDF_LANGID_ENTRY.TotalCodePageIDs
typedef struct tagCodePageIdOffset { WORD ID; // the id
DWORD DataOffset; // file offset to the xlat section
}KDF_CODEPAGEID_OFFSET, *PKDF_CODEPAGEID_OFFSET;
#pragma pack()
BOOL LocateKDF( CHAR* LanguageID, WORD KeyboardID, WORD CodePageID, LPSTR Buffer, DWORD* BufferSize );
BOOL MatchKDF( CHAR* LanguageID, WORD KeyboardID, WORD CodePageID, LPCSTR KDFPath );
|