static const MUI_LANGUAGE LanguageList[] =
{
- /* Lang ID, DefKbdLayout,ANSI CP, OEM CP, MAC CP, Language Name, page strgs,error strings, other strings */
- {L"00000409", L"00000409", L"1252", L"437", L"10000", L"English", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000401", L"00000401", L"1256", L"720", L"10004", L"Arabic", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000402", L"00000402", L"1251", L"866", L"10007", L"Bulgarian", bgBGPages, bgBGErrorEntries, bgBGStrings },
- {L"00000403", L"00000403", L"1252", L"850", L"10000", L"Catalan", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000804", L"00000804", L"936", L"936", L"10008", L"Chinese (PRC)", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000405", L"00000405", L"1250", L"852", L"10029", L"Czech", csCZPages, csCZErrorEntries, csCZStrings },
- {L"00000406", L"00000406", L"1252", L"850", L"10000", L"Danish", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000407", L"00000407", L"1252", L"850", L"10000", L"Deutsch", deDEPages, deDEErrorEntries, deDEStrings },
- {L"00000413", L"00000813", L"1252", L"850", L"10000", L"Dutch", enUSPages, enUSErrorEntries, enUSStrings },
- {L"0000040B", L"0000040B", L"1252", L"850", L"10000", L"Finnish", enUSPages, enUSErrorEntries, enUSStrings },
- {L"0000040C", L"0000040C", L"1252", L"850", L"10000", L"French", frFRPages, frFRErrorEntries, frFRStrings },
- {L"00000408", L"00000408", L"1253", L"737", L"10006", L"Greek", elGRPages, elGRErrorEntries, elGRStrings },
- {L"0000040D", L"0000040D", L"1255", L"862", L"10005", L"Hebrew", enUSPages, enUSErrorEntries, enUSStrings },
- {L"0000040E", L"0000040E", L"1250", L"852", L"10029", L"Hungarian", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000410", L"00000410", L"1252", L"850", L"10000", L"Italian", itITPages, itITErrorEntries, itITStrings },
- {L"00000411", L"00000411", L"932", L"932", L"10001", L"Japanese", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000412", L"00000412", L"949", L"949", L"10003", L"Korean", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000427", L"00000427", L"1257", L"775", L"10029", L"Lithuanian", ltLTPages, ltLTErrorEntries, ltLTStrings },
- {L"00000414", L"00000414", L"1252", L"850", L"10000", L"Norwegian", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000419", L"00000419", L"1251", L"866", L"10007", L"Russkij", ruRUPages, ruRUErrorEntries, ruRUStrings },
- {L"0000041B", L"0000041B", L"1250", L"852", L"10029", L"Slovak", skSKPages, skSKErrorEntries, skSKStrings },
- {L"0000040A", L"0000040A", L"1252", L"850", L"10000", L"Spanish", esESPages, esESErrorEntries, esESStrings },
- {L"00000415", L"00000415", L"1250", L"852", L"10029", L"Polski", plPLPages, plPLErrorEntries, plPLStrings },
- {L"00000816", L"00000816", L"1252", L"850", L"10000", L"Portuguese", enUSPages, enUSErrorEntries, enUSStrings },
- {L"0000041D", L"0000041D", L"1252", L"850", L"10000", L"Swedish", svSEPages, svSEErrorEntries, svSEStrings },
- {L"0000041E", L"0000041E", L"874", L"874", L"10021", L"Thai", enUSPages, enUSErrorEntries, enUSStrings },
- {L"0000041F", L"0000041F", L"1254", L"857", L"10081", L"Turkish", enUSPages, enUSErrorEntries, enUSStrings },
- {L"00000422", L"00000422", L"1251", L"866", L"10017", L"Ukrainian", ukUAPages, ukUAErrorEntries, ukUAStrings },
- {NULL, NULL, NULL, NULL, NULL}
+ /* Lang ID, DefKbdLayout, SecKbLayout, ANSI CP, OEM CP, MAC CP, Language Name, page strgs,error strings, other strings */
+ {L"00000409", L"00000409", NULL, L"1252", L"437", L"10000", L"English", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000401", L"00000401", L"00000409", L"1256", L"720", L"10004", L"Arabic", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000402", L"00000402", L"00000409", L"1251", L"866", L"10007", L"Bulgarian", bgBGPages, bgBGErrorEntries, bgBGStrings },
+ {L"00000403", L"00000403", L"00000409", L"1252", L"850", L"10000", L"Catalan", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000804", L"00000804", L"00000409", L"936", L"936", L"10008", L"Chinese (PRC)", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000405", L"00000405", L"00000409", L"1250", L"852", L"10029", L"Czech", csCZPages, csCZErrorEntries, csCZStrings },
+ {L"00000406", L"00000406", L"00000409", L"1252", L"850", L"10000", L"Danish", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000407", L"00000407", L"00000409", L"1252", L"850", L"10000", L"Deutsch", deDEPages, deDEErrorEntries, deDEStrings },
+ {L"00000413", L"00000813", L"00000409", L"1252", L"850", L"10000", L"Dutch", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"0000040B", L"0000040B", L"00000409", L"1252", L"850", L"10000", L"Finnish", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"0000040C", L"0000040C", L"00000409", L"1252", L"850", L"10000", L"French", frFRPages, frFRErrorEntries, frFRStrings },
+ {L"00000408", L"00000408", L"00000409", L"1253", L"737", L"10006", L"Greek", elGRPages, elGRErrorEntries, elGRStrings },
+ {L"0000040D", L"0000040D", L"00000409", L"1255", L"862", L"10005", L"Hebrew", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"0000040E", L"0000040E", L"00000409", L"1250", L"852", L"10029", L"Hungarian", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000410", L"00000410", L"00000409", L"1252", L"850", L"10000", L"Italian", itITPages, itITErrorEntries, itITStrings },
+ {L"00000411", L"00000411", L"00000409", L"932", L"932", L"10001", L"Japanese", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000412", L"00000412", L"00000409", L"949", L"949", L"10003", L"Korean", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000427", L"00000427", L"00000409", L"1257", L"775", L"10029", L"Lithuanian", ltLTPages, ltLTErrorEntries, ltLTStrings },
+ {L"00000414", L"00000414", L"00000409", L"1252", L"850", L"10000", L"Norwegian", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000419", L"00000419", L"00000409", L"1251", L"866", L"10007", L"Russkij", ruRUPages, ruRUErrorEntries, ruRUStrings },
+ {L"0000041B", L"0000041B", L"00000409", L"1250", L"852", L"10029", L"Slovak", skSKPages, skSKErrorEntries, skSKStrings },
+ {L"0000040A", L"0000040A", L"00000409", L"1252", L"850", L"10000", L"Spanish", esESPages, esESErrorEntries, esESStrings },
+ {L"00000415", L"00000415", L"00000409", L"1250", L"852", L"10029", L"Polski", plPLPages, plPLErrorEntries, plPLStrings },
+ {L"00000816", L"00000816", L"00000409", L"1252", L"850", L"10000", L"Portuguese", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"0000041D", L"0000041D", L"00000409", L"1252", L"850", L"10000", L"Swedish", svSEPages, svSEErrorEntries, svSEStrings },
+ {L"0000041E", L"0000041E", L"00000409", L"874", L"874", L"10021", L"Thai", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"0000041F", L"0000041F", L"00000409", L"1254", L"857", L"10081", L"Turkish", enUSPages, enUSErrorEntries, enUSStrings },
+ {L"00000422", L"00000422", L"00000409", L"1251", L"866", L"10017", L"Ukrainian", ukUAPages, ukUAErrorEntries, ukUAStrings },
+ {NULL, NULL, NULL, NULL, NULL, NULL}
};
extern
return "<nostring>";
}
+static BOOLEAN
+AddKbLayoutsToRegistry(IN LPCWSTR DefKbLayout, IN LPCWSTR SecKbLayout)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING KeyName;
+ UNICODE_STRING ValueName;
+ HANDLE KeyHandle;
+ NTSTATUS Status;
+ ULONG Disposition;
+ WCHAR szKeyName[48] = L"\\Registry\\User\\.DEFAULT\\Keyboard Layout";
+
+ // Open the keyboard layout key
+ RtlInitUnicodeString(&KeyName,
+ szKeyName);
+ InitializeObjectAttributes(&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ Status = NtCreateKey(&KeyHandle,
+ KEY_ALL_ACCESS,
+ &ObjectAttributes,
+ 0,
+ NULL,
+ 0,
+ &Disposition);
+
+ if(NT_SUCCESS(Status))
+ NtClose(KeyHandle);
+ else
+ {
+ DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
+ return FALSE;
+ }
+
+ KeyName.MaximumLength = sizeof(szKeyName);
+ Status = RtlAppendUnicodeToString(&KeyName, L"\\Preload");
+
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("RtlAppend failed! (%lx)\n", Status);
+ DPRINT1("String is %wZ\n", &KeyName);
+ return FALSE;
+ }
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ Status = NtCreateKey(&KeyHandle,
+ KEY_ALL_ACCESS,
+ &ObjectAttributes,
+ 0,
+ NULL,
+ 0,
+ &Disposition);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
+ return FALSE;
+ }
+
+ /* Set def keyboard layout */
+ RtlInitUnicodeString(&ValueName,
+ L"1");
+
+ Status = NtSetValueKey(KeyHandle,
+ &ValueName,
+ 0,
+ REG_SZ,
+ (PVOID)DefKbLayout,
+ (8 + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
+ NtClose(KeyHandle);
+ return FALSE;
+ }
+
+ if (SecKbLayout != NULL)
+ {
+ /* Set second keyboard layout */
+ RtlInitUnicodeString(&ValueName,
+ L"2");
+
+ Status = NtSetValueKey(KeyHandle,
+ &ValueName,
+ 0,
+ REG_SZ,
+ (PVOID)SecKbLayout,
+ (8 + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
+ NtClose(KeyHandle);
+ return FALSE;
+ }
+ }
+
+ NtClose(KeyHandle);
+ return TRUE;
+}
+
+BOOLEAN
+AddKeyboardLayouts(VOID)
+{
+ ULONG lngIndex = 0;
+ do
+ {
+ if (_wcsicmp(LanguageList[lngIndex].LanguageID , SelectedLanguageId) == 0)
+ {
+ return AddKbLayoutsToRegistry(LanguageList[lngIndex].LanguageKeyboardLayoutID,
+ LanguageList[lngIndex].SecondLangKbLayoutID);
+ }
+
+ lngIndex++;
+ }
+ while (LanguageList[lngIndex].MuiPages != NULL);
+
+ return FALSE;
+}
+
static BOOLEAN
AddCodepageToRegistry(IN LPCWSTR ACPage, IN LPCWSTR OEMCPage, IN LPCWSTR MACCPage)
{
{
PWCHAR LanguageID;
PWCHAR LanguageKeyboardLayoutID;
+ PWCHAR SecondLangKbLayoutID;
PWCHAR ACPage;
PWCHAR OEMCPage;
PWCHAR MACCPage;
BOOLEAN
AddCodePage(VOID);
+BOOLEAN
+AddKeyboardLayouts(VOID);
+
VOID
SetConsoleCodePage(VOID);
LPSTR
MUIGetString(ULONG Number);
-#define STRING_PLEASEWAIT 1
-#define STRING_INSTALLCREATEPARTITION 2
-#define STRING_INSTALLDELETEPARTITION 3
-#define STRING_PARTITIONSIZE 4
-#define STRING_CHOOSENEWPARTITION 5
-#define STRING_HDDSIZE 6
-#define STRING_CREATEPARTITION 7
-#define STRING_PARTFORMAT 8
-#define STRING_NONFORMATTEDPART 9
-#define STRING_INSTALLONPART 10
-#define STRING_CHECKINGPART 11
-#define STRING_QUITCONTINUE 12
-#define STRING_REBOOTCOMPUTER 13
-#define STRING_TXTSETUPFAILED 14
-#define STRING_COPYING 15
-#define STRING_SETUPCOPYINGFILES 16
-#define STRING_PAGEDMEM 17
-#define STRING_NONPAGEDMEM 18
-#define STRING_FREEMEM 19
-#define STRING_REGHIVEUPDATE 20
-#define STRING_IMPORTFILE 21
-#define STRING_DISPLAYETTINGSUPDATE 22
-#define STRING_LOCALESETTINGSUPDATE 23
-#define STRING_KEYBOARDSETTINGSUPDATE 24
-#define STRING_CODEPAGEINFOUPDATE 25
-#define STRING_DONE 26
-#define STRING_REBOOTCOMPUTER2 27
-#define STRING_CONSOLEFAIL1 28
-#define STRING_CONSOLEFAIL2 29
-#define STRING_CONSOLEFAIL3 30
-#define STRING_FORMATTINGDISK 31
-#define STRING_CHECKINGDISK 32
-#define STRING_FORMATDISK1 33
-#define STRING_FORMATDISK2 34
-#define STRING_KEEPFORMAT 35
-#define STRING_HDINFOPARTCREATE 36
-#define STRING_HDDINFOUNK1 37
-#define STRING_HDDINFOUNK2 38
-#define STRING_HDINFOPARTDELETE 39
-#define STRING_HDDINFOUNK3 40
-#define STRING_HDINFOPARTZEROED 41
-#define STRING_HDDINFOUNK4 42
-#define STRING_HDINFOPARTEXISTS 43
-#define STRING_HDDINFOUNK5 44
-#define STRING_HDINFOPARTSELECT 45
-#define STRING_HDDINFOUNK6 46
-#define STRING_NEWPARTITION 47
-#define STRING_UNPSPACE 48
-#define STRING_MAXSIZE 49
-#define STRING_UNFORMATTED 50
-#define STRING_FORMATUNUSED 51
-#define STRING_FORMATUNKNOWN 52
-#define STRING_KB 53
-#define STRING_MB 54
-#define STRING_GB 55
+#define STRING_PLEASEWAIT 1
+#define STRING_INSTALLCREATEPARTITION 2
+#define STRING_INSTALLDELETEPARTITION 3
+#define STRING_PARTITIONSIZE 4
+#define STRING_CHOOSENEWPARTITION 5
+#define STRING_HDDSIZE 6
+#define STRING_CREATEPARTITION 7
+#define STRING_PARTFORMAT 8
+#define STRING_NONFORMATTEDPART 9
+#define STRING_INSTALLONPART 10
+#define STRING_CHECKINGPART 11
+#define STRING_QUITCONTINUE 12
+#define STRING_REBOOTCOMPUTER 13
+#define STRING_TXTSETUPFAILED 14
+#define STRING_COPYING 15
+#define STRING_SETUPCOPYINGFILES 16
+#define STRING_PAGEDMEM 17
+#define STRING_NONPAGEDMEM 18
+#define STRING_FREEMEM 19
+#define STRING_REGHIVEUPDATE 20
+#define STRING_IMPORTFILE 21
+#define STRING_DISPLAYETTINGSUPDATE 22
+#define STRING_LOCALESETTINGSUPDATE 23
+#define STRING_KEYBOARDSETTINGSUPDATE 24
+#define STRING_CODEPAGEINFOUPDATE 25
+#define STRING_DONE 26
+#define STRING_REBOOTCOMPUTER2 27
+#define STRING_CONSOLEFAIL1 28
+#define STRING_CONSOLEFAIL2 29
+#define STRING_CONSOLEFAIL3 30
+#define STRING_FORMATTINGDISK 31
+#define STRING_CHECKINGDISK 32
+#define STRING_FORMATDISK1 33
+#define STRING_FORMATDISK2 34
+#define STRING_KEEPFORMAT 35
+#define STRING_HDINFOPARTCREATE 36
+#define STRING_HDDINFOUNK1 37
+#define STRING_HDDINFOUNK2 38
+#define STRING_HDINFOPARTDELETE 39
+#define STRING_HDDINFOUNK3 40
+#define STRING_HDINFOPARTZEROED 41
+#define STRING_HDDINFOUNK4 42
+#define STRING_HDINFOPARTEXISTS 43
+#define STRING_HDDINFOUNK5 44
+#define STRING_HDINFOPARTSELECT 45
+#define STRING_HDDINFOUNK6 46
+#define STRING_NEWPARTITION 47
+#define STRING_UNPSPACE 48
+#define STRING_MAXSIZE 49
+#define STRING_UNFORMATTED 50
+#define STRING_FORMATUNUSED 51
+#define STRING_FORMATUNKNOWN 52
+#define STRING_KB 53
+#define STRING_MB 54
+#define STRING_GB 55
+#define STRING_ADDKBLAYOUTS 56
#endif