xref: /reactos/base/setup/lib/mui.c (revision 88891d2c)
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