- Add support second keyboard layout
authorDmitry Chapyshev <dmitry@reactos.org>
Mon, 28 Apr 2008 14:04:22 +0000 (14:04 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Mon, 28 Apr 2008 14:04:22 +0000 (14:04 +0000)
- Update all translations

svn path=/trunk/; revision=33175

19 files changed:
reactos/base/setup/usetup/errorcode.h
reactos/base/setup/usetup/interface/usetup.c
reactos/base/setup/usetup/lang/bg-BG.h
reactos/base/setup/usetup/lang/cs-CZ.h
reactos/base/setup/usetup/lang/de-DE.h
reactos/base/setup/usetup/lang/el-GR.h
reactos/base/setup/usetup/lang/en-US.h
reactos/base/setup/usetup/lang/es-ES.h
reactos/base/setup/usetup/lang/fr-FR.h
reactos/base/setup/usetup/lang/it-IT.h
reactos/base/setup/usetup/lang/lt-LT.h
reactos/base/setup/usetup/lang/pl-PL.h
reactos/base/setup/usetup/lang/ru-RU.h
reactos/base/setup/usetup/lang/sk-SK.h
reactos/base/setup/usetup/lang/sv-SE.h
reactos/base/setup/usetup/lang/uk-UA.h
reactos/base/setup/usetup/mui.c
reactos/base/setup/usetup/mui.h
reactos/base/setup/usetup/settings.c

index e0d38fd..86aabad 100644 (file)
@@ -64,6 +64,7 @@ typedef enum
     ERROR_WRITE_PTABLE,
     ERROR_ADDING_CODEPAGE,
     ERROR_UPDATE_LOCALESETTINGS,
+    ERROR_ADDING_KBLAYOUTS,
 
     ERROR_LAST_ERROR_CODE
 }ERROR_NUMBER;
index b33dad3..271de79 100644 (file)
@@ -3188,6 +3188,14 @@ RegistryPage(PINPUT_RECORD Ir)
         return QUIT_PAGE;
     }
 
+    /* Add keyboard layouts */
+    CONSOLE_SetStatusText(MUIGetString(STRING_ADDKBLAYOUTS));
+    if (!AddKeyboardLayouts())
+    {
+        MUIDisplayError(ERROR_ADDING_KBLAYOUTS, Ir, POPUP_WAIT_ENTER);
+        return QUIT_PAGE;
+    }
+
     /* Update keyboard layout settings */
     CONSOLE_SetStatusText(MUIGetString(STRING_KEYBOARDSETTINGSUPDATE));
     if (!ProcessKeyboardLayoutRegistry(LayoutList))
