36 else if ((Char > 31) && (Char < 128))
42 if (!AddZero) *
p++ =
'\'';
45 if ((Char ==
'\"') || (Char ==
'\'') || (Char ==
'\\')) *
p++ =
'\\';
51 if (!AddZero) *
p++ =
'\'';
64 else if (Char ==
'\n')
69 else if (Char ==
'\r')
120 if ((*
Name !=
'\\') || ((*(
Name + 1) !=
'x') && (*(
Name + 1) !=
'X')))
128 while ((*
Name ==
'\\') && ((*(
Name + 1) ==
'x') || (*(
Name + 1) ==
'X')))
155 printf(
"IDS Entries not yet handled!\n");
163 printf(
"Dead keys not yet handled\n");
184 printf(
"Dead keys not yet handled\n");
212 printf(
" %12s : can't open for write.\n", OutputFile);
218 "/****************************** Module Header ******************************\\\n"
219 "* Module Name: %s\n*\n* keyboard layout header\n"
221 "* Copyright (c) 2009, ReactOS Foundation\n"
223 "* Various defines for use by keyboard input code.\n*\n* History:\n"
225 "* created by KBDTOOL v%d.%02d %s*\n"
226 "\\***************************************************************************/\n\n",
235 " * kbd type should be controlled by cl command-line argument\n"
237 "#define KBD_TYPE 4\n\n"
239 "* Include the basis of all keyboard table values\n"
241 "#include \"kbd.h\"\n");
245 "/***************************************************************************\\\n"
246 "* The table below defines the virtual keys for various keyboard types where\n"
247 "* the keyboard differ from the US keyboard.\n"
249 "* _EQ() : all keyboard types have the same virtual key for this scancode\n"
250 "* _NE() : different virtual keys for this scancode, depending on kbd type\n"
252 "* +------+ +----------+----------+----------+----------+----------+----------+\n"
253 "* | Scan | | kbd | kbd | kbd | kbd | kbd | kbd |\n"
254 "* | code | | type 1 | type 2 | type 3 | type 4 | type 5 | type 6 |\n"
255 "\\****+-------+_+----------+----------+----------+----------+----------+----------+*/\n\n");
258 for (
i = 0;
i < 110;
i++)
261 if (Layout->Entry[
i].Processed)
264 if (Layout->Entry[
i].VirtualKey != Layout->Entry[
i].OriginalVirtualKey)
267 SubCode = Layout->Entry[
i].ScanCode & 0xFF00;
271 if (SubCode == 0xE000)
279 if (SubCode != 0xE100)
282 printf(
"Weird scancode value %04x: expected xx, E0xx, or E1xx\n", SubCode);
298 "#undef %c%02X\n#define %c%02X _EQ(%43s%23s\n",
300 Layout->Entry[
i].ScanCode,
302 Layout->Entry[
i].ScanCode,
322 CHAR InternalName[13];
327 PKEYNAME NextDescription, NextLanguage;
331 strcat(OutputFile,
".RC");
340 printf(
" %12s : can't open for write.\n", OutputFile);
363 "#include \"winver.h\"\r\n"
365 " FILEVERSION 1,0,%d,%d\r\n"
366 " PRODUCTVERSION 1,0,%d,%d\r\n"
367 " FILEFLAGSMASK 0x3fL\r\n"
368 " FILEFLAGS 0x0L\r\n"
369 "FILEOS 0x40004L\r\n"
370 " FILETYPE VFT_DLL\r\n"
371 " FILESUBTYPE VFT2_DRV_KEYBOARD\r\n"
373 " BLOCK \"StringFileInfo\"\r\n"
375 " BLOCK \"000004B0\"\r\n"
377 " VALUE \"CompanyName\", \"%s\\0\"\r\n"
378 " VALUE \"FileDescription\", \"%s Keyboard Layout\\0\"\r\n"
379 " VALUE \"FileVersion\", \"1, 0, %d, %d\\0\"\r\n",
391 " VALUE \"InternalName\", \"%s (%d.%d)\\0\"\r\n"
392 " VALUE \"ProductName\",\"%s\\0\"\r\n"
393 " VALUE \"Release Information\",\"%s\\0\"\r\n"
394 " VALUE \"LegalCopyright\", \"%s\\0\"\r\n"
395 " VALUE \"OriginalFilename\",\"%s\\0\"\r\n"
396 " VALUE \"ProductVersion\", \"1, 0, %d, %d\\0\"\r\n"
399 " BLOCK \"VarFileInfo\"\r\n"
401 " VALUE \"Translation\", 0x0000, 0x04B0\r\n"
407 "Created by ReactOS KbdTool",
408 "Created by ReactOS KbdTool",
420 "\r\nSTRINGTABLE DISCARDABLE\r\nLANGUAGE %d, %d\r\n",
442 while (DescriptionData)
445 NextDescription = DescriptionData->
Next;
449 "\r\nSTRINGTABLE DISCARDABLE\r\nLANGUAGE %d, %d\r\n",
450 DescriptionData->Code & 0x3FF,
451 DescriptionData->Code >> 10);
455 if (
strchr(DescriptionData->Name,
'\"'))
470 free(DescriptionData->Name);
471 free(DescriptionData);
474 DescriptionData = NextDescription;
481 NextLanguage = LanguageData->
Next;
485 "\r\nSTRINGTABLE DISCARDABLE\r\nLANGUAGE %d, %d\r\n",
486 LanguageData->Code & 0x3FF,
487 LanguageData->Code >> 10);
491 if (
strchr(LanguageData->Name,
'\"'))
506 free(LanguageData->Name);
510 LanguageData = NextLanguage;
526 strcat(OutputFile,
".DEF");
533 printf(
" %12s : can't open for write.\n", OutputFile);
541 " KbdLayerDescriptor @1\n",
561 CHAR KeyNameBuffer[50];
562 CHAR LineBuffer[256];
580 printf(
" %12s : can't open for write.\n", OutputFile);
586 "/***************************************************************************\\\n"
587 "* Module Name: %s\n*\n* keyboard layout\n"
589 "* Copyright (c) 2009, ReactOS Foundation\n"
592 "* KBDTOOL v%d.%02d - Created %s"
593 "\\***************************************************************************/\n\n",
609 "#include <windows.h>\n"
610 "#include \"kbd.h\"\n"
611 "#include \"%s.h\"\n\n",
620 "#pragma data_seg(\"%s\")\n#define ALLOC_SECTION_LDATA\n\n",
627 "#if defined(_M_IA64)\n"
628 "#pragma section(\"%s\")\n"
629 "#define ALLOC_SECTION_LDATA __declspec(allocate(\"%s\"))\n"
631 "#pragma data_seg(\"%s\")\n"
632 "#define ALLOC_SECTION_LDATA\n"
641 "/***************************************************************************\\\n"
642 "* ausVK[] - Virtual Scan Code to Virtual Key conversion table\n"
643 "\\***************************************************************************/\n\n");
647 "static ALLOC_SECTION_LDATA USHORT ausVK[] = {\n"
648 " T00, T01, T02, T03, T04, T05, T06, T07,\n"
649 " T08, T09, T0A, T0B, T0C, T0D, T0E, T0F,\n"
650 " T10, T11, T12, T13, T14, T15, T16, T17,\n"
651 " T18, T19, T1A, T1B, T1C, T1D, T1E, T1F,\n"
652 " T20, T21, T22, T23, T24, T25, T26, T27,\n"
653 " T28, T29, T2A, T2B, T2C, T2D, T2E, T2F,\n"
654 " T30, T31, T32, T33, T34, T35,\n\n");
659 " * Right-hand Shift key must have KBDEXT bit set.\n"
662 " T37 | KBDMULTIVK, // numpad_* + Shift/Alt -> SnapShot\n\n"
663 " T38, T39, T3A, T3B, T3C, T3D, T3E,\n"
664 " T3F, T40, T41, T42, T43, T44,\n\n");
670 " * KBDEXT - VK_NUMLOCK is an Extended key\n"
671 " * KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL)\n"
673 " T45 | KBDEXT | KBDMULTIVK,\n\n"
674 " T46 | KBDMULTIVK,\n\n");
679 " * Number Pad keys:\n"
680 " * KBDNUMPAD - digits 0-9 and decimal point.\n"
681 " * KBDSPECIAL - require special processing by Windows\n"
683 " T47 | KBDNUMPAD | KBDSPECIAL, // Numpad 7 (Home)\n"
684 " T48 | KBDNUMPAD | KBDSPECIAL, // Numpad 8 (Up),\n"
685 " T49 | KBDNUMPAD | KBDSPECIAL, // Numpad 9 (PgUp),\n"
687 " T4B | KBDNUMPAD | KBDSPECIAL, // Numpad 4 (Left),\n"
688 " T4C | KBDNUMPAD | KBDSPECIAL, // Numpad 5 (Clear),\n"
689 " T4D | KBDNUMPAD | KBDSPECIAL, // Numpad 6 (Right),\n"
691 " T4F | KBDNUMPAD | KBDSPECIAL, // Numpad 1 (End),\n"
692 " T50 | KBDNUMPAD | KBDSPECIAL, // Numpad 2 (Down),\n"
693 " T51 | KBDNUMPAD | KBDSPECIAL, // Numpad 3 (PgDn),\n"
694 " T52 | KBDNUMPAD | KBDSPECIAL, // Numpad 0 (Ins),\n"
695 " T53 | KBDNUMPAD | KBDSPECIAL, // Numpad . (Del),\n\n");
699 " T54, T55, T56, T57, T58, T59, T5A, T5B,\n"
700 " T5C, T5D, T5E, T5F, T60, T61, T62, T63,\n"
701 " T64, T65, T66, T67, T68, T69, T6A, T6B,\n"
702 " T6C, T6D, T6E, T6F, T70, T71, T72, T73,\n"
703 " T74, T75, T76, T77, T78, T79, T7A, T7B,\n"
711 for (
i = 0;
i < 110;
i++)
714 if ((Layout->Entry[
i].ScanCode & 0xFF00) == 0xE000)
717 if (Layout->Entry[
i].ScanCode != 0xFF)
720 if (Layout->Entry[
i].VirtualKey != 0xFF)
724 " { 0x%02X, X%02X | KBDEXT }, // %s\n",
725 Layout->Entry[
i].ScanCode,
726 Layout->Entry[
i].ScanCode,
727 Layout->Entry[
i].
Name);
740 for (
i = 0;
i < 110;
i++)
743 if ((Layout->Entry[
i].ScanCode & 0xFF00) == 0xE100)
746 if (Layout->Entry[
i].ScanCode != 0xFF)
749 if (Layout->Entry[
i].VirtualKey != 0xFF)
753 " { 0x%02X, Y%02X | KBDEXT }, // %s\n",
754 Layout->Entry[
i].ScanCode,
755 Layout->Entry[
i].ScanCode,
756 Layout->Entry[
i].
Name);
764 " { 0x1D, Y1D }, // Pause\n"
765 " { 0 , 0 }\n};\n\n");
769 "/***************************************************************************\\\n"
770 "* aVkToBits[] - map Virtual Keys to Modifier Bits\n"
772 "* See kbd.h for a full description.\n"
774 "* The keyboard has only three shifter keys:\n"
775 "* SHIFT (L & R) affects alphabnumeric keys,\n"
776 "* CTRL (L & R) is used to generate control characters\n"
777 "* ALT (L & R) used for generating characters by number with numpad\n"
778 "\\***************************************************************************/\n");
786 while (
Entry->VirtualKey)
790 " { %-12s, %-12s },\n",
803 "/***************************************************************************\\\n"
804 "* aModification[] - map character modifier bits to modification number\n"
806 "* See kbd.h for a full description.\n"
808 "\\***************************************************************************/\n\n");
811 for (
i = 0;
i < 8;
i++) States[
i] = -1;
814 for (HighestState = 1,
i = 0; (
i < 8) && (ShiftStates[
i] != -1);
i++)
817 States[ShiftStates[
i]] =
i;
818 if (ShiftStates[
i] > HighestState) HighestState = ShiftStates[
i];
823 "static ALLOC_SECTION_LDATA MODIFIERS CharModifiers = {\n"
827 " // Modification# // Keys Pressed\n"
828 " // ============= // =============\n",
832 for (
i = 0;
i <= HighestState;
i++)
843 if (
i == HighestState)
858 for (NeedPlus = 0,
j = 0,
k = 1; (1u <<
j) <=
i;
j++,
k = (1 <<
j))
897 "/***************************************************************************\\\n"
899 "* aVkToWch2[] - Virtual Key to WCHAR translation for 2 shift states\n"
900 "* aVkToWch3[] - Virtual Key to WCHAR translation for 3 shift states\n"
901 "* aVkToWch4[] - Virtual Key to WCHAR translation for 4 shift states\n");
904 for (
i = 5;
i < HighestState;
i++)
908 "* aVkToWch%d[] - Virtual Key to WCHAR translation for %d shift states\n",
916 "* Table attributes: Unordered Scan, null-terminated\n"
918 "* Search this table for an entry with a matching Virtual Key to find the\n"
919 "* corresponding unshifted and shifted WCHAR characters.\n"
921 "* Special values for VirtualKey (column 1)\n"
922 "* 0xff - dead chars for the previous entry\n"
923 "* 0 - terminate the list\n"
925 "* Special values for Attributes (column 2)\n"
926 "* CAPLOK bit - CAPS-LOCK affect this key like SHIFT\n"
928 "* Special values for wch[*] (column 3 & 4)\n"
929 "* WCH_NONE - No character\n"
930 "* WCH_DEAD - Dead Key (diaresis) or invalid (US keyboard has none)\n"
931 "* WCH_LGTR - Ligature (generates multiple characters)\n"
933 "\\***************************************************************************/\n\n");
936 for (
i = 2;
i <= StateCount;
i++)
942 for (
j = 0;
j < 110;
j++)
945 if (
i == Layout->Entry[
j].StateCount)
break;
951 "static ALLOC_SECTION_LDATA VK_TO_WCHARS%d aVkToWch%d[] = {\n"
970 for (
j = 0;
j < 110;
j++)
973 if (
i != Layout->Entry[
j].StateCount)
continue;
985 for (
k = 0;
k <
i;
k++)
991 printf(
"Dead key data not supported!\n");
996 if (Layout->Entry[
j].LigatureCharData[
k])
999 printf(
"Ligature key data not supported!\n");
1006 WChName(Layout->Entry[
j].CharData[
k], 0));
1009 if (*LineBuffer !=
'\0')
strcpy(LineBuffer,
"WCH_NONE ");
1016 if (*LineBuffer !=
'\0')
1024 if (Layout->Entry[
j].Cap != 2)
continue;
1027 printf(
"SGCAP not yet supported!\n");
1036 " {VK_TAB ,0 ,'\\t' ,'\\t' },\n"
1037 " {VK_ADD ,0 ,'+' ,'+' },\n"
1038 " {VK_DIVIDE ,0 ,'/' ,'/' },\n"
1039 " {VK_MULTIPLY ,0 ,'*' ,'*' },\n"
1040 " {VK_SUBTRACT ,0 ,'-' ,'-' },\n");
1053 "// Put this last so that VkKeyScan interprets number characters\n"
1054 "// as coming from the main section of the kbd (aVkToWch2 and\n"
1055 "// aVkToWch5) before considering the numpad (aVkToWch1).\n\n"
1056 "static ALLOC_SECTION_LDATA VK_TO_WCHARS1 aVkToWch1[] = {\n"
1057 " { VK_NUMPAD0 , 0 , '0' },\n"
1058 " { VK_NUMPAD1 , 0 , '1' },\n"
1059 " { VK_NUMPAD2 , 0 , '2' },\n"
1060 " { VK_NUMPAD3 , 0 , '3' },\n"
1061 " { VK_NUMPAD4 , 0 , '4' },\n"
1062 " { VK_NUMPAD5 , 0 , '5' },\n"
1063 " { VK_NUMPAD6 , 0 , '6' },\n"
1064 " { VK_NUMPAD7 , 0 , '7' },\n"
1065 " { VK_NUMPAD8 , 0 , '8' },\n"
1066 " { VK_NUMPAD9 , 0 , '9' },\n"
1067 " { 0 , 0 , '\\0' }\n"
1071 fprintf(
FileHandle,
"static ALLOC_SECTION_LDATA VK_TO_WCHAR_TABLE aVkToWcharTable[] = {\n");
1074 for (
i = 3;
i <= StateCount;
i++)
1078 " { (PVK_TO_WCHARS1)aVkToWch%d, %d, sizeof(aVkToWch%d[0]) },\n",
1086 " { (PVK_TO_WCHARS1)aVkToWch2, 2, sizeof(aVkToWch2[0]) },\n"
1087 " { (PVK_TO_WCHARS1)aVkToWch1, 1, sizeof(aVkToWch1[0]) },\n"
1088 " { NULL, 0, 0 },\n"
1093 "/***************************************************************************\\\n"
1094 "* aKeyNames[], aKeyNamesExt[] - Virtual Scancode to Key Name tables\n"
1096 "* Table attributes: Ordered Scan (by scancode), null-terminated\n"
1098 "* Only the names of Extended, NumPad, Dead and Non-Printable keys are here.\n"
1099 "* (Keys producing printable characters are named by that character)\n"
1100 "\\***************************************************************************/\n\n");
1119 fprintf(
FileHandle,
"static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNamesExt[] = {\n");
1129 if (KeyNameDeadData)
1132 printf(
"Dead key name data not supported!\n");
1140 printf(
"Dead key data not supported!\n");
1148 printf(
"Ligature key data not supported!\n");
1159 "ALLOC_SECTION_LDATA KBDTABLES KbdTables%s = {\n"
1161 " * Modifier keys\n"
1163 " &CharModifiers,\n\n"
1165 " * Characters tables\n"
1167 " aVkToWcharTable,\n\n"
1186 " * Names of Keys\n"
1210 if ((DeadKeyData) && (KeyNameDeadData))
1222 " * Scan codes to Virtual Keys\n"
1225 " sizeof(ausVK) / sizeof(ausVK[0]),\n"
1229 " * Locale-specific special processing\n"
1257 "PKBDTABLES KbdLayerDescriptor(VOID)\n"
1259 " return &KbdTables;\n"
1279 ULONG FailureCode = 0;
1292 if (!
kbd_rc(DescriptionData, LanguageData)) FailureCode = 2;
1296 if (!
kbd_c(StateCount,
1314 if (!
kbd_def()) FailureCode = 4;
char * strcat(char *DstString, const char *SrcString)
ACPI_SIZE strlen(const char *String)
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
char * strcpy(char *DstString, const char *SrcString)
char * strchr(const char *String, int ch)
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
#define sprintf(buf, format,...)
_In_ ULONG _In_ ULONG _In_ ULONG Length
BOOLEAN kbd_h(IN PLAYOUT Layout)
PCHAR WChName(IN ULONG Char, IN BOOLEAN AddZero)
BOOLEAN kbd_c(IN ULONG StateCount, IN PULONG ShiftStates, IN PVOID AttributeData, IN PLAYOUT Layout, IN PVOID DeadKeyData, IN PVOID LigatureData, IN PKEYNAME KeyNameData, IN PKEYNAME KeyNameExtData, IN PKEYNAME KeyNameDeadData)
BOOLEAN kbd_rc(IN PKEYNAME DescriptionData, IN PKEYNAME LanguageData)
ULONG gStringIdForDescriptions
ULONG DoOutput(IN ULONG StateCount, IN PULONG ShiftStates, IN PKEYNAME DescriptionData, IN PKEYNAME LanguageData, IN PVOID AttributeData, IN PVOID DeadKeyData, IN PVOID LigatureData, IN PKEYNAME KeyNameData, IN PKEYNAME KeyNameExtData, IN PKEYNAME KeyNameDeadData)
VOID PrintNameTable(FILE *FileHandle, PKEYNAME KeyName, BOOL DeadKey)
ULONG gStringIdForLocaleName
ULONG gStringIdForLanguageNames
_Check_return_ _CRTIMP char *__cdecl asctime(_In_ const struct tm *_Tm)
_CRTIMP struct tm *__cdecl localtime(const time_t *_Time)
size_t CDECL strftime(char *str, size_t max, const char *format, const struct tm *mstm)
base of all file and directory entries
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName