Author: ion Date: Tue Jul 18 05:58:10 2006 New Revision: 23133
URL: http://svn.reactos.org/svn/reactos?rev=23133&view=rev Log: - Move ps/locale.c to ex/locale.c, since it has nothing to do with Process/Thread management (locale settings are part of the executive). - Cleanup formatting in the file and add proper credits (Thomas and Eric). - Create internal Exp* functions for Setting/Getting the user langid, since they need to be called 2, 3 times by other code and thus shared. - Remove some deprecated code, make the functions themselves initialize the default ID when called for the first time (which should be done by winlogon --> it seems this isn't done yet?). - Set default locale to 0x409 instead of 0x0.
Added: trunk/reactos/ntoskrnl/ex/locale.c - copied, changed from r23131, trunk/reactos/ntoskrnl/ps/locale.c Removed: trunk/reactos/ntoskrnl/ps/locale.c Modified: trunk/reactos/ntoskrnl/ex/init.c trunk/reactos/ntoskrnl/include/internal/ps.h trunk/reactos/ntoskrnl/ntoskrnl.rbuild
Modified: trunk/reactos/ntoskrnl/ex/init.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?rev=2313... ============================================================================== --- trunk/reactos/ntoskrnl/ex/init.c (original) +++ trunk/reactos/ntoskrnl/ex/init.c Tue Jul 18 05:58:10 2006 @@ -653,9 +653,6 @@ /* Load the System DLL and its Entrypoints */ PsLocateSystemDll();
- /* Initialize the Default Locale */ - PiInitDefaultLocale(); - /* Initialize shared user page. Set dos system path, dos device map, etc. */ InitSystemSharedUserPage ((PCHAR)KeLoaderBlock.CommandLine);
Copied: trunk/reactos/ntoskrnl/ex/locale.c (from r23131, trunk/reactos/ntoskrnl/ps/locale.c) URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/locale.c?p2=tru... ============================================================================== --- trunk/reactos/ntoskrnl/ps/locale.c (original) +++ trunk/reactos/ntoskrnl/ex/locale.c Tue Jul 18 05:58:10 2006 @@ -1,555 +1,405 @@ -/* $Id$ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/ps/locale.c - * PURPOSE: Locale support - * - * PROGRAMMERS: David Welch (welch@cwcom.net) +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/ex/locale.c + * PURPOSE: Locale (Language) Support for the Executive + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Eric Kohl + * Thomas Weidenmueller (w3seek@reactos.org */
-/* INCLUDES *****************************************************************/ +/* INCLUDES ******************************************************************/
#include <ntoskrnl.h> - #define NDEBUG #include <internal/debug.h>
-#if defined (ALLOC_PRAGMA) -#pragma alloc_text(INIT, PiInitDefaultLocale) -#endif - - /* GLOBALS *******************************************************************/
-/* - * Default setting: LANG_NEUTRAL, SUBLANG_NEUTRAL, SORT_DEFAULT - */ -LCID PsDefaultThreadLocaleId = 0; -LCID PsDefaultSystemLocaleId = 0; -BOOL PsDefaultThreadLocaleInitialized = FALSE; - -static LANGID PsInstallUILanguageId = 0; - -#define VALUE_BUFFER_SIZE 256 - -/* FUNCTIONS *****************************************************************/ - -/* - * FUNCTION: - * Initializes the default locale. - * Reads default locale from registry, if available - * ARGUMENTS: - * None. - * Returns: - * None. - */ -VOID -INIT_FUNCTION -NTAPI -PiInitDefaultLocale(VOID) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\Registry\Machine\System\CurrentControlSet\Control\Nls\Language"); - UNICODE_STRING ValueName; - HANDLE KeyHandle; - ULONG ValueLength; - UCHAR ValueBuffer[VALUE_BUFFER_SIZE]; - PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; - UNICODE_STRING ValueString; - ULONG Value; - NTSTATUS Status; - - ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_QUERY_VALUE, - &ObjectAttributes); - if (NT_SUCCESS(Status)) - { - /* Read system locale */ - RtlInitUnicodeString(&ValueName, - L"Default"); - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ)) - { - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &Value); - if (NT_SUCCESS(Status)) - { - DPRINT("System locale: %08lx\n", Value); - PsDefaultSystemLocaleId = (LCID)Value; - } - } - - /* Read install language id */ - RtlInitUnicodeString(&ValueName, - L"InstallLanguage"); - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ)) - { - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &Value); - if (NT_SUCCESS(Status)) - { - DPRINT("Install language id: %04lx\n", Value); - PsInstallUILanguageId = (LANGID)Value; - } - } - - ZwClose(KeyHandle); - } -} - - -/* - * FUNCTION: - * Initializes the default thread locale. - * Reads default locale from registry, if available - * ARGUMENTS: - * None. - * Returns: - * None. - */ -VOID STDCALL -PiInitThreadLocale(VOID) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\Registry\User\.Default\Control Panel\International"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"Locale"); - HANDLE KeyHandle; - ULONG ValueLength; - UCHAR ValueBuffer[VALUE_BUFFER_SIZE]; - PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; - UNICODE_STRING ValueString; - ULONG LocaleValue; - NTSTATUS Status; - - ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; - - /* read default thread locale */ - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_QUERY_VALUE, - &ObjectAttributes); - if (NT_SUCCESS(Status)) - { - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ)) - { - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &LocaleValue); - if (NT_SUCCESS(Status)) - { - DPRINT("Thread locale: %08lu\n", LocaleValue); - PsDefaultThreadLocaleId = (LCID)LocaleValue; - } - } - ZwClose(KeyHandle); - } - - PsDefaultThreadLocaleInitialized = TRUE; -} - - -/* - * FUNCTION: - * Returns the default locale. - * ARGUMENTS: - * UserProfile = If TRUE then the locale for this thread is returned, - * otherwise the locale for the system is returned. - * DefaultLocaleId = Points to a variable that receives the locale id. - * Returns: - * Status. - */ -NTSTATUS STDCALL +/* System IDs: EN_US */ +LCID PsDefaultSystemLocaleId = 0x00000409; +LANGID PsInstallUILanguageId = LANGIDFROMLCID(0x00000409); + +/* UI/Thread IDs: Same as system */ +LANGID PsDefaultUILanguageId = 0x00000409; +LCID PsDefaultThreadLocaleId = LANGIDFROMLCID(0x00000409); + +/* PRIVATE FUNCTIONS *********************************************************/ + +NTSTATUS +NTAPI +ExpGetCurrentUserUILanguage(IN PWSTR MuiName, + OUT PLANGID LanguageId) +{ + UCHAR ValueBuffer[256]; + PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName = + RTL_CONSTANT_STRING(L"Control Panel\International"); + UNICODE_STRING ValueName; + UNICODE_STRING ValueString; + ULONG ValueLength; + ULONG Value; + HANDLE UserKey; + HANDLE KeyHandle; + NTSTATUS Status; + PAGED_CODE(); + + /* Setup the key name */ + RtlInitUnicodeString(&ValueName, MuiName); + + /* Open the use key */ + Status = RtlOpenCurrentUser(KEY_READ, &UserKey); + if (!NT_SUCCESS(Status)) return Status; + + /* Initialize the attributes and open the key */ + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + UserKey, + NULL); + Status = ZwOpenKey(&KeyHandle, KEY_QUERY_VALUE,&ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Set buffer and query the current value */ + ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; + Status = ZwQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + ValueBuffer, + sizeof(ValueBuffer), + &ValueLength); + if (NT_SUCCESS(Status)) + { + /* Success, is the value the right type? */ + if (ValueInfo->Type == REG_SZ) + { + /* It is. Initailize the data and convert it */ + RtlInitUnicodeString(&ValueString, (PWSTR)ValueInfo->Data); + Status = RtlUnicodeStringToInteger(&ValueString, 16, &Value); + if (NT_SUCCESS(Status)) + { + /* Return the language */ + *LanguageId = Value; + } + } + else + { + /* Fail */ + Status = STATUS_UNSUCCESSFUL; + } + + /* Close the key */ + ZwClose(KeyHandle); + } + } + + /* Close the user key and return */ + ZwClose(UserKey); + return Status; +} + +NTSTATUS +NTAPI +ExpSetCurrentUserUILanguage(IN PWSTR MuiName, + IN LANGID LanguageId) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"Control Panel\Desktop"); + UNICODE_STRING ValueName; + WCHAR ValueBuffer[8]; + ULONG ValueLength; + HANDLE UserHandle; + HANDLE KeyHandle; + NTSTATUS Status; + PAGED_CODE(); + + /* Setup the key name */ + RtlInitUnicodeString(&ValueName, MuiName); + + /* Open the use key */ + Status = RtlOpenCurrentUser(KEY_WRITE, &UserHandle); + if (!NT_SUCCESS(Status)) return Status; + + /* Initialize the attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + UserHandle, + NULL); + + /* Open the key */ + Status = ZwOpenKey(&KeyHandle, KEY_SET_VALUE, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Setup the value name */ + ValueLength = swprintf(ValueBuffer, + L"%04lX", + (ULONG)LanguageId); + + /* Set the length for the call and set the value */ + ValueLength = (ValueLength + 1) * sizeof(WCHAR); + Status = ZwSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + ValueBuffer, + ValueLength); + + /* Close the handle for this key */ + ZwClose(KeyHandle); + } + + /* Close the user key and return status */ + ZwClose(UserHandle); + return Status; +} + +/* PUBLIC FUNCTIONS **********************************************************/ + +NTSTATUS +NTAPI NtQueryDefaultLocale(IN BOOLEAN UserProfile, - OUT PLCID DefaultLocaleId) + OUT PLCID DefaultLocaleId) { NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - + PAGED_CODE(); + + /* Enter SEH for probing */ _SEH_TRY { + /* Check if we came from user mode */ if (KeGetPreviousMode() != KernelMode) { + /* Probe the language ID */ ProbeForWriteLangid(DefaultLocaleId); } - + + /* Check if we have a user profile */ if (UserProfile) { - if (!PsDefaultThreadLocaleInitialized) - { - PiInitThreadLocale(); - } - - /* set thread locale */ - *DefaultLocaleId = PsDefaultThreadLocaleId; + /* Return thread locale */ + *DefaultLocaleId = PsDefaultThreadLocaleId; } else { - /* set system locale */ + /* Return system locale */ *DefaultLocaleId = PsDefaultSystemLocaleId; } } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { + /* Get exception code */ Status = _SEH_GetExceptionCode(); } _SEH_END;
- return Status; -} - - -/* - * FUNCTION: - * Sets the default locale. - * ARGUMENTS: - * ThreadOrSystem = If TRUE then the locale for this thread is set, - * otherwise the locale for the system is set. - * DefaultLocaleId = The locale id to be set. - * Returns: - * Status. - */ -NTSTATUS STDCALL + /* Return status */ + return Status; +} + +NTSTATUS +NTAPI NtSetDefaultLocale(IN BOOLEAN UserProfile, - IN LCID DefaultLocaleId) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName; - UNICODE_STRING ValueName; - HANDLE KeyHandle; - ULONG ValueLength; - WCHAR ValueBuffer[20]; - HANDLE UserKey = NULL; - NTSTATUS Status; - - PAGED_CODE(); - - if (UserProfile) - { - /* thread locale */ - Status = RtlOpenCurrentUser(KEY_WRITE, - &UserKey); - if (!NT_SUCCESS(Status)) - return(Status); - RtlInitUnicodeString(&KeyName, - L"Control Panel\International"); - RtlInitUnicodeString(&ValueName, - L"Locale"); - } - else - { - /* system locale */ - RtlInitUnicodeString(&KeyName, - L"\Registry\Machine\System\CurrentControlSet\Control\Nls\Language"); - RtlInitUnicodeString(&ValueName, - L"Default"); - } - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - UserKey, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_SET_VALUE, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - if (UserKey != NULL) - { - ZwClose(UserKey); - } - return(Status); - } - - if (UserProfile) - { - ValueLength = swprintf(ValueBuffer, - L"%08lx", - (ULONG)DefaultLocaleId); - } - else - { - ValueLength = swprintf(ValueBuffer, - L"%04lx", - (ULONG)DefaultLocaleId & 0xFFFF); - } - ValueLength = (ValueLength + 1) * sizeof(WCHAR); - - Status = ZwSetValueKey(KeyHandle, - &ValueName, - 0, - REG_SZ, - ValueBuffer, - ValueLength); - - ZwClose(KeyHandle); - if (UserKey != NULL) - { - ZwClose(UserKey); - } - - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - if (UserProfile) - { - /* set thread locale */ - DPRINT("Thread locale: %08lu\n", DefaultLocaleId); - PsDefaultThreadLocaleId = DefaultLocaleId; - PsDefaultThreadLocaleInitialized = TRUE; - } - else - { - /* set system locale */ - DPRINT("System locale: %08lu\n", DefaultLocaleId); - PsDefaultSystemLocaleId = DefaultLocaleId; - } - - return STATUS_SUCCESS; -} - + IN LCID DefaultLocaleId) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + UNICODE_STRING ValueName; + HANDLE KeyHandle; + ULONG ValueLength; + WCHAR ValueBuffer[20]; + HANDLE UserKey = NULL; + NTSTATUS Status; + PAGED_CODE(); + + /* Check if we have a profile */ + if (UserProfile) + { + /* Open the user's key */ + Status = RtlOpenCurrentUser(KEY_WRITE, &UserKey); + if (!NT_SUCCESS(Status)) return(Status); + + /* Initialize the registry location */ + RtlInitUnicodeString(&KeyName, L"Control Panel\International"); + RtlInitUnicodeString(&ValueName, L"Locale"); + } + else + { + /* Initialize the system registry location */ + RtlInitUnicodeString(&KeyName, + L"\Registry\Machine\System\CurrentControlSet" + "\Control\Nls\Language"); + RtlInitUnicodeString(&ValueName, L"Default"); + } + + /* Initailize the object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + UserKey, + NULL); + + /* Check if we don' thave a default locale yet */ + if (!DefaultLocaleId) + { + DPRINT1("TODO\n"); + Status = STATUS_SUCCESS; + KEBUGCHECK(0); + } + else + { + /* Otherwise, open the key */ + Status = ZwOpenKey(&KeyHandle, KEY_SET_VALUE, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Check if we had a profile */ + if (UserProfile) + { + /* Fill in the buffer */ + ValueLength = swprintf(ValueBuffer, + L"%08lx", + (ULONG)DefaultLocaleId); + } + else + { + /* Fill in the buffer */ + ValueLength = swprintf(ValueBuffer, + L"%04lx", + (ULONG)DefaultLocaleId & 0xFFFF); + } + + /* Set the length for the registry call */ + ValueLength = (ValueLength + 1) * sizeof(WCHAR); + + /* Now write the actual value */ + Status = ZwSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + ValueBuffer, + ValueLength); + + /* And close the key */ + ZwClose(KeyHandle); + } + } + + /* Close the user key */ + ZwClose(UserKey); + + /* Check for success */ + if (NT_SUCCESS(Status)) + { + /* Check if it was for a user */ + if (UserProfile) + { + /* Set thread locale */ + PsDefaultThreadLocaleId = DefaultLocaleId; + } + else + { + /* Set system locale */ + PsDefaultSystemLocaleId = DefaultLocaleId; + } + } + + /* Return status */ + return Status; +}
/* * @implemented */ -NTSTATUS STDCALL -NtQueryDefaultUILanguage(OUT PLANGID LanguageId) -{ - UCHAR ValueBuffer[VALUE_BUFFER_SIZE]; - PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"Control Panel\International"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"MultiUILanguageId"); - UNICODE_STRING ValueString; - ULONG ValueLength; - ULONG Value; - HANDLE UserKey; - HANDLE KeyHandle; - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - - _SEH_TRY - { - if (KeGetPreviousMode() != KernelMode) - { - ProbeForWriteLangid(LanguageId); - } - - *LanguageId = PsInstallUILanguageId; - } - _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlOpenCurrentUser(KEY_READ, - &UserKey); - if (!NT_SUCCESS(Status)) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - UserKey, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_QUERY_VALUE, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; - - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - - ZwClose(KeyHandle); - ZwClose(UserKey); - - if (!NT_SUCCESS(Status) || ValueInfo->Type != REG_SZ) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &Value); - if (!NT_SUCCESS(Status)) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - DPRINT("Default language id: %04lx\n", Value); - -ReturnSuccess: - _SEH_TRY - { - *LanguageId = Value; - Status = STATUS_SUCCESS; - } - _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - return Status; -} - +NTSTATUS +NTAPI +NtQueryInstallUILanguage(OUT PLANGID LanguageId) +{ + NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + + /* Enter SEH for probing */ + _SEH_TRY + { + /* Check if we came from user mode */ + if (KeGetPreviousMode() != KernelMode) + { + /* Probe the Language ID */ + ProbeForWriteLangid(LanguageId); + } + + /* Return it */ + *LanguageId = PsInstallUILanguageId; + } + _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) + { + /* Get exception code */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + /* Return status */ + return Status; +}
/* * @implemented */ -NTSTATUS STDCALL -NtQueryInstallUILanguage(OUT PLANGID LanguageId) +NTSTATUS +NTAPI +NtQueryDefaultUILanguage(OUT PLANGID LanguageId) { NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - + PAGED_CODE(); + + /* Enter SEH for probing */ _SEH_TRY { + /* Check if we came from user mode */ if (KeGetPreviousMode() != KernelMode) { + /* Probe the Language ID */ ProbeForWriteLangid(LanguageId); }
- *LanguageId = PsInstallUILanguageId; + /* Call the executive helper routine */ + Status = ExpGetCurrentUserUILanguage(L"MultiUILanguageId", LanguageId); + if (NT_SUCCESS(Status)) + { + /* Success, return the language */ + *LanguageId = PsInstallUILanguageId; + } } _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { + /* Get exception code */ Status = _SEH_GetExceptionCode(); } _SEH_END;
- return Status; -} - + /* Return status */ + return Status; +}
/* * @implemented */ -NTSTATUS STDCALL +NTSTATUS +NTAPI NtSetDefaultUILanguage(IN LANGID LanguageId) { - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"Control Panel\Desktop"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"MultiUILanguageId"); - WCHAR ValueBuffer[8]; - ULONG ValueLength; - HANDLE UserHandle; - HANDLE KeyHandle; - NTSTATUS Status; - - PAGED_CODE(); - - Status = RtlOpenCurrentUser(KEY_WRITE, - &UserHandle); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - UserHandle, - NULL); - - Status = ZwOpenKey(&KeyHandle, - KEY_SET_VALUE, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - ZwClose(UserHandle); - return Status; - } - - ValueLength = swprintf(ValueBuffer, - L"%04lX", - (ULONG)LanguageId); - ValueLength = (ValueLength + 1) * sizeof(WCHAR); - - Status = ZwSetValueKey(KeyHandle, - &ValueName, - 0, - REG_SZ, - ValueBuffer, - ValueLength); - - ZwClose(KeyHandle); - ZwClose(UserHandle); - - return Status; + PAGED_CODE(); + + /* Check if we don't have a default yet */ + if (!LanguageId) + { + /* FIXME */ + DPRINT1("TODO\n"); + KEBUGCHECK(0); + } + + /* Otherwise, call the internal routine */ + return ExpSetCurrentUserUILanguage(L"MUILanguagePending", LanguageId); }
/* EOF */
Modified: trunk/reactos/ntoskrnl/include/internal/ps.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/p... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/ps.h (original) +++ trunk/reactos/ntoskrnl/include/internal/ps.h Tue Jul 18 05:58:10 2006 @@ -18,10 +18,6 @@ #define PSP_MAX_CREATE_THREAD_NOTIFY 8 #define PSP_MAX_LOAD_IMAGE_NOTIFY 8 #define PSP_MAX_CREATE_PROCESS_NOTIFY 8 - -VOID -NTAPI -PiInitDefaultLocale(VOID);
VOID NTAPI
Modified: trunk/reactos/ntoskrnl/ntoskrnl.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl.rbuild?re... ============================================================================== --- trunk/reactos/ntoskrnl/ntoskrnl.rbuild (original) +++ trunk/reactos/ntoskrnl/ntoskrnl.rbuild Tue Jul 18 05:58:10 2006 @@ -129,6 +129,7 @@ <file>fmutex.c</file> <file>handle.c</file> <file>init.c</file> + <file>locale.c</file> <file>lookas.c</file> <file>mutant.c</file> <file>power.c</file> @@ -288,7 +289,6 @@ <file>idle.c</file> <file>job.c</file> <file>kill.c</file> - <file>locale.c</file> <file>notify.c</file> <file>process.c</file> <file>psmgr.c</file>
Removed: trunk/reactos/ntoskrnl/ps/locale.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ps/locale.c?rev=23... ============================================================================== --- trunk/reactos/ntoskrnl/ps/locale.c (original) +++ trunk/reactos/ntoskrnl/ps/locale.c (removed) @@ -1,555 +1,0 @@ -/* $Id$ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/ps/locale.c - * PURPOSE: Locale support - * - * PROGRAMMERS: David Welch (welch@cwcom.net) - */ - -/* INCLUDES *****************************************************************/ - -#include <ntoskrnl.h> - -#define NDEBUG -#include <internal/debug.h> - -#if defined (ALLOC_PRAGMA) -#pragma alloc_text(INIT, PiInitDefaultLocale) -#endif - - -/* GLOBALS *******************************************************************/ - -/* - * Default setting: LANG_NEUTRAL, SUBLANG_NEUTRAL, SORT_DEFAULT - */ -LCID PsDefaultThreadLocaleId = 0; -LCID PsDefaultSystemLocaleId = 0; -BOOL PsDefaultThreadLocaleInitialized = FALSE; - -static LANGID PsInstallUILanguageId = 0; - -#define VALUE_BUFFER_SIZE 256 - -/* FUNCTIONS *****************************************************************/ - -/* - * FUNCTION: - * Initializes the default locale. - * Reads default locale from registry, if available - * ARGUMENTS: - * None. - * Returns: - * None. - */ -VOID -INIT_FUNCTION -NTAPI -PiInitDefaultLocale(VOID) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\Registry\Machine\System\CurrentControlSet\Control\Nls\Language"); - UNICODE_STRING ValueName; - HANDLE KeyHandle; - ULONG ValueLength; - UCHAR ValueBuffer[VALUE_BUFFER_SIZE]; - PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; - UNICODE_STRING ValueString; - ULONG Value; - NTSTATUS Status; - - ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_QUERY_VALUE, - &ObjectAttributes); - if (NT_SUCCESS(Status)) - { - /* Read system locale */ - RtlInitUnicodeString(&ValueName, - L"Default"); - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ)) - { - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &Value); - if (NT_SUCCESS(Status)) - { - DPRINT("System locale: %08lx\n", Value); - PsDefaultSystemLocaleId = (LCID)Value; - } - } - - /* Read install language id */ - RtlInitUnicodeString(&ValueName, - L"InstallLanguage"); - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ)) - { - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &Value); - if (NT_SUCCESS(Status)) - { - DPRINT("Install language id: %04lx\n", Value); - PsInstallUILanguageId = (LANGID)Value; - } - } - - ZwClose(KeyHandle); - } -} - - -/* - * FUNCTION: - * Initializes the default thread locale. - * Reads default locale from registry, if available - * ARGUMENTS: - * None. - * Returns: - * None. - */ -VOID STDCALL -PiInitThreadLocale(VOID) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\Registry\User\.Default\Control Panel\International"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"Locale"); - HANDLE KeyHandle; - ULONG ValueLength; - UCHAR ValueBuffer[VALUE_BUFFER_SIZE]; - PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; - UNICODE_STRING ValueString; - ULONG LocaleValue; - NTSTATUS Status; - - ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; - - /* read default thread locale */ - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_QUERY_VALUE, - &ObjectAttributes); - if (NT_SUCCESS(Status)) - { - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - if ((NT_SUCCESS(Status)) && (ValueInfo->Type == REG_SZ)) - { - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &LocaleValue); - if (NT_SUCCESS(Status)) - { - DPRINT("Thread locale: %08lu\n", LocaleValue); - PsDefaultThreadLocaleId = (LCID)LocaleValue; - } - } - ZwClose(KeyHandle); - } - - PsDefaultThreadLocaleInitialized = TRUE; -} - - -/* - * FUNCTION: - * Returns the default locale. - * ARGUMENTS: - * UserProfile = If TRUE then the locale for this thread is returned, - * otherwise the locale for the system is returned. - * DefaultLocaleId = Points to a variable that receives the locale id. - * Returns: - * Status. - */ -NTSTATUS STDCALL -NtQueryDefaultLocale(IN BOOLEAN UserProfile, - OUT PLCID DefaultLocaleId) -{ - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - - _SEH_TRY - { - if (KeGetPreviousMode() != KernelMode) - { - ProbeForWriteLangid(DefaultLocaleId); - } - - if (UserProfile) - { - if (!PsDefaultThreadLocaleInitialized) - { - PiInitThreadLocale(); - } - - /* set thread locale */ - *DefaultLocaleId = PsDefaultThreadLocaleId; - } - else - { - /* set system locale */ - *DefaultLocaleId = PsDefaultSystemLocaleId; - } - } - _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - return Status; -} - - -/* - * FUNCTION: - * Sets the default locale. - * ARGUMENTS: - * ThreadOrSystem = If TRUE then the locale for this thread is set, - * otherwise the locale for the system is set. - * DefaultLocaleId = The locale id to be set. - * Returns: - * Status. - */ -NTSTATUS STDCALL -NtSetDefaultLocale(IN BOOLEAN UserProfile, - IN LCID DefaultLocaleId) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName; - UNICODE_STRING ValueName; - HANDLE KeyHandle; - ULONG ValueLength; - WCHAR ValueBuffer[20]; - HANDLE UserKey = NULL; - NTSTATUS Status; - - PAGED_CODE(); - - if (UserProfile) - { - /* thread locale */ - Status = RtlOpenCurrentUser(KEY_WRITE, - &UserKey); - if (!NT_SUCCESS(Status)) - return(Status); - RtlInitUnicodeString(&KeyName, - L"Control Panel\International"); - RtlInitUnicodeString(&ValueName, - L"Locale"); - } - else - { - /* system locale */ - RtlInitUnicodeString(&KeyName, - L"\Registry\Machine\System\CurrentControlSet\Control\Nls\Language"); - RtlInitUnicodeString(&ValueName, - L"Default"); - } - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - UserKey, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_SET_VALUE, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - if (UserKey != NULL) - { - ZwClose(UserKey); - } - return(Status); - } - - if (UserProfile) - { - ValueLength = swprintf(ValueBuffer, - L"%08lx", - (ULONG)DefaultLocaleId); - } - else - { - ValueLength = swprintf(ValueBuffer, - L"%04lx", - (ULONG)DefaultLocaleId & 0xFFFF); - } - ValueLength = (ValueLength + 1) * sizeof(WCHAR); - - Status = ZwSetValueKey(KeyHandle, - &ValueName, - 0, - REG_SZ, - ValueBuffer, - ValueLength); - - ZwClose(KeyHandle); - if (UserKey != NULL) - { - ZwClose(UserKey); - } - - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - if (UserProfile) - { - /* set thread locale */ - DPRINT("Thread locale: %08lu\n", DefaultLocaleId); - PsDefaultThreadLocaleId = DefaultLocaleId; - PsDefaultThreadLocaleInitialized = TRUE; - } - else - { - /* set system locale */ - DPRINT("System locale: %08lu\n", DefaultLocaleId); - PsDefaultSystemLocaleId = DefaultLocaleId; - } - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -NtQueryDefaultUILanguage(OUT PLANGID LanguageId) -{ - UCHAR ValueBuffer[VALUE_BUFFER_SIZE]; - PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"Control Panel\International"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"MultiUILanguageId"); - UNICODE_STRING ValueString; - ULONG ValueLength; - ULONG Value; - HANDLE UserKey; - HANDLE KeyHandle; - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - - _SEH_TRY - { - if (KeGetPreviousMode() != KernelMode) - { - ProbeForWriteLangid(LanguageId); - } - - *LanguageId = PsInstallUILanguageId; - } - _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if (!NT_SUCCESS(Status)) - { - return Status; - } - - Status = RtlOpenCurrentUser(KEY_READ, - &UserKey); - if (!NT_SUCCESS(Status)) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - UserKey, - NULL); - Status = ZwOpenKey(&KeyHandle, - KEY_QUERY_VALUE, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer; - - Status = ZwQueryValueKey(KeyHandle, - &ValueName, - KeyValuePartialInformation, - ValueBuffer, - VALUE_BUFFER_SIZE, - &ValueLength); - - ZwClose(KeyHandle); - ZwClose(UserKey); - - if (!NT_SUCCESS(Status) || ValueInfo->Type != REG_SZ) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - ValueString.Length = ValueInfo->DataLength; - ValueString.MaximumLength = ValueInfo->DataLength; - ValueString.Buffer = (PWSTR)ValueInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueString, - 16, - &Value); - if (!NT_SUCCESS(Status)) - { - Value = PsInstallUILanguageId; - goto ReturnSuccess; - } - - DPRINT("Default language id: %04lx\n", Value); - -ReturnSuccess: - _SEH_TRY - { - *LanguageId = Value; - Status = STATUS_SUCCESS; - } - _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - return Status; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -NtQueryInstallUILanguage(OUT PLANGID LanguageId) -{ - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - - _SEH_TRY - { - if (KeGetPreviousMode() != KernelMode) - { - ProbeForWriteLangid(LanguageId); - } - - *LanguageId = PsInstallUILanguageId; - } - _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - return Status; -} - - -/* - * @implemented - */ -NTSTATUS STDCALL -NtSetDefaultUILanguage(IN LANGID LanguageId) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"Control Panel\Desktop"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"MultiUILanguageId"); - WCHAR ValueBuffer[8]; - ULONG ValueLength; - HANDLE UserHandle; - HANDLE KeyHandle; - NTSTATUS Status; - - PAGED_CODE(); - - Status = RtlOpenCurrentUser(KEY_WRITE, - &UserHandle); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - UserHandle, - NULL); - - Status = ZwOpenKey(&KeyHandle, - KEY_SET_VALUE, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - ZwClose(UserHandle); - return Status; - } - - ValueLength = swprintf(ValueBuffer, - L"%04lX", - (ULONG)LanguageId); - ValueLength = (ValueLength + 1) * sizeof(WCHAR); - - Status = ZwSetValueKey(KeyHandle, - &ValueName, - 0, - REG_SZ, - ValueBuffer, - ValueLength); - - ZwClose(KeyHandle); - ZwClose(UserHandle); - - return Status; -} - -/* EOF */