1e405ad25SHermès Bélusca-Maïto /*
2e405ad25SHermès Bélusca-Maïto * ReactOS kernel
3e405ad25SHermès Bélusca-Maïto * Copyright (C) 2008 ReactOS Team
4e405ad25SHermès Bélusca-Maïto *
5e405ad25SHermès Bélusca-Maïto * This program is free software; you can redistribute it and/or modify
6e405ad25SHermès Bélusca-Maïto * it under the terms of the GNU General Public License as published by
7e405ad25SHermès Bélusca-Maïto * the Free Software Foundation; either version 2 of the License, or
8e405ad25SHermès Bélusca-Maïto * (at your option) any later version.
9e405ad25SHermès Bélusca-Maïto *
10e405ad25SHermès Bélusca-Maïto * This program is distributed in the hope that it will be useful,
11e405ad25SHermès Bélusca-Maïto * but WITHOUT ANY WARRANTY; without even the implied warranty of
12e405ad25SHermès Bélusca-Maïto * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13e405ad25SHermès Bélusca-Maïto * GNU General Public License for more details.
14e405ad25SHermès Bélusca-Maïto *
15e405ad25SHermès Bélusca-Maïto * You should have received a copy of the GNU General Public License along
16e405ad25SHermès Bélusca-Maïto * with this program; if not, write to the Free Software Foundation, Inc.,
17e405ad25SHermès Bélusca-Maïto * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18e405ad25SHermès Bélusca-Maïto */
19e405ad25SHermès Bélusca-Maïto /*
20e405ad25SHermès Bélusca-Maïto * COPYRIGHT: See COPYING in the top level directory
21e405ad25SHermès Bélusca-Maïto * PROJECT: ReactOS text-mode setup
22e405ad25SHermès Bélusca-Maïto * FILE: base/setup/usetup/mui.c
23e405ad25SHermès Bélusca-Maïto * PURPOSE: Text-mode setup
24e405ad25SHermès Bélusca-Maïto * PROGRAMMER:
25e405ad25SHermès Bélusca-Maïto */
26e405ad25SHermès Bélusca-Maïto
27e405ad25SHermès Bélusca-Maïto /* INCLUDES *****************************************************************/
28e405ad25SHermès Bélusca-Maïto
29e405ad25SHermès Bélusca-Maïto #include "precomp.h"
30e405ad25SHermès Bélusca-Maïto #include "mui.h"
31e405ad25SHermès Bélusca-Maïto #include "muifonts.h"
32e405ad25SHermès Bélusca-Maïto #include "muilanguages.h"
33e405ad25SHermès Bélusca-Maïto #include "registry.h"
34b539dd1cSKatayama Hirofumi MZ #include "substset.h"
35e405ad25SHermès Bélusca-Maïto
36e405ad25SHermès Bélusca-Maïto #define NDEBUG
37e405ad25SHermès Bélusca-Maïto #include <debug.h>
38e405ad25SHermès Bélusca-Maïto
39e405ad25SHermès Bélusca-Maïto
40e405ad25SHermès Bélusca-Maïto /* FUNCTIONS ****************************************************************/
41e405ad25SHermès Bélusca-Maïto
42e405ad25SHermès Bélusca-Maïto static
43e405ad25SHermès Bélusca-Maïto ULONG
FindLanguageIndex(IN PCWSTR LanguageId)44e405ad25SHermès Bélusca-Maïto FindLanguageIndex(
45e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
46e405ad25SHermès Bélusca-Maïto {
47e405ad25SHermès Bélusca-Maïto ULONG lngIndex = 0;
48e405ad25SHermès Bélusca-Maïto
49e405ad25SHermès Bélusca-Maïto if (LanguageId == NULL)
50e405ad25SHermès Bélusca-Maïto {
51e405ad25SHermès Bélusca-Maïto /* Default to en-US */
52e405ad25SHermès Bélusca-Maïto // return 0; // FIXME!!
53e405ad25SHermès Bélusca-Maïto LanguageId = L"00000409";
54e405ad25SHermès Bélusca-Maïto }
55e405ad25SHermès Bélusca-Maïto
56e405ad25SHermès Bélusca-Maïto while (MUILanguageList[lngIndex].LanguageID != NULL)
57e405ad25SHermès Bélusca-Maïto {
58e405ad25SHermès Bélusca-Maïto if (_wcsicmp(MUILanguageList[lngIndex].LanguageID, LanguageId) == 0)
59e405ad25SHermès Bélusca-Maïto {
60e405ad25SHermès Bélusca-Maïto return lngIndex;
61e405ad25SHermès Bélusca-Maïto }
62e405ad25SHermès Bélusca-Maïto
63e405ad25SHermès Bélusca-Maïto lngIndex++;
64e405ad25SHermès Bélusca-Maïto }
65e405ad25SHermès Bélusca-Maïto
66e405ad25SHermès Bélusca-Maïto return 0;
67e405ad25SHermès Bélusca-Maïto }
68e405ad25SHermès Bélusca-Maïto
69e405ad25SHermès Bélusca-Maïto BOOLEAN
IsLanguageAvailable(IN PCWSTR LanguageId)70e405ad25SHermès Bélusca-Maïto IsLanguageAvailable(
71e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
72e405ad25SHermès Bélusca-Maïto {
73e405ad25SHermès Bélusca-Maïto ULONG lngIndex = 0;
74e405ad25SHermès Bélusca-Maïto
75e405ad25SHermès Bélusca-Maïto while (MUILanguageList[lngIndex].LanguageID != NULL)
76e405ad25SHermès Bélusca-Maïto {
77e405ad25SHermès Bélusca-Maïto if (_wcsicmp(MUILanguageList[lngIndex].LanguageID, LanguageId) == 0)
78e405ad25SHermès Bélusca-Maïto return TRUE;
79e405ad25SHermès Bélusca-Maïto
80e405ad25SHermès Bélusca-Maïto lngIndex++;
81e405ad25SHermès Bélusca-Maïto }
82e405ad25SHermès Bélusca-Maïto
83e405ad25SHermès Bélusca-Maïto return FALSE;
84e405ad25SHermès Bélusca-Maïto }
85e405ad25SHermès Bélusca-Maïto
86e405ad25SHermès Bélusca-Maïto
87f0a1d766SHermès Bélusca-Maïto KLID
MUIDefaultKeyboardLayout(IN PCWSTR LanguageId)88e405ad25SHermès Bélusca-Maïto MUIDefaultKeyboardLayout(
89e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
90e405ad25SHermès Bélusca-Maïto {
91f0a1d766SHermès Bélusca-Maïto ULONG lngIndex = FindLanguageIndex(LanguageId);
92e405ad25SHermès Bélusca-Maïto return MUILanguageList[lngIndex].MuiLayouts[0].LayoutID;
93e405ad25SHermès Bélusca-Maïto }
94e405ad25SHermès Bélusca-Maïto
95c26a2e89SHermès Bélusca-Maïto UINT
MUIGetOEMCodePage(IN PCWSTR LanguageId)96e405ad25SHermès Bélusca-Maïto MUIGetOEMCodePage(
97e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
98e405ad25SHermès Bélusca-Maïto {
99f0a1d766SHermès Bélusca-Maïto ULONG lngIndex = FindLanguageIndex(LanguageId);
100e405ad25SHermès Bélusca-Maïto return MUILanguageList[lngIndex].OEMCPage;
101e405ad25SHermès Bélusca-Maïto }
102e405ad25SHermès Bélusca-Maïto
103*88891d2cSHermès Bélusca-Maïto GEOID
MUIGetGeoID(IN PCWSTR LanguageId)104e405ad25SHermès Bélusca-Maïto MUIGetGeoID(
105e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
106e405ad25SHermès Bélusca-Maïto {
107f0a1d766SHermès Bélusca-Maïto ULONG lngIndex = FindLanguageIndex(LanguageId);
108e405ad25SHermès Bélusca-Maïto return MUILanguageList[lngIndex].GeoID;
109e405ad25SHermès Bélusca-Maïto }
110e405ad25SHermès Bélusca-Maïto
111e405ad25SHermès Bélusca-Maïto const MUI_LAYOUTS*
MUIGetLayoutsList(IN PCWSTR LanguageId)112e405ad25SHermès Bélusca-Maïto MUIGetLayoutsList(
113e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
114e405ad25SHermès Bélusca-Maïto {
115f0a1d766SHermès Bélusca-Maïto ULONG lngIndex = FindLanguageIndex(LanguageId);
116e405ad25SHermès Bélusca-Maïto return MUILanguageList[lngIndex].MuiLayouts;
117e405ad25SHermès Bélusca-Maïto }
118e405ad25SHermès Bélusca-Maïto
119e405ad25SHermès Bélusca-Maïto
120e405ad25SHermès Bélusca-Maïto static
121e405ad25SHermès Bélusca-Maïto BOOLEAN
AddHotkeySettings(IN PCWSTR Hotkey,IN PCWSTR LangHotkey,IN PCWSTR LayoutHotkey)122e405ad25SHermès Bélusca-Maïto AddHotkeySettings(
123e405ad25SHermès Bélusca-Maïto IN PCWSTR Hotkey,
124e405ad25SHermès Bélusca-Maïto IN PCWSTR LangHotkey,
125e405ad25SHermès Bélusca-Maïto IN PCWSTR LayoutHotkey)
126e405ad25SHermès Bélusca-Maïto {
127e405ad25SHermès Bélusca-Maïto OBJECT_ATTRIBUTES ObjectAttributes;
128e405ad25SHermès Bélusca-Maïto UNICODE_STRING KeyName;
129e405ad25SHermès Bélusca-Maïto UNICODE_STRING ValueName;
130e405ad25SHermès Bélusca-Maïto HANDLE KeyHandle;
131e405ad25SHermès Bélusca-Maïto ULONG Disposition;
132e405ad25SHermès Bélusca-Maïto NTSTATUS Status;
133e405ad25SHermès Bélusca-Maïto
134e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&KeyName,
135e405ad25SHermès Bélusca-Maïto L".DEFAULT\\Keyboard Layout\\Toggle");
136e405ad25SHermès Bélusca-Maïto InitializeObjectAttributes(&ObjectAttributes,
137e405ad25SHermès Bélusca-Maïto &KeyName,
138e405ad25SHermès Bélusca-Maïto OBJ_CASE_INSENSITIVE,
139e405ad25SHermès Bélusca-Maïto GetRootKeyByPredefKey(HKEY_USERS, NULL),
140e405ad25SHermès Bélusca-Maïto NULL);
141e405ad25SHermès Bélusca-Maïto
142e405ad25SHermès Bélusca-Maïto Status = NtCreateKey(&KeyHandle,
143e405ad25SHermès Bélusca-Maïto KEY_SET_VALUE,
144e405ad25SHermès Bélusca-Maïto &ObjectAttributes,
145e405ad25SHermès Bélusca-Maïto 0,
146e405ad25SHermès Bélusca-Maïto NULL,
147e405ad25SHermès Bélusca-Maïto REG_OPTION_NON_VOLATILE,
148e405ad25SHermès Bélusca-Maïto &Disposition);
149e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
150e405ad25SHermès Bélusca-Maïto {
151e405ad25SHermès Bélusca-Maïto DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
152e405ad25SHermès Bélusca-Maïto return FALSE;
153e405ad25SHermès Bélusca-Maïto }
154e405ad25SHermès Bélusca-Maïto
155e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&ValueName,
156e405ad25SHermès Bélusca-Maïto L"Hotkey");
157e405ad25SHermès Bélusca-Maïto
158e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
159e405ad25SHermès Bélusca-Maïto &ValueName,
160e405ad25SHermès Bélusca-Maïto 0,
161e405ad25SHermès Bélusca-Maïto REG_SZ,
162e405ad25SHermès Bélusca-Maïto (PVOID)Hotkey,
163e405ad25SHermès Bélusca-Maïto (1 + 1) * sizeof(WCHAR));
164e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
165e405ad25SHermès Bélusca-Maïto {
166e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
167e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
168e405ad25SHermès Bélusca-Maïto return FALSE;
169e405ad25SHermès Bélusca-Maïto }
170e405ad25SHermès Bélusca-Maïto
171e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&ValueName,
172e405ad25SHermès Bélusca-Maïto L"Language Hotkey");
173e405ad25SHermès Bélusca-Maïto
174e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
175e405ad25SHermès Bélusca-Maïto &ValueName,
176e405ad25SHermès Bélusca-Maïto 0,
177e405ad25SHermès Bélusca-Maïto REG_SZ,
178e405ad25SHermès Bélusca-Maïto (PVOID)LangHotkey,
179e405ad25SHermès Bélusca-Maïto (1 + 1) * sizeof(WCHAR));
180e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
181e405ad25SHermès Bélusca-Maïto {
182e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
183e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
184e405ad25SHermès Bélusca-Maïto return FALSE;
185e405ad25SHermès Bélusca-Maïto }
186e405ad25SHermès Bélusca-Maïto
187e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&ValueName,
188e405ad25SHermès Bélusca-Maïto L"Layout Hotkey");
189e405ad25SHermès Bélusca-Maïto
190e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
191e405ad25SHermès Bélusca-Maïto &ValueName,
192e405ad25SHermès Bélusca-Maïto 0,
193e405ad25SHermès Bélusca-Maïto REG_SZ,
194e405ad25SHermès Bélusca-Maïto (PVOID)LayoutHotkey,
195e405ad25SHermès Bélusca-Maïto (1 + 1) * sizeof(WCHAR));
196e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
197e405ad25SHermès Bélusca-Maïto {
198e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
199e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
200e405ad25SHermès Bélusca-Maïto return FALSE;
201e405ad25SHermès Bélusca-Maïto }
202e405ad25SHermès Bélusca-Maïto
203e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
204e405ad25SHermès Bélusca-Maïto return TRUE;
205e405ad25SHermès Bélusca-Maïto }
206e405ad25SHermès Bélusca-Maïto
207e405ad25SHermès Bélusca-Maïto BOOLEAN
AddKbLayoutsToRegistry(_In_ const MUI_LAYOUTS * MuiLayouts)208e405ad25SHermès Bélusca-Maïto AddKbLayoutsToRegistry(
209f0a1d766SHermès Bélusca-Maïto _In_ const MUI_LAYOUTS* MuiLayouts)
210e405ad25SHermès Bélusca-Maïto {
211e405ad25SHermès Bélusca-Maïto OBJECT_ATTRIBUTES ObjectAttributes;
212e405ad25SHermès Bélusca-Maïto UNICODE_STRING KeyName;
213e405ad25SHermès Bélusca-Maïto UNICODE_STRING ValueName;
214e405ad25SHermès Bélusca-Maïto HANDLE KeyHandle;
215e405ad25SHermès Bélusca-Maïto HANDLE SubKeyHandle;
216e405ad25SHermès Bélusca-Maïto NTSTATUS Status;
217e405ad25SHermès Bélusca-Maïto ULONG Disposition;
218f0a1d766SHermès Bélusca-Maïto ULONG uIndex;
219f0a1d766SHermès Bélusca-Maïto ULONG uCount;
220e405ad25SHermès Bélusca-Maïto WCHAR szKeyName[48] = L".DEFAULT\\Keyboard Layout";
221e405ad25SHermès Bélusca-Maïto WCHAR szValueName[3 + 1];
222f0a1d766SHermès Bélusca-Maïto WCHAR szSubstID[8 + 1];
223f0a1d766SHermès Bélusca-Maïto WCHAR szLayoutID[8 + 1];
224e405ad25SHermès Bélusca-Maïto
225f0a1d766SHermès Bélusca-Maïto /* Open the keyboard layout key */
226e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&KeyName, szKeyName);
227e405ad25SHermès Bélusca-Maïto InitializeObjectAttributes(&ObjectAttributes,
228e405ad25SHermès Bélusca-Maïto &KeyName,
229e405ad25SHermès Bélusca-Maïto OBJ_CASE_INSENSITIVE,
230e405ad25SHermès Bélusca-Maïto GetRootKeyByPredefKey(HKEY_USERS, NULL),
231e405ad25SHermès Bélusca-Maïto NULL);
232e405ad25SHermès Bélusca-Maïto
233e405ad25SHermès Bélusca-Maïto Status = NtCreateKey(&KeyHandle,
234e405ad25SHermès Bélusca-Maïto KEY_CREATE_SUB_KEY,
235e405ad25SHermès Bélusca-Maïto &ObjectAttributes,
236e405ad25SHermès Bélusca-Maïto 0,
237e405ad25SHermès Bélusca-Maïto NULL,
238e405ad25SHermès Bélusca-Maïto REG_OPTION_NON_VOLATILE,
239e405ad25SHermès Bélusca-Maïto &Disposition);
240e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
241e405ad25SHermès Bélusca-Maïto {
242e405ad25SHermès Bélusca-Maïto DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
243e405ad25SHermès Bélusca-Maïto return FALSE;
244e405ad25SHermès Bélusca-Maïto }
245e405ad25SHermès Bélusca-Maïto
246e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
247e405ad25SHermès Bélusca-Maïto
248e405ad25SHermès Bélusca-Maïto KeyName.MaximumLength = sizeof(szKeyName);
249e405ad25SHermès Bélusca-Maïto Status = RtlAppendUnicodeToString(&KeyName, L"\\Preload");
250e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
251e405ad25SHermès Bélusca-Maïto {
252f0a1d766SHermès Bélusca-Maïto DPRINT1("RtlAppend() failed (%lx), string is '%wZ'\n", Status, &KeyName);
253e405ad25SHermès Bélusca-Maïto return FALSE;
254e405ad25SHermès Bélusca-Maïto }
255e405ad25SHermès Bélusca-Maïto
256e405ad25SHermès Bélusca-Maïto InitializeObjectAttributes(&ObjectAttributes,
257e405ad25SHermès Bélusca-Maïto &KeyName,
258e405ad25SHermès Bélusca-Maïto OBJ_CASE_INSENSITIVE,
259e405ad25SHermès Bélusca-Maïto GetRootKeyByPredefKey(HKEY_USERS, NULL),
260e405ad25SHermès Bélusca-Maïto NULL);
261e405ad25SHermès Bélusca-Maïto
262e405ad25SHermès Bélusca-Maïto Status = NtCreateKey(&KeyHandle,
263e405ad25SHermès Bélusca-Maïto KEY_SET_VALUE,
264e405ad25SHermès Bélusca-Maïto &ObjectAttributes,
265e405ad25SHermès Bélusca-Maïto 0,
266e405ad25SHermès Bélusca-Maïto NULL,
267e405ad25SHermès Bélusca-Maïto REG_OPTION_NON_VOLATILE,
268e405ad25SHermès Bélusca-Maïto &Disposition);
269e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
270e405ad25SHermès Bélusca-Maïto {
271e405ad25SHermès Bélusca-Maïto DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
272e405ad25SHermès Bélusca-Maïto return FALSE;
273e405ad25SHermès Bélusca-Maïto }
274e405ad25SHermès Bélusca-Maïto
275e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&KeyName, L".DEFAULT\\Keyboard Layout\\Substitutes");
276e405ad25SHermès Bélusca-Maïto InitializeObjectAttributes(&ObjectAttributes,
277e405ad25SHermès Bélusca-Maïto &KeyName,
278e405ad25SHermès Bélusca-Maïto OBJ_CASE_INSENSITIVE,
279e405ad25SHermès Bélusca-Maïto GetRootKeyByPredefKey(HKEY_USERS, NULL),
280e405ad25SHermès Bélusca-Maïto NULL);
281e405ad25SHermès Bélusca-Maïto
282e405ad25SHermès Bélusca-Maïto Status = NtCreateKey(&SubKeyHandle,
283e405ad25SHermès Bélusca-Maïto KEY_SET_VALUE,
284e405ad25SHermès Bélusca-Maïto &ObjectAttributes,
285e405ad25SHermès Bélusca-Maïto 0,
286e405ad25SHermès Bélusca-Maïto NULL,
287e405ad25SHermès Bélusca-Maïto REG_OPTION_NON_VOLATILE,
288e405ad25SHermès Bélusca-Maïto &Disposition);
289e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
290e405ad25SHermès Bélusca-Maïto {
291e405ad25SHermès Bélusca-Maïto DPRINT1("NtCreateKey() failed (Status %lx)\n", Status);
292f0a1d766SHermès Bélusca-Maïto goto Quit;
293e405ad25SHermès Bélusca-Maïto }
294e405ad25SHermès Bélusca-Maïto
295f0a1d766SHermès Bélusca-Maïto uCount = 0;
296f0a1d766SHermès Bélusca-Maïto for (uIndex = 0; (uIndex <= 19) && (MuiLayouts[uIndex].LangID != 0); ++uIndex)
297e405ad25SHermès Bélusca-Maïto {
298f0a1d766SHermès Bélusca-Maïto RtlStringCchPrintfW(szValueName, _countof(szValueName), L"%u", uIndex + 1);
299e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&ValueName, szValueName);
300e405ad25SHermès Bélusca-Maïto
301f0a1d766SHermès Bélusca-Maïto RtlStringCchPrintfW(szLayoutID, _countof(szLayoutID), L"%08lx", MuiLayouts[uIndex].LayoutID);
302e405ad25SHermès Bélusca-Maïto
303f0a1d766SHermès Bélusca-Maïto if ((KLID)MuiLayouts[uIndex].LangID == MuiLayouts[uIndex].LayoutID)
304e405ad25SHermès Bélusca-Maïto {
305f0a1d766SHermès Bélusca-Maïto /* Main keyboard layout */
306e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
307e405ad25SHermès Bélusca-Maïto &ValueName,
308e405ad25SHermès Bélusca-Maïto 0,
309e405ad25SHermès Bélusca-Maïto REG_SZ,
310f0a1d766SHermès Bélusca-Maïto (PVOID)szLayoutID,
311f0a1d766SHermès Bélusca-Maïto (wcslen(szLayoutID)+1) * sizeof(WCHAR));
312e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
313e405ad25SHermès Bélusca-Maïto {
314f0a1d766SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status = %lx, uIndex = %u)\n", Status, uIndex);
315f0a1d766SHermès Bélusca-Maïto goto Quit;
316e405ad25SHermès Bélusca-Maïto }
317e405ad25SHermès Bélusca-Maïto }
318e405ad25SHermès Bélusca-Maïto else
319e405ad25SHermès Bélusca-Maïto {
320f0a1d766SHermès Bélusca-Maïto /* Generate a substitute keyboard layout ID */
321f0a1d766SHermès Bélusca-Maïto RtlStringCchPrintfW(szSubstID, _countof(szSubstID), L"%08lx",
322f0a1d766SHermès Bélusca-Maïto (0xD0000000/*SUBST_MASK*/ | ((USHORT)uCount << 4) | MuiLayouts[uIndex].LangID));
323e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
324e405ad25SHermès Bélusca-Maïto &ValueName,
325e405ad25SHermès Bélusca-Maïto 0,
326e405ad25SHermès Bélusca-Maïto REG_SZ,
327f0a1d766SHermès Bélusca-Maïto (PVOID)szSubstID,
328f0a1d766SHermès Bélusca-Maïto (wcslen(szSubstID)+1) * sizeof(WCHAR));
329e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
330e405ad25SHermès Bélusca-Maïto {
331f0a1d766SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status = %lx, uIndex = %u)\n", Status, uIndex);
332f0a1d766SHermès Bélusca-Maïto goto Quit;
333e405ad25SHermès Bélusca-Maïto }
334e405ad25SHermès Bélusca-Maïto
335f0a1d766SHermès Bélusca-Maïto /* Link the substitute layout with the original one */
336f0a1d766SHermès Bélusca-Maïto RtlInitUnicodeString(&ValueName, szSubstID);
337e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(SubKeyHandle,
338e405ad25SHermès Bélusca-Maïto &ValueName,
339e405ad25SHermès Bélusca-Maïto 0,
340e405ad25SHermès Bélusca-Maïto REG_SZ,
341f0a1d766SHermès Bélusca-Maïto (PVOID)szLayoutID,
342f0a1d766SHermès Bélusca-Maïto (wcslen(szLayoutID)+1) * sizeof(WCHAR));
343e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
344e405ad25SHermès Bélusca-Maïto {
345e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status = %lx, uIndex = %u)\n", Status, uIndex);
346f0a1d766SHermès Bélusca-Maïto goto Quit;
347e405ad25SHermès Bélusca-Maïto }
348e405ad25SHermès Bélusca-Maïto
349f0a1d766SHermès Bélusca-Maïto ++uCount;
350e405ad25SHermès Bélusca-Maïto }
351e405ad25SHermès Bélusca-Maïto }
352e405ad25SHermès Bélusca-Maïto
35325b74478SKatayama Hirofumi MZ AddHotkeySettings(L"1", L"1", L"2");
354e405ad25SHermès Bélusca-Maïto
355f0a1d766SHermès Bélusca-Maïto Quit:
356e405ad25SHermès Bélusca-Maïto NtClose(SubKeyHandle);
357e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
358f0a1d766SHermès Bélusca-Maïto return NT_SUCCESS(Status);
359e405ad25SHermès Bélusca-Maïto }
360e405ad25SHermès Bélusca-Maïto
361e405ad25SHermès Bélusca-Maïto BOOLEAN
AddKeyboardLayouts(IN PCWSTR LanguageId)362e405ad25SHermès Bélusca-Maïto AddKeyboardLayouts(
363e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
364e405ad25SHermès Bélusca-Maïto {
365e405ad25SHermès Bélusca-Maïto ULONG lngIndex = 0;
366e405ad25SHermès Bélusca-Maïto
367e405ad25SHermès Bélusca-Maïto while (MUILanguageList[lngIndex].LanguageID != NULL)
368e405ad25SHermès Bélusca-Maïto {
369e405ad25SHermès Bélusca-Maïto if (_wcsicmp(MUILanguageList[lngIndex].LanguageID, LanguageId) == 0)
370e405ad25SHermès Bélusca-Maïto {
371e405ad25SHermès Bélusca-Maïto return AddKbLayoutsToRegistry(MUILanguageList[lngIndex].MuiLayouts);
372e405ad25SHermès Bélusca-Maïto }
373e405ad25SHermès Bélusca-Maïto
374e405ad25SHermès Bélusca-Maïto lngIndex++;
375e405ad25SHermès Bélusca-Maïto }
376e405ad25SHermès Bélusca-Maïto
377e405ad25SHermès Bélusca-Maïto return FALSE;
378e405ad25SHermès Bélusca-Maïto }
379e405ad25SHermès Bélusca-Maïto
380e405ad25SHermès Bélusca-Maïto static
381e405ad25SHermès Bélusca-Maïto BOOLEAN
AddCodepageToRegistry(_In_ UINT ACPage,_In_ UINT OEMCPage,_In_ UINT MACCPage)382e405ad25SHermès Bélusca-Maïto AddCodepageToRegistry(
383c26a2e89SHermès Bélusca-Maïto _In_ UINT ACPage,
384c26a2e89SHermès Bélusca-Maïto _In_ UINT OEMCPage,
385c26a2e89SHermès Bélusca-Maïto _In_ UINT MACCPage)
386e405ad25SHermès Bélusca-Maïto {
387e405ad25SHermès Bélusca-Maïto NTSTATUS Status;
388c26a2e89SHermès Bélusca-Maïto OBJECT_ATTRIBUTES ObjectAttributes;
389c26a2e89SHermès Bélusca-Maïto UNICODE_STRING Name;
390c26a2e89SHermès Bélusca-Maïto HANDLE KeyHandle;
391c26a2e89SHermès Bélusca-Maïto /*
392c26a2e89SHermès Bélusca-Maïto * Buffer big enough to hold the NULL-terminated string L"4294967295",
393c26a2e89SHermès Bélusca-Maïto * corresponding to the literal 0xFFFFFFFF (MAXULONG) in decimal.
394c26a2e89SHermès Bélusca-Maïto */
395c26a2e89SHermès Bélusca-Maïto WCHAR Value[sizeof("4294967295")];
396e405ad25SHermès Bélusca-Maïto
397c26a2e89SHermès Bélusca-Maïto /* Open the NLS CodePage key */
398c26a2e89SHermès Bélusca-Maïto RtlInitUnicodeString(&Name,
399e405ad25SHermès Bélusca-Maïto L"SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage");
400e405ad25SHermès Bélusca-Maïto InitializeObjectAttributes(&ObjectAttributes,
401c26a2e89SHermès Bélusca-Maïto &Name,
402e405ad25SHermès Bélusca-Maïto OBJ_CASE_INSENSITIVE,
403e405ad25SHermès Bélusca-Maïto GetRootKeyByPredefKey(HKEY_LOCAL_MACHINE, NULL),
404e405ad25SHermès Bélusca-Maïto NULL);
405e405ad25SHermès Bélusca-Maïto Status = NtOpenKey(&KeyHandle,
406e405ad25SHermès Bélusca-Maïto KEY_WRITE,
407e405ad25SHermès Bélusca-Maïto &ObjectAttributes);
408e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
409e405ad25SHermès Bélusca-Maïto {
410e405ad25SHermès Bélusca-Maïto DPRINT1("NtOpenKey() failed (Status %lx)\n", Status);
411e405ad25SHermès Bélusca-Maïto return FALSE;
412e405ad25SHermès Bélusca-Maïto }
413e405ad25SHermès Bélusca-Maïto
414c26a2e89SHermès Bélusca-Maïto /* Set ANSI codepage */
415c26a2e89SHermès Bélusca-Maïto Status = RtlStringCchPrintfW(Value, _countof(Value), L"%lu", ACPage);
416c26a2e89SHermès Bélusca-Maïto ASSERT(NT_SUCCESS(Status));
417c26a2e89SHermès Bélusca-Maïto
418c26a2e89SHermès Bélusca-Maïto RtlInitUnicodeString(&Name, L"ACP");
419e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
420c26a2e89SHermès Bélusca-Maïto &Name,
421e405ad25SHermès Bélusca-Maïto 0,
422e405ad25SHermès Bélusca-Maïto REG_SZ,
423c26a2e89SHermès Bélusca-Maïto (PVOID)Value,
424c26a2e89SHermès Bélusca-Maïto (wcslen(Value)+1) * sizeof(WCHAR));
425e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
426e405ad25SHermès Bélusca-Maïto {
427e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
428c26a2e89SHermès Bélusca-Maïto goto Quit;
429e405ad25SHermès Bélusca-Maïto }
430e405ad25SHermès Bélusca-Maïto
431c26a2e89SHermès Bélusca-Maïto /* Set OEM codepage */
432c26a2e89SHermès Bélusca-Maïto Status = RtlStringCchPrintfW(Value, _countof(Value), L"%lu", OEMCPage);
433c26a2e89SHermès Bélusca-Maïto ASSERT(NT_SUCCESS(Status));
434c26a2e89SHermès Bélusca-Maïto
435c26a2e89SHermès Bélusca-Maïto RtlInitUnicodeString(&Name, L"OEMCP");
436e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
437c26a2e89SHermès Bélusca-Maïto &Name,
438e405ad25SHermès Bélusca-Maïto 0,
439e405ad25SHermès Bélusca-Maïto REG_SZ,
440c26a2e89SHermès Bélusca-Maïto (PVOID)Value,
441c26a2e89SHermès Bélusca-Maïto (wcslen(Value)+1) * sizeof(WCHAR));
442e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
443e405ad25SHermès Bélusca-Maïto {
444e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
445c26a2e89SHermès Bélusca-Maïto goto Quit;
446e405ad25SHermès Bélusca-Maïto }
447e405ad25SHermès Bélusca-Maïto
448c26a2e89SHermès Bélusca-Maïto /* Set MAC codepage */
449c26a2e89SHermès Bélusca-Maïto Status = RtlStringCchPrintfW(Value, _countof(Value), L"%lu", MACCPage);
450c26a2e89SHermès Bélusca-Maïto ASSERT(NT_SUCCESS(Status));
451c26a2e89SHermès Bélusca-Maïto
452c26a2e89SHermès Bélusca-Maïto RtlInitUnicodeString(&Name, L"MACCP");
453e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
454c26a2e89SHermès Bélusca-Maïto &Name,
455e405ad25SHermès Bélusca-Maïto 0,
456e405ad25SHermès Bélusca-Maïto REG_SZ,
457c26a2e89SHermès Bélusca-Maïto (PVOID)Value,
458c26a2e89SHermès Bélusca-Maïto (wcslen(Value)+1) * sizeof(WCHAR));
459e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
460e405ad25SHermès Bélusca-Maïto {
461e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
462c26a2e89SHermès Bélusca-Maïto goto Quit;
463e405ad25SHermès Bélusca-Maïto }
464e405ad25SHermès Bélusca-Maïto
465c26a2e89SHermès Bélusca-Maïto Quit:
466e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
467c26a2e89SHermès Bélusca-Maïto return NT_SUCCESS(Status);
468e405ad25SHermès Bélusca-Maïto }
469e405ad25SHermès Bélusca-Maïto
470e405ad25SHermès Bélusca-Maïto static
471e405ad25SHermès Bélusca-Maïto BOOLEAN
AddFontsSettingsToRegistry(IN const MUI_SUBFONT * MuiSubFonts)472e405ad25SHermès Bélusca-Maïto AddFontsSettingsToRegistry(
473e405ad25SHermès Bélusca-Maïto IN const MUI_SUBFONT * MuiSubFonts)
474e405ad25SHermès Bélusca-Maïto {
475e405ad25SHermès Bélusca-Maïto OBJECT_ATTRIBUTES ObjectAttributes;
476e405ad25SHermès Bélusca-Maïto UNICODE_STRING KeyName;
477e405ad25SHermès Bélusca-Maïto UNICODE_STRING ValueName;
478e405ad25SHermès Bélusca-Maïto HANDLE KeyHandle;
479e405ad25SHermès Bélusca-Maïto NTSTATUS Status;
480e405ad25SHermès Bélusca-Maïto ULONG uIndex = 0;
481e405ad25SHermès Bélusca-Maïto
482e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&KeyName,
483e405ad25SHermès Bélusca-Maïto L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes");
484e405ad25SHermès Bélusca-Maïto InitializeObjectAttributes(&ObjectAttributes,
485e405ad25SHermès Bélusca-Maïto &KeyName,
486e405ad25SHermès Bélusca-Maïto OBJ_CASE_INSENSITIVE,
487e405ad25SHermès Bélusca-Maïto GetRootKeyByPredefKey(HKEY_LOCAL_MACHINE, NULL),
488e405ad25SHermès Bélusca-Maïto NULL);
489e405ad25SHermès Bélusca-Maïto Status = NtOpenKey(&KeyHandle,
490e405ad25SHermès Bélusca-Maïto KEY_WRITE,
491e405ad25SHermès Bélusca-Maïto &ObjectAttributes);
492e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
493e405ad25SHermès Bélusca-Maïto {
494e405ad25SHermès Bélusca-Maïto DPRINT1("NtOpenKey() failed (Status %lx)\n", Status);
495e405ad25SHermès Bélusca-Maïto return FALSE;
496e405ad25SHermès Bélusca-Maïto }
497e405ad25SHermès Bélusca-Maïto
498e405ad25SHermès Bélusca-Maïto while (MuiSubFonts[uIndex].FontName != NULL)
499e405ad25SHermès Bélusca-Maïto {
500e405ad25SHermès Bélusca-Maïto RtlInitUnicodeString(&ValueName, MuiSubFonts[uIndex].FontName);
501b539dd1cSKatayama Hirofumi MZ if (MuiSubFonts[uIndex].SubFontName)
502b539dd1cSKatayama Hirofumi MZ {
503e405ad25SHermès Bélusca-Maïto Status = NtSetValueKey(KeyHandle,
504e405ad25SHermès Bélusca-Maïto &ValueName,
505e405ad25SHermès Bélusca-Maïto 0,
506e405ad25SHermès Bélusca-Maïto REG_SZ,
507e405ad25SHermès Bélusca-Maïto (PVOID)MuiSubFonts[uIndex].SubFontName,
508e405ad25SHermès Bélusca-Maïto (wcslen(MuiSubFonts[uIndex].SubFontName)+1) * sizeof(WCHAR));
509e405ad25SHermès Bélusca-Maïto if (!NT_SUCCESS(Status))
510e405ad25SHermès Bélusca-Maïto {
511e405ad25SHermès Bélusca-Maïto DPRINT1("NtSetValueKey() failed (Status = %lx, uIndex = %d)\n", Status, uIndex);
512e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
513e405ad25SHermès Bélusca-Maïto return FALSE;
514e405ad25SHermès Bélusca-Maïto }
515b539dd1cSKatayama Hirofumi MZ }
516b539dd1cSKatayama Hirofumi MZ else
517b539dd1cSKatayama Hirofumi MZ {
518b539dd1cSKatayama Hirofumi MZ Status = NtDeleteValueKey(KeyHandle, &ValueName);
519b539dd1cSKatayama Hirofumi MZ if (!NT_SUCCESS(Status))
520b539dd1cSKatayama Hirofumi MZ {
521b539dd1cSKatayama Hirofumi MZ DPRINT1("NtDeleteValueKey failed, Status = %lx\n", Status);
522b539dd1cSKatayama Hirofumi MZ }
523b539dd1cSKatayama Hirofumi MZ }
524e405ad25SHermès Bélusca-Maïto
525e405ad25SHermès Bélusca-Maïto uIndex++;
526e405ad25SHermès Bélusca-Maïto }
527e405ad25SHermès Bélusca-Maïto
528e405ad25SHermès Bélusca-Maïto NtClose(KeyHandle);
529e405ad25SHermès Bélusca-Maïto
530e405ad25SHermès Bélusca-Maïto return TRUE;
531e405ad25SHermès Bélusca-Maïto }
532e405ad25SHermès Bélusca-Maïto
533e405ad25SHermès Bélusca-Maïto BOOLEAN
AddCodePage(IN PCWSTR LanguageId)534e405ad25SHermès Bélusca-Maïto AddCodePage(
535e405ad25SHermès Bélusca-Maïto IN PCWSTR LanguageId)
536e405ad25SHermès Bélusca-Maïto {
537e405ad25SHermès Bélusca-Maïto ULONG lngIndex = 0;
538e405ad25SHermès Bélusca-Maïto
539e405ad25SHermès Bélusca-Maïto while (MUILanguageList[lngIndex].LanguageID != NULL)
540e405ad25SHermès Bélusca-Maïto {
541e405ad25SHermès Bélusca-Maïto if (_wcsicmp(MUILanguageList[lngIndex].LanguageID, LanguageId) == 0)
542e405ad25SHermès Bélusca-Maïto {
543e405ad25SHermès Bélusca-Maïto if (AddCodepageToRegistry(MUILanguageList[lngIndex].ACPage,
544e405ad25SHermès Bélusca-Maïto MUILanguageList[lngIndex].OEMCPage,
545e405ad25SHermès Bélusca-Maïto MUILanguageList[lngIndex].MACCPage) &&
546e405ad25SHermès Bélusca-Maïto AddFontsSettingsToRegistry(MUILanguageList[lngIndex].MuiSubFonts))
547e405ad25SHermès Bélusca-Maïto {
548e405ad25SHermès Bélusca-Maïto return TRUE;
549e405ad25SHermès Bélusca-Maïto }
550e405ad25SHermès Bélusca-Maïto else
551e405ad25SHermès Bélusca-Maïto {
552e405ad25SHermès Bélusca-Maïto return FALSE;
553e405ad25SHermès Bélusca-Maïto }
554e405ad25SHermès Bélusca-Maïto }
555e405ad25SHermès Bélusca-Maïto
556e405ad25SHermès Bélusca-Maïto lngIndex++;
557e405ad25SHermès Bélusca-Maïto }
558e405ad25SHermès Bélusca-Maïto
559e405ad25SHermès Bélusca-Maïto return FALSE;
560e405ad25SHermès Bélusca-Maïto }
561e405ad25SHermès Bélusca-Maïto
562b539dd1cSKatayama Hirofumi MZ #ifdef __REACTOS__ /* HACK */
563b539dd1cSKatayama Hirofumi MZ BOOL
DoRegistryFontFixup(PFONTSUBSTSETTINGS pSettings,LANGID LangID)564b539dd1cSKatayama Hirofumi MZ DoRegistryFontFixup(PFONTSUBSTSETTINGS pSettings, LANGID LangID)
565b539dd1cSKatayama Hirofumi MZ {
566b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontMINGLIU)
567b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(FontFixupMINGLIU);
568b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontSIMSUN)
569b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(FontFixupSIMSUN);
570b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontMSSONG)
571b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(FontFixupMSSONG);
572b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontMSGOTHIC)
573b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(FontFixupMSGOTHIC);
574b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontMSMINCHO)
575b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(FontFixupMSMINCHO);
576b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontGULIM)
577b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(FontFixupGULIM);
578b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontBATANG)
579b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(FontFixupBATANG);
580b539dd1cSKatayama Hirofumi MZ
581b539dd1cSKatayama Hirofumi MZ switch (PRIMARYLANGID(LangID))
582b539dd1cSKatayama Hirofumi MZ {
583b539dd1cSKatayama Hirofumi MZ case LANG_CHINESE:
584b539dd1cSKatayama Hirofumi MZ if (SUBLANGID(LangID) == SUBLANG_CHINESE_SIMPLIFIED)
585b539dd1cSKatayama Hirofumi MZ {
586b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontSIMSUN)
587b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(SimplifiedChineseFontFixup);
588b539dd1cSKatayama Hirofumi MZ }
589b539dd1cSKatayama Hirofumi MZ else
590b539dd1cSKatayama Hirofumi MZ {
591b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontMINGLIU)
592b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(TraditionalChineseFontFixup);
593b539dd1cSKatayama Hirofumi MZ }
594b539dd1cSKatayama Hirofumi MZ break;
595b539dd1cSKatayama Hirofumi MZ
596b539dd1cSKatayama Hirofumi MZ case LANG_JAPANESE:
597b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontMSGOTHIC)
598b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(JapaneseFontFixup);
599b539dd1cSKatayama Hirofumi MZ break;
600b539dd1cSKatayama Hirofumi MZ
601b539dd1cSKatayama Hirofumi MZ case LANG_KOREAN:
602b539dd1cSKatayama Hirofumi MZ if (pSettings->bFoundFontBATANG)
603b539dd1cSKatayama Hirofumi MZ AddFontsSettingsToRegistry(KoreanFontFixup);
604b539dd1cSKatayama Hirofumi MZ break;
605b539dd1cSKatayama Hirofumi MZ }
606b539dd1cSKatayama Hirofumi MZ
607b539dd1cSKatayama Hirofumi MZ return TRUE;
608b539dd1cSKatayama Hirofumi MZ }
609b539dd1cSKatayama Hirofumi MZ #endif /* HACK */
610b539dd1cSKatayama Hirofumi MZ
611e405ad25SHermès Bélusca-Maïto /* EOF */
612