3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ps/locale.c
6 * PURPOSE: Locale support
7 * PROGRAMMER: David Welch (welch@cwcom.net)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/ps.h>
18 #include <internal/debug.h>
21 /* GLOBALS *******************************************************************/
24 * Default setting: LANG_NEUTRAL, SUBLANG_NEUTRAL, SORT_DEFAULT
26 LCID PsDefaultThreadLocaleId = 0;
27 LCID PsDefaultSystemLocaleId = 0;
30 #define VALUE_BUFFER_SIZE 256
32 /* FUNCTIONS *****************************************************************/
35 PiInitDefaultLocale(VOID)
38 * Initializes the default locale.
39 * Reads default locale from registry, if available
46 OBJECT_ATTRIBUTES ObjectAttributes;
47 UNICODE_STRING KeyName;
48 UNICODE_STRING ValueName;
51 UCHAR ValueBuffer[VALUE_BUFFER_SIZE];
52 PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
53 UNICODE_STRING ValueString;
57 ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer;
59 /* read system locale */
60 RtlInitUnicodeStringFromLiteral(&KeyName,
61 L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Nls\\Language");
62 RtlInitUnicodeStringFromLiteral(&ValueName,
65 InitializeObjectAttributes(&ObjectAttributes,
70 Status = NtOpenKey(&KeyHandle,
73 if (NT_SUCCESS(Status))
75 Status = NtQueryValueKey(KeyHandle,
77 KeyValuePartialInformation,
81 if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ))
83 ValueString.Length = ValueInfo->DataLength;
84 ValueString.MaximumLength = ValueInfo->DataLength;
85 ValueString.Buffer = (PWSTR)ValueInfo->Data;
87 Status = RtlUnicodeStringToInteger(&ValueString,
90 if (NT_SUCCESS(Status))
92 DPRINT("System locale: %08lu\n", LocaleValue);
93 PsDefaultSystemLocaleId = (LCID)LocaleValue;
99 /* read default thread locale */
100 RtlInitUnicodeStringFromLiteral(&KeyName,
101 L"\\Registry\\User\\.Default\\Control Panel\\International");
102 RtlInitUnicodeStringFromLiteral(&ValueName,
105 InitializeObjectAttributes(&ObjectAttributes,
107 OBJ_CASE_INSENSITIVE,
110 Status = NtOpenKey(&KeyHandle,
113 if (NT_SUCCESS(Status))
115 Status = NtQueryValueKey(KeyHandle,
117 KeyValuePartialInformation,
121 if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ))
123 ValueString.Length = ValueInfo->DataLength;
124 ValueString.MaximumLength = ValueInfo->DataLength;
125 ValueString.Buffer = (PWSTR)ValueInfo->Data;
127 Status = RtlUnicodeStringToInteger(&ValueString,
130 if (NT_SUCCESS(Status))
132 DPRINT("Thread locale: %08lu\n", LocaleValue);
133 PsDefaultThreadLocaleId = (LCID)LocaleValue;
142 NtQueryDefaultLocale(IN BOOLEAN ThreadOrSystem,
143 OUT PLCID DefaultLocaleId)
146 * Returns the default locale.
148 * ThreadOrSystem = If TRUE then the locale for this thread is returned,
149 * otherwise the locale for the system is returned.
150 * DefaultLocaleId = Points to a variable that receives the locale id.
155 if (DefaultLocaleId == NULL)
156 return STATUS_UNSUCCESSFUL;
158 if (ThreadOrSystem == TRUE)
160 /* set thread locale */
161 *DefaultLocaleId = PsDefaultThreadLocaleId;
165 /* set system locale */
166 *DefaultLocaleId = PsDefaultSystemLocaleId;
168 return(STATUS_SUCCESS);
173 NtSetDefaultLocale(IN BOOLEAN ThreadOrSystem,
174 IN LCID DefaultLocaleId)
177 * Sets the default locale.
179 * ThreadOrSystem = If TRUE then the locale for this thread is set,
180 * otherwise the locale for the system is set.
181 * DefaultLocaleId = The locale id to be set.
186 OBJECT_ATTRIBUTES ObjectAttributes;
187 UNICODE_STRING KeyName;
188 UNICODE_STRING ValueName;
191 WCHAR ValueBuffer[20];
192 HANDLE UserKey = NULL;
195 if (ThreadOrSystem == TRUE)
198 Status = RtlOpenCurrentUser(KEY_WRITE,
200 if (!NT_SUCCESS(Status))
202 RtlInitUnicodeStringFromLiteral(&KeyName,
203 L"Control Panel\\International");
204 RtlInitUnicodeStringFromLiteral(&ValueName,
210 RtlInitUnicodeStringFromLiteral(&KeyName,
211 L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Nls\\Language");
212 RtlInitUnicodeStringFromLiteral(&ValueName,
216 InitializeObjectAttributes(&ObjectAttributes,
218 OBJ_CASE_INSENSITIVE,
221 Status = NtOpenKey(&KeyHandle,
224 if (!NT_SUCCESS(Status))
233 ValueLength = swprintf(ValueBuffer,
235 (ULONG)DefaultLocaleId);
236 ValueLength = (ValueLength + 1) * sizeof(WCHAR);
238 Status = NtSetValueKey(KeyHandle,
251 if (!NT_SUCCESS(Status))
256 if (ThreadOrSystem == TRUE)
258 /* set thread locale */
259 DPRINT("Thread locale: %08lu\n", DefaultLocaleId);
260 PsDefaultThreadLocaleId = DefaultLocaleId;
264 /* set system locale */
265 DPRINT("System locale: %08lu\n", DefaultLocaleId);
266 PsDefaultSystemLocaleId = DefaultLocaleId;
269 return(STATUS_SUCCESS);