index 65c195f..5b62625 100644 (file)
@@ -1470,6 +1470,11 @@ MUI_ERROR bgBGErrorEntries[] =
         "\8d¥ãᯥ譮 ãáâ ­®¢ï¢ ­¥ ­  ¬¥á⭨⥠­ áâனª¨.\n"
         "ENTER = \8f१ ¯ã᪠­¥ ­  ª®¬¯îâêà "
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1689,6 +1694,8 @@ MUI_STRING bgBGStrings[] =
     "\8c\81"},
     {STRING_GB,
     "\83\81"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index aba6178..feafea5 100644 (file)
@@ -1467,6 +1467,11 @@ MUI_ERROR csCZErrorEntries[] =
         "Nepodaýilo se nastavit m¡stn¡ nastaven¡.\n"
         "ENTER = Restartovat po\9f¡ta\9f"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1686,6 +1691,8 @@ MUI_STRING csCZStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index b792eda..5858a05 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR deDEErrorEntries[] =
         "Setup konnte die Systemsprache nicht einstellen.\n"
         "ENTER = Computer neustarten"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1680,6 +1685,8 @@ MUI_STRING deDEStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index aecf555..b4c0d45 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR elGRErrorEntries[] =
         "Setup could not set the system locale.\n"
         "ENTER = Reboot computer"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1680,6 +1685,8 @@ MUI_STRING elGRStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index 416cb0e..804d5db 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR enUSErrorEntries[] =
         "Setup could not set the system locale.\n"
         "ENTER = Reboot computer"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1680,6 +1685,8 @@ MUI_STRING enUSStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index 3f1297c..6d7a3d2 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR esESErrorEntries[] =
         "El instalador no pudo configurar el idioma del sistema.\n"
         "ENTER = Reiniciar el equipo"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1679,6 +1684,8 @@ MUI_STRING esESStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index ab23f1b..a4c3432 100644 (file)
@@ -1473,6 +1473,11 @@ MUI_ERROR frFRErrorEntries[] =
         "Setup n'a pu changer la langue syst\8ame.\n"
         "ENTER = Red\82marrer l'ordinateur"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1692,6 +1697,8 @@ MUI_STRING frFRStrings[] =
     "Mo"},
     {STRING_GB,
     "Go"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index c20b827..cd92ad2 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR itITErrorEntries[] =
         "Setup non ha potuto impostare la regionalizzazione del sistema.\n"
         "INVIO = Riavviare il computer"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1680,6 +1685,8 @@ MUI_STRING itITStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index cf26cab..42a5222 100644 (file)
@@ -1470,6 +1470,11 @@ MUI_ERROR ltLTErrorEntries[] =
         "Setup could not set the system locale.\n"
         "ENTER = Reboot computer"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1689,6 +1694,8 @@ MUI_STRING ltLTStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index 776e353..6320d48 100644 (file)
@@ -1468,6 +1468,11 @@ MUI_ERROR plPLErrorEntries[] =
         "Instalator nie m¢g\88 ustawi\86 wersji j©zykowej.\n"
         "ENTER = Restart komputera"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1687,6 +1692,8 @@ MUI_STRING plPLStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index c6e762e..90e8730 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR ruRUErrorEntries[] =
         "\8d¥ ã¤ «®áì ãáâ ­®¢¨âì «®ª «ì á¨á⥬ë.\n"
         "ENTER = \8f¥à¥§ £à㧪 "
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1680,6 +1685,8 @@ MUI_STRING ruRUStrings[] =
     "\8c\81"},
     {STRING_GB,
     "\83\81"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index 3c8d7a0..9ee58a9 100644 (file)
@@ -1468,6 +1468,11 @@ MUI_ERROR skSKErrorEntries[] =
         "Setup could not set the system locale.\n"
         "ENTER = Reçtart po\9f¡ta\9fa"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1687,6 +1692,8 @@ MUI_STRING skSKStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index 1b476e2..8a32d69 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR svSEErrorEntries[] =
         "Setup could not set the system locale.\n"
         "ENTER = Reboot computer"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1679,6 +1684,8 @@ MUI_STRING svSEStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index 5fd24b6..ffbb8ba 100644 (file)
@@ -1461,6 +1461,11 @@ MUI_ERROR ukUAErrorEntries[] =
         "Setup could not set the system locale.\n"
         "ENTER = Reboot computer"
     },
+    {
+        //ERROR_ADDING_KBLAYOUTS,
+        "Setup failed to add keyboard layouts to registry.\n"
+        "ENTER = Reboot computer"
+    },
     {
         NULL,
         NULL
@@ -1680,6 +1685,8 @@ MUI_STRING ukUAStrings[] =
     "MB"},
     {STRING_GB,
     "GB"},
+    {STRING_ADDKBLAYOUTS,
+    "Adding keyboard layouts"},
     {0, 0}
 };
 
index 53037cd..e1c7347 100644 (file)
 
 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
@@ -249,6 +249,132 @@ MUIGetString(ULONG Number)
     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)
 {
index df39c21..cbea4a5 100644 (file)
@@ -31,6 +31,7 @@ typedef struct
 {
     PWCHAR LanguageID;
     PWCHAR LanguageKeyboardLayoutID;
+    PWCHAR SecondLangKbLayoutID;
     PWCHAR ACPage;
     PWCHAR OEMCPage;
     PWCHAR MACCPage;
@@ -52,65 +53,69 @@ MUIDefaultKeyboardLayout(VOID);
 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
index 562d1da..47fb17b 100644 (file)
@@ -868,13 +868,14 @@ ProcessKeyboardLayoutRegistry(PGENERIC_LIST List)
 {
     PGENERIC_LIST_ENTRY Entry;
     PWCHAR LanguageId;
+    WCHAR CurrentLangId[8 + 1];
     OBJECT_ATTRIBUTES ObjectAttributes;
     UNICODE_STRING KeyName;
     UNICODE_STRING ValueName;
-    ULONG Disposition;
+    ULONG ResLength, Length;
     HANDLE KeyHandle;
     NTSTATUS Status;
-    WCHAR szKeyName[48] = L"\\Registry\\User\\.DEFAULT\\Keyboard Layout";       // 48 = "\Registry\User\.DEFAULT\Keyboard Layout\Preload" + NULL char
+    PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
 
     Entry = GetGenericListEntry(List);
     if (Entry == NULL)
@@ -884,8 +885,7 @@ ProcessKeyboardLayoutRegistry(PGENERIC_LIST List)
     if (LanguageId == NULL)
         return FALSE;
 
-    // First create the "Keyboard Layout" key
-    RtlInitUnicodeString(&KeyName, szKeyName);
+    RtlInitUnicodeString(&KeyName, L"\\Registry\\User\\.DEFAULT\\Keyboard Layout\\Preload");
 
     InitializeObjectAttributes(&ObjectAttributes,
                                &KeyName,
@@ -893,68 +893,92 @@ ProcessKeyboardLayoutRegistry(PGENERIC_LIST List)
                                NULL,
                                NULL);
 
-    Status =  NtCreateKey(&KeyHandle,
-                          KEY_ALL_ACCESS,
-                          &ObjectAttributes,
-                          0,
-                          NULL,
-                          0,
-                          &Disposition);
+    Status =  NtOpenKey(&KeyHandle,
+                        KEY_ALL_ACCESS,
+                        &ObjectAttributes);
 
-    if(NT_SUCCESS(Status))
-        NtClose(KeyHandle);
-    else
+    if(!NT_SUCCESS(Status))
     {
-        DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
+        DPRINT1("NtOpenKey() failed (Status %lx)\n", Status);
+        NtClose(KeyHandle);
         return FALSE;
     }
 
-    // Then create the "Preload" key
-    KeyName.MaximumLength = sizeof(szKeyName);
-    Status = RtlAppendUnicodeToString(&KeyName, L"\\Preload");
+    /* Get current keyboard layout */
+    RtlInitUnicodeString(&ValueName,
+                         L"1");
+
+    Length = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + (8 + 1) * sizeof(WCHAR);
 
-    if(!NT_SUCCESS(Status))
+    ValueInfo = (KEY_VALUE_PARTIAL_INFORMATION*) RtlAllocateHeap(RtlGetProcessHeap(),
+                                                                 0,
+                                                                 Length);
+
+    if (ValueInfo == NULL)
     {
-        DPRINT1("RtlAppend failed! (%lx)\n", Status);
-        DPRINT1("String is %wZ\n", &KeyName);
+        DPRINT("RtlAllocateHeap() failed\n");
+        NtClose(KeyHandle);
         return FALSE;
     }
 
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &KeyName,
-                               OBJ_CASE_INSENSITIVE,
-                               NULL,
-                               NULL);
-
-    Status = NtCreateKey(&KeyHandle,
-                         KEY_ALL_ACCESS,
-                         &ObjectAttributes,
-                         0,
-                         NULL,
-                         0,
-                         &Disposition);
-
+    Status = NtQueryValueKey(KeyHandle,
+                             &ValueName,
+                             KeyValuePartialInformation,
+                             ValueInfo,
+                             Length,
+                             &ResLength);
     if (!NT_SUCCESS(Status))
     {
-        DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
+        DPRINT1("NtQueryValueKey() failed (Status %lx)\n", Status);
+        NtClose(KeyHandle);
         return FALSE;
     }
 
-    /* Set default keyboard layout */
-    RtlInitUnicodeString(&ValueName,
-                         L"1");
+    RtlCopyMemory(CurrentLangId,
+                  ValueInfo->Data,
+                  (8 + 1) * sizeof(WCHAR));
 
-    Status = NtSetValueKey(KeyHandle,
-                           &ValueName,
-                           0,
-                           REG_SZ,
-                           (PVOID)LanguageId,
-                           (8 + 1) * sizeof(WCHAR));
-    if (!NT_SUCCESS(Status))
+    CurrentLangId[8 + 1] = 0;
+
+    RtlFreeHeap(RtlGetProcessHeap(),
+                0,
+                ValueInfo);
+
+    if (wcscmp(CurrentLangId, LanguageId) != 0)
     {
-        DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
-        NtClose(KeyHandle);
-        return FALSE;
+        RtlInitUnicodeString(&ValueName,
+                             L"1");
+
+        Status = NtSetValueKey(KeyHandle,
+                               &ValueName,
+                               0,
+                               REG_SZ,
+                               (PVOID)LanguageId,
+                               (8 + 1) * sizeof(WCHAR));
+
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
+            NtClose(KeyHandle);
+            return FALSE;
+        }
+
+        RtlInitUnicodeString(&ValueName,
+                             L"2");
+
+        Status = NtSetValueKey(KeyHandle,
+                               &ValueName,
+                               0,
+                               REG_SZ,
+                               (PVOID)CurrentLangId,
+                               (8 + 1) * sizeof(WCHAR));
+
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
+            NtClose(KeyHandle);
+            return FALSE;
+        }
     }
 
     NtClose(KeyHandle);