From a7c190d35f7196b131567b49193803154521c309 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 4 Oct 2019 21:48:32 +0200 Subject: [PATCH] kernel32: Move system locale enumeration functions to kernelbase. Signed-off-by: Alexandre Julliard --- dlls/kernel32/kernel32.spec | 16 +- dlls/kernel32/locale.c | 690 +------------------------------- dlls/kernelbase/kernelbase.h | 1 + dlls/kernelbase/kernelbase.spec | 24 +- dlls/kernelbase/locale.c | 354 ++++++++++++++++ dlls/kernelbase/main.c | 3 + loader/wine.inf.in | 366 ++++++++++------- 7 files changed, 617 insertions(+), 837 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 6ffd717afa8..23c25b7acd8 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -403,7 +403,7 @@ @ stdcall EnumDateFormatsExW(ptr long long) @ stdcall EnumDateFormatsW(ptr long long) @ stdcall EnumLanguageGroupLocalesA(ptr long long ptr) -@ stdcall EnumLanguageGroupLocalesW(ptr long long ptr) +@ stdcall -import EnumLanguageGroupLocalesW(ptr long long ptr) @ stdcall EnumResourceLanguagesA(long str str ptr long) @ stdcall -import EnumResourceLanguagesExA(long str str ptr long long long) @ stdcall -import EnumResourceLanguagesExW(long wstr wstr ptr long long long) @@ -417,19 +417,19 @@ @ stdcall -import EnumResourceTypesExW(long ptr long long long) @ stdcall EnumResourceTypesW(long ptr long) @ stdcall EnumSystemCodePagesA(ptr long) -@ stdcall EnumSystemCodePagesW(ptr long) +@ stdcall -import EnumSystemCodePagesW(ptr long) @ stdcall EnumSystemFirmwareTables(long ptr long) @ stdcall EnumSystemGeoID(long long ptr) @ stdcall EnumSystemLanguageGroupsA(ptr long ptr) -@ stdcall EnumSystemLanguageGroupsW(ptr long ptr) -@ stdcall EnumSystemLocalesA(ptr long) -@ stdcall EnumSystemLocalesEx(ptr long long ptr) -@ stdcall EnumSystemLocalesW(ptr long) +@ stdcall -import EnumSystemLanguageGroupsW(ptr long ptr) +@ stdcall -import EnumSystemLocalesA(ptr long) +@ stdcall -import EnumSystemLocalesEx(ptr long long ptr) +@ stdcall -import EnumSystemLocalesW(ptr long) @ stdcall EnumTimeFormatsA(ptr long long) @ stdcall EnumTimeFormatsEx(ptr wstr long long) @ stdcall EnumTimeFormatsW(ptr long long) @ stdcall EnumUILanguagesA(ptr long long) -@ stdcall EnumUILanguagesW(ptr long long) +@ stdcall -import EnumUILanguagesW(ptr long long) # @ stub EnumerateLocalComputerNamesA # @ stub EnumerateLocalComputerNamesW @ stdcall -arch=x86_64 EnterUmsSchedulingMode(ptr) @@ -990,7 +990,7 @@ # @ stub IsTimeZoneRedirectionEnabled # @ stub IsValidCalDateTime @ stdcall IsValidCodePage(long) -@ stdcall IsValidLanguageGroup(long long) +@ stdcall -import IsValidLanguageGroup(long long) @ stdcall IsValidLocale(long long) @ stdcall IsValidLocaleName(wstr) # @ stub IsValidUILanguage diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c index f4a76b4c96c..19160004b93 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -59,25 +59,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(nls); #define WC_FLAGSMASK (WC_DISCARDNS|WC_SEPCHARS|WC_DEFAULTCHAR|WC_ERR_INVALID_CHARS|\ WC_COMPOSITECHECK|WC_NO_BEST_FIT_CHARS) +extern BOOL WINAPI Internal_EnumLanguageGroupLocales( LANGGROUPLOCALE_ENUMPROCW proc, LGRPID id, + DWORD flags, LONG_PTR param, BOOL unicode ); +extern BOOL WINAPI Internal_EnumSystemCodePages( CODEPAGE_ENUMPROCW proc, DWORD flags, BOOL unicode ); +extern BOOL WINAPI Internal_EnumSystemLanguageGroups( LANGUAGEGROUP_ENUMPROCW proc, DWORD flags, + LONG_PTR param, BOOL unicode ); +extern BOOL WINAPI Internal_EnumUILanguages( UILANGUAGE_ENUMPROCW proc, DWORD flags, + LONG_PTR param, BOOL unicode ); + /* current code pages */ static const union cptable *ansi_cptable; static const union cptable *oem_cptable; static const union cptable *mac_cptable; static const union cptable *unix_cptable; /* NULL if UTF8 */ -static const WCHAR szLocaleKeyName[] = { - '\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e','\\','S','y','s','t','e','m','\\', - 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', - 'C','o','n','t','r','o','l','\\','N','l','s','\\','L','o','c','a','l','e',0 -}; - -static const WCHAR szLangGroupsKeyName[] = { - '\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e','\\','S','y','s','t','e','m','\\', - 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', - 'C','o','n','t','r','o','l','\\','N','l','s','\\', - 'L','a','n','g','u','a','g','e',' ','G','r','o','u','p','s',0 -}; - /* Charset to codepage map, sorted by name. */ static const struct charset_entry { @@ -2115,58 +2110,10 @@ BOOL WINAPI GetCPInfoExW( UINT codepage, DWORD dwFlags, LPCPINFOEXW cpinfo ) /*********************************************************************** * EnumSystemCodePagesA (KERNEL32.@) - * - * Call a user defined function for every code page installed on the system. - * - * PARAMS - * lpfnCodePageEnum [I] User CODEPAGE_ENUMPROC to call with each found code page - * flags [I] Reserved, set to 0. - * - * RETURNS - * TRUE, If all code pages have been enumerated, or - * FALSE if lpfnCodePageEnum returned FALSE to stop the enumeration. */ -BOOL WINAPI EnumSystemCodePagesA( CODEPAGE_ENUMPROCA lpfnCodePageEnum, DWORD flags ) +BOOL WINAPI EnumSystemCodePagesA( CODEPAGE_ENUMPROCA proc, DWORD flags ) { - const union cptable *table; - char buffer[10]; - int index = 0; - - for (;;) - { - if (!(table = wine_cp_enum_table( index++ ))) break; - sprintf( buffer, "%d", table->info.codepage ); - if (!lpfnCodePageEnum( buffer )) break; - } - return TRUE; -} - - -/*********************************************************************** - * EnumSystemCodePagesW (KERNEL32.@) - * - * See EnumSystemCodePagesA. - */ -BOOL WINAPI EnumSystemCodePagesW( CODEPAGE_ENUMPROCW lpfnCodePageEnum, DWORD flags ) -{ - const union cptable *table; - WCHAR buffer[10], *p; - int page, index = 0; - - for (;;) - { - if (!(table = wine_cp_enum_table( index++ ))) break; - p = buffer + ARRAY_SIZE( buffer ); - *--p = 0; - page = table->info.codepage; - do - { - *--p = '0' + (page % 10); - page /= 10; - } while( page ); - if (!lpfnCodePageEnum( p )) break; - } - return TRUE; + return Internal_EnumSystemCodePages( (CODEPAGE_ENUMPROCW)proc, flags, FALSE ); } @@ -2733,113 +2680,6 @@ BOOL WINAPI IsValidLocaleName( LPCWSTR locale ) return locale_name.matches > 0; } -static BOOL CALLBACK enum_lang_proc_a( HMODULE hModule, LPCSTR type, - LPCSTR name, WORD LangID, LONG_PTR lParam ) -{ - LOCALE_ENUMPROCA lpfnLocaleEnum = (LOCALE_ENUMPROCA)lParam; - char buf[20]; - - sprintf(buf, "%08x", (UINT)LangID); - return lpfnLocaleEnum( buf ); -} - -static BOOL CALLBACK enum_lang_proc_w( HMODULE hModule, LPCWSTR type, - LPCWSTR name, WORD LangID, LONG_PTR lParam ) -{ - static const WCHAR formatW[] = {'%','0','8','x',0}; - LOCALE_ENUMPROCW lpfnLocaleEnum = (LOCALE_ENUMPROCW)lParam; - WCHAR buf[20]; - sprintfW( buf, formatW, (UINT)LangID ); - return lpfnLocaleEnum( buf ); -} - -/****************************************************************************** - * EnumSystemLocalesA (KERNEL32.@) - * - * Call a users function for each locale available on the system. - * - * PARAMS - * lpfnLocaleEnum [I] Callback function to call for each locale - * dwFlags [I] LOCALE_SUPPORTED=All supported, LOCALE_INSTALLED=Installed only - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. Use GetLastError() to determine the cause. - */ -BOOL WINAPI EnumSystemLocalesA( LOCALE_ENUMPROCA lpfnLocaleEnum, DWORD dwFlags ) -{ - TRACE("(%p,%08x)\n", lpfnLocaleEnum, dwFlags); - EnumResourceLanguagesA( kernel32_handle, (LPSTR)RT_STRING, - (LPCSTR)LOCALE_ILANGUAGE, enum_lang_proc_a, - (LONG_PTR)lpfnLocaleEnum); - return TRUE; -} - - -/****************************************************************************** - * EnumSystemLocalesW (KERNEL32.@) - * - * See EnumSystemLocalesA. - */ -BOOL WINAPI EnumSystemLocalesW( LOCALE_ENUMPROCW lpfnLocaleEnum, DWORD dwFlags ) -{ - TRACE("(%p,%08x)\n", lpfnLocaleEnum, dwFlags); - EnumResourceLanguagesW( kernel32_handle, (LPWSTR)RT_STRING, - (LPCWSTR)LOCALE_ILANGUAGE, enum_lang_proc_w, - (LONG_PTR)lpfnLocaleEnum); - return TRUE; -} - - -struct enum_locale_ex_data -{ - LOCALE_ENUMPROCEX proc; - DWORD flags; - LPARAM lparam; -}; - -static BOOL CALLBACK enum_locale_ex_proc( HMODULE module, LPCWSTR type, - LPCWSTR name, WORD lang, LONG_PTR lparam ) -{ - struct enum_locale_ex_data *data = (struct enum_locale_ex_data *)lparam; - WCHAR buffer[256]; - DWORD neutral; - unsigned int flags; - - GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ), LOCALE_SNAME | LOCALE_NOUSEROVERRIDE, - buffer, ARRAY_SIZE( buffer )); - if (!GetLocaleInfoW( MAKELCID( lang, SORT_DEFAULT ), - LOCALE_INEUTRAL | LOCALE_NOUSEROVERRIDE | LOCALE_RETURN_NUMBER, - (LPWSTR)&neutral, sizeof(neutral) / sizeof(WCHAR) )) - neutral = 0; - flags = LOCALE_WINDOWS; - flags |= neutral ? LOCALE_NEUTRALDATA : LOCALE_SPECIFICDATA; - if (data->flags && !(data->flags & flags)) return TRUE; - return data->proc( buffer, flags, data->lparam ); -} - -/****************************************************************************** - * EnumSystemLocalesEx (KERNEL32.@) - */ -BOOL WINAPI EnumSystemLocalesEx( LOCALE_ENUMPROCEX proc, DWORD flags, LPARAM lparam, LPVOID reserved ) -{ - struct enum_locale_ex_data data; - - if (reserved) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - data.proc = proc; - data.flags = flags; - data.lparam = lparam; - EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING, - (LPCWSTR)MAKEINTRESOURCE((LOCALE_SNAME >> 4) + 1), - enum_locale_ex_proc, (LONG_PTR)&data ); - return TRUE; -} - - /****************************************************************************** * GetStringTypeW (KERNEL32.@) * @@ -3894,437 +3734,21 @@ static HANDLE NLS_RegOpenKey(HANDLE hRootKey, LPCWSTR szKeyName) return hkey; } -static BOOL NLS_RegEnumValue(HANDLE hKey, UINT ulIndex, - LPWSTR szValueName, ULONG valueNameSize, - LPWSTR szValueData, ULONG valueDataSize) -{ - BYTE buffer[80]; - KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)buffer; - DWORD dwLen; - - if (NtEnumerateValueKey( hKey, ulIndex, KeyValueFullInformation, - buffer, sizeof(buffer), &dwLen ) != STATUS_SUCCESS || - info->NameLength > valueNameSize || - info->DataLength > valueDataSize) - { - return FALSE; - } - - TRACE("info->Name %s info->DataLength %d\n", debugstr_w(info->Name), info->DataLength); - - memcpy( szValueName, info->Name, info->NameLength); - szValueName[info->NameLength / sizeof(WCHAR)] = '\0'; - memcpy( szValueData, buffer + info->DataOffset, info->DataLength ); - szValueData[info->DataLength / sizeof(WCHAR)] = '\0'; - - TRACE("returning %s %s\n", debugstr_w(szValueName), debugstr_w(szValueData)); - return TRUE; -} - -static BOOL NLS_RegGetDword(HANDLE hKey, LPCWSTR szValueName, DWORD *lpVal) -{ - BYTE buffer[128]; - const KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer; - DWORD dwSize = sizeof(buffer); - UNICODE_STRING valueName; - - RtlInitUnicodeString( &valueName, szValueName ); - - TRACE("%p, %s\n", hKey, debugstr_w(szValueName)); - if (NtQueryValueKey( hKey, &valueName, KeyValuePartialInformation, - buffer, dwSize, &dwSize ) == STATUS_SUCCESS && - info->DataLength == sizeof(DWORD)) - { - memcpy(lpVal, info->Data, sizeof(DWORD)); - return TRUE; - } - - return FALSE; -} - -static BOOL NLS_GetLanguageGroupName(LGRPID lgrpid, LPWSTR szName, ULONG nameSize) -{ - LANGID langId; - LPCWSTR szResourceName = MAKEINTRESOURCEW(((lgrpid + 0x2000) >> 4) + 1); - HRSRC hResource; - BOOL bRet = FALSE; - - /* FIXME: Is it correct to use the system default langid? */ - langId = GetSystemDefaultLangID(); - - if (SUBLANGID(langId) == SUBLANG_NEUTRAL) langId = get_default_sublang( langId ); - - hResource = FindResourceExW( kernel32_handle, (LPWSTR)RT_STRING, szResourceName, langId ); - - if (hResource) - { - HGLOBAL hResDir = LoadResource( kernel32_handle, hResource ); - - if (hResDir) - { - ULONG iResourceIndex = lgrpid & 0xf; - LPCWSTR lpResEntry = LockResource( hResDir ); - ULONG i; - - for (i = 0; i < iResourceIndex; i++) - lpResEntry += *lpResEntry + 1; - - if (*lpResEntry < nameSize) - { - memcpy( szName, lpResEntry + 1, *lpResEntry * sizeof(WCHAR) ); - szName[*lpResEntry] = '\0'; - bRet = TRUE; - } - - } - FreeResource( hResource ); - } - return bRet; -} - -/* Callback function ptrs for EnumSystemLanguageGroupsA/W */ -typedef struct -{ - LANGUAGEGROUP_ENUMPROCA procA; - LANGUAGEGROUP_ENUMPROCW procW; - DWORD dwFlags; - LONG_PTR lParam; -} ENUMLANGUAGEGROUP_CALLBACKS; - -/* Internal implementation of EnumSystemLanguageGroupsA/W */ -static BOOL NLS_EnumSystemLanguageGroups(ENUMLANGUAGEGROUP_CALLBACKS *lpProcs) -{ - WCHAR szNumber[10], szValue[4]; - HANDLE hKey; - BOOL bContinue = TRUE; - ULONG ulIndex = 0; - - if (!lpProcs) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - switch (lpProcs->dwFlags) - { - case 0: - /* Default to LGRPID_INSTALLED */ - lpProcs->dwFlags = LGRPID_INSTALLED; - /* Fall through... */ - case LGRPID_INSTALLED: - case LGRPID_SUPPORTED: - break; - default: - SetLastError(ERROR_INVALID_FLAGS); - return FALSE; - } - - hKey = NLS_RegOpenKey( 0, szLangGroupsKeyName ); - - if (!hKey) - FIXME("NLS registry key not found. Please apply the default registry file 'wine.inf'\n"); - - while (bContinue) - { - if (NLS_RegEnumValue( hKey, ulIndex, szNumber, sizeof(szNumber), - szValue, sizeof(szValue) )) - { - BOOL bInstalled = szValue[0] == '1'; - LGRPID lgrpid = strtoulW( szNumber, NULL, 16 ); - - TRACE("grpid %s (%sinstalled)\n", debugstr_w(szNumber), - bInstalled ? "" : "not "); - - if (lpProcs->dwFlags == LGRPID_SUPPORTED || bInstalled) - { - WCHAR szGrpName[48]; - - if (!NLS_GetLanguageGroupName( lgrpid, szGrpName, ARRAY_SIZE( szGrpName ))) - szGrpName[0] = '\0'; - - if (lpProcs->procW) - bContinue = lpProcs->procW( lgrpid, szNumber, szGrpName, lpProcs->dwFlags, - lpProcs->lParam ); - else - { - char szNumberA[ARRAY_SIZE( szNumber )]; - char szGrpNameA[48]; - - /* FIXME: MSDN doesn't say which code page the W->A translation uses, - * or whether the language names are ever localised. Assume CP_ACP. - */ - - WideCharToMultiByte(CP_ACP, 0, szNumber, -1, szNumberA, sizeof(szNumberA), 0, 0); - WideCharToMultiByte(CP_ACP, 0, szGrpName, -1, szGrpNameA, sizeof(szGrpNameA), 0, 0); - - bContinue = lpProcs->procA( lgrpid, szNumberA, szGrpNameA, lpProcs->dwFlags, - lpProcs->lParam ); - } - } - - ulIndex++; - } - else - bContinue = FALSE; - - if (!bContinue) - break; - } - - if (hKey) - NtClose( hKey ); - - return TRUE; -} - /****************************************************************************** * EnumSystemLanguageGroupsA (KERNEL32.@) - * - * Call a users function for each language group available on the system. - * - * PARAMS - * pLangGrpEnumProc [I] Callback function to call for each language group - * dwFlags [I] LGRPID_SUPPORTED=All Supported, LGRPID_INSTALLED=Installed only - * lParam [I] User parameter to pass to pLangGrpEnumProc - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. Use GetLastError() to determine the cause. */ -BOOL WINAPI EnumSystemLanguageGroupsA(LANGUAGEGROUP_ENUMPROCA pLangGrpEnumProc, - DWORD dwFlags, LONG_PTR lParam) +BOOL WINAPI EnumSystemLanguageGroupsA( LANGUAGEGROUP_ENUMPROCA proc, DWORD flags, LONG_PTR param ) { - ENUMLANGUAGEGROUP_CALLBACKS procs; - - TRACE("(%p,0x%08X,0x%08lX)\n", pLangGrpEnumProc, dwFlags, lParam); - - procs.procA = pLangGrpEnumProc; - procs.procW = NULL; - procs.dwFlags = dwFlags; - procs.lParam = lParam; - - return NLS_EnumSystemLanguageGroups( pLangGrpEnumProc ? &procs : NULL); -} - -/****************************************************************************** - * EnumSystemLanguageGroupsW (KERNEL32.@) - * - * See EnumSystemLanguageGroupsA. - */ -BOOL WINAPI EnumSystemLanguageGroupsW(LANGUAGEGROUP_ENUMPROCW pLangGrpEnumProc, - DWORD dwFlags, LONG_PTR lParam) -{ - ENUMLANGUAGEGROUP_CALLBACKS procs; - - TRACE("(%p,0x%08X,0x%08lX)\n", pLangGrpEnumProc, dwFlags, lParam); - - procs.procA = NULL; - procs.procW = pLangGrpEnumProc; - procs.dwFlags = dwFlags; - procs.lParam = lParam; - - return NLS_EnumSystemLanguageGroups( pLangGrpEnumProc ? &procs : NULL); -} - -/****************************************************************************** - * IsValidLanguageGroup (KERNEL32.@) - * - * Determine if a language group is supported and/or installed. - * - * PARAMS - * lgrpid [I] Language Group Id (LGRPID_ values from "winnls.h") - * dwFlags [I] LGRPID_SUPPORTED=Supported, LGRPID_INSTALLED=Installed - * - * RETURNS - * TRUE, if lgrpid is supported and/or installed, according to dwFlags. - * FALSE otherwise. - */ -BOOL WINAPI IsValidLanguageGroup(LGRPID lgrpid, DWORD dwFlags) -{ - static const WCHAR szFormat[] = { '%','x','\0' }; - WCHAR szValueName[16], szValue[2]; - BOOL bSupported = FALSE, bInstalled = FALSE; - HANDLE hKey; - - - switch (dwFlags) - { - case LGRPID_INSTALLED: - case LGRPID_SUPPORTED: - - hKey = NLS_RegOpenKey( 0, szLangGroupsKeyName ); - - sprintfW( szValueName, szFormat, lgrpid ); - - if (NLS_RegGetDword( hKey, szValueName, (LPDWORD)szValue )) - { - bSupported = TRUE; - - if (szValue[0] == '1') - bInstalled = TRUE; - } - - if (hKey) - NtClose( hKey ); - - break; - } - - if ((dwFlags == LGRPID_SUPPORTED && bSupported) || - (dwFlags == LGRPID_INSTALLED && bInstalled)) - return TRUE; - - return FALSE; -} - -/* Callback function ptrs for EnumLanguageGrouplocalesA/W */ -typedef struct -{ - LANGGROUPLOCALE_ENUMPROCA procA; - LANGGROUPLOCALE_ENUMPROCW procW; - DWORD dwFlags; - LGRPID lgrpid; - LONG_PTR lParam; -} ENUMLANGUAGEGROUPLOCALE_CALLBACKS; - -/* Internal implementation of EnumLanguageGrouplocalesA/W */ -static BOOL NLS_EnumLanguageGroupLocales(ENUMLANGUAGEGROUPLOCALE_CALLBACKS *lpProcs) -{ - static const WCHAR szAlternateSortsKeyName[] = { - 'A','l','t','e','r','n','a','t','e',' ','S','o','r','t','s','\0' - }; - WCHAR szNumber[10], szValue[4]; - HANDLE hKey; - BOOL bContinue = TRUE, bAlternate = FALSE; - LGRPID lgrpid; - ULONG ulIndex = 1; /* Ignore default entry of 1st key */ - - if (!lpProcs || !lpProcs->lgrpid || lpProcs->lgrpid > LGRPID_ARMENIAN) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if (lpProcs->dwFlags) - { - SetLastError(ERROR_INVALID_FLAGS); - return FALSE; - } - - hKey = NLS_RegOpenKey( 0, szLocaleKeyName ); - - if (!hKey) - WARN("NLS registry key not found. Please apply the default registry file 'wine.inf'\n"); - - while (bContinue) - { - if (NLS_RegEnumValue( hKey, ulIndex, szNumber, sizeof(szNumber), - szValue, sizeof(szValue) )) - { - lgrpid = strtoulW( szValue, NULL, 16 ); - - TRACE("lcid %s, grpid %d (%smatched)\n", debugstr_w(szNumber), - lgrpid, lgrpid == lpProcs->lgrpid ? "" : "not "); - - if (lgrpid == lpProcs->lgrpid) - { - LCID lcid; - - lcid = strtoulW( szNumber, NULL, 16 ); - - /* FIXME: native returns extra text for a few (17/150) locales, e.g: - * '00000437 ;Georgian' - * At present we only pass the LCID string. - */ - - if (lpProcs->procW) - bContinue = lpProcs->procW( lgrpid, lcid, szNumber, lpProcs->lParam ); - else - { - char szNumberA[ARRAY_SIZE( szNumber )]; - - WideCharToMultiByte(CP_ACP, 0, szNumber, -1, szNumberA, sizeof(szNumberA), 0, 0); - - bContinue = lpProcs->procA( lgrpid, lcid, szNumberA, lpProcs->lParam ); - } - } - - ulIndex++; - } - else - { - /* Finished enumerating this key */ - if (!bAlternate) - { - /* Enumerate alternate sorts also */ - hKey = NLS_RegOpenKey( hKey, szAlternateSortsKeyName ); - bAlternate = TRUE; - ulIndex = 0; - } - else - bContinue = FALSE; /* Finished both keys */ - } - - if (!bContinue) - break; - } - - if (hKey) - NtClose( hKey ); - - return TRUE; + return Internal_EnumSystemLanguageGroups( (LANGUAGEGROUP_ENUMPROCW)proc, flags, param, FALSE ); } /****************************************************************************** * EnumLanguageGroupLocalesA (KERNEL32.@) - * - * Call a users function for every locale in a language group available on the system. - * - * PARAMS - * pLangGrpLcEnumProc [I] Callback function to call for each locale - * lgrpid [I] Language group (LGRPID_ values from "winnls.h") - * dwFlags [I] Reserved, set to 0 - * lParam [I] User parameter to pass to pLangGrpLcEnumProc - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. Use GetLastError() to determine the cause. */ -BOOL WINAPI EnumLanguageGroupLocalesA(LANGGROUPLOCALE_ENUMPROCA pLangGrpLcEnumProc, - LGRPID lgrpid, DWORD dwFlags, LONG_PTR lParam) +BOOL WINAPI EnumLanguageGroupLocalesA( LANGGROUPLOCALE_ENUMPROCA proc, LGRPID id, + DWORD flags, LONG_PTR param ) { - ENUMLANGUAGEGROUPLOCALE_CALLBACKS callbacks; - - TRACE("(%p,0x%08X,0x%08X,0x%08lX)\n", pLangGrpLcEnumProc, lgrpid, dwFlags, lParam); - - callbacks.procA = pLangGrpLcEnumProc; - callbacks.procW = NULL; - callbacks.dwFlags = dwFlags; - callbacks.lgrpid = lgrpid; - callbacks.lParam = lParam; - - return NLS_EnumLanguageGroupLocales( pLangGrpLcEnumProc ? &callbacks : NULL ); -} - -/****************************************************************************** - * EnumLanguageGroupLocalesW (KERNEL32.@) - * - * See EnumLanguageGroupLocalesA. - */ -BOOL WINAPI EnumLanguageGroupLocalesW(LANGGROUPLOCALE_ENUMPROCW pLangGrpLcEnumProc, - LGRPID lgrpid, DWORD dwFlags, LONG_PTR lParam) -{ - ENUMLANGUAGEGROUPLOCALE_CALLBACKS callbacks; - - TRACE("(%p,0x%08X,0x%08X,0x%08lX)\n", pLangGrpLcEnumProc, lgrpid, dwFlags, lParam); - - callbacks.procA = NULL; - callbacks.procW = pLangGrpLcEnumProc; - callbacks.dwFlags = dwFlags; - callbacks.lgrpid = lgrpid; - callbacks.lParam = lParam; - - return NLS_EnumLanguageGroupLocales( pLangGrpLcEnumProc ? &callbacks : NULL ); + return Internal_EnumLanguageGroupLocales( (LANGGROUPLOCALE_ENUMPROCW)proc, id, flags, param, FALSE ); } /****************************************************************************** @@ -4420,94 +3844,14 @@ BOOL WINAPI SetUserGeoID( GEOID GeoID ) return TRUE; } -typedef struct -{ - union - { - UILANGUAGE_ENUMPROCA procA; - UILANGUAGE_ENUMPROCW procW; - } u; - DWORD flags; - LONG_PTR param; -} ENUM_UILANG_CALLBACK; - -static BOOL CALLBACK enum_uilang_proc_a( HMODULE hModule, LPCSTR type, - LPCSTR name, WORD LangID, LONG_PTR lParam ) -{ - ENUM_UILANG_CALLBACK *enum_uilang = (ENUM_UILANG_CALLBACK *)lParam; - char buf[20]; - - sprintf(buf, "%08x", (UINT)LangID); - return enum_uilang->u.procA( buf, enum_uilang->param ); -} - -static BOOL CALLBACK enum_uilang_proc_w( HMODULE hModule, LPCWSTR type, - LPCWSTR name, WORD LangID, LONG_PTR lParam ) -{ - static const WCHAR formatW[] = {'%','0','8','x',0}; - ENUM_UILANG_CALLBACK *enum_uilang = (ENUM_UILANG_CALLBACK *)lParam; - WCHAR buf[20]; - - sprintfW( buf, formatW, (UINT)LangID ); - return enum_uilang->u.procW( buf, enum_uilang->param ); -} - /****************************************************************************** * EnumUILanguagesA (KERNEL32.@) */ -BOOL WINAPI EnumUILanguagesA(UILANGUAGE_ENUMPROCA pUILangEnumProc, DWORD dwFlags, LONG_PTR lParam) +BOOL WINAPI EnumUILanguagesA( UILANGUAGE_ENUMPROCA proc, DWORD flags, LONG_PTR param ) { - ENUM_UILANG_CALLBACK enum_uilang; - - TRACE("%p, %x, %lx\n", pUILangEnumProc, dwFlags, lParam); - - if(!pUILangEnumProc) { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - if(dwFlags & ~MUI_LANGUAGE_ID) { - SetLastError(ERROR_INVALID_FLAGS); - return FALSE; - } - - enum_uilang.u.procA = pUILangEnumProc; - enum_uilang.flags = dwFlags; - enum_uilang.param = lParam; - - EnumResourceLanguagesA( kernel32_handle, (LPCSTR)RT_STRING, - (LPCSTR)LOCALE_ILANGUAGE, enum_uilang_proc_a, - (LONG_PTR)&enum_uilang); - return TRUE; + return Internal_EnumUILanguages( (UILANGUAGE_ENUMPROCW)proc, flags, param, FALSE ); } -/****************************************************************************** - * EnumUILanguagesW (KERNEL32.@) - */ -BOOL WINAPI EnumUILanguagesW(UILANGUAGE_ENUMPROCW pUILangEnumProc, DWORD dwFlags, LONG_PTR lParam) -{ - ENUM_UILANG_CALLBACK enum_uilang; - - TRACE("%p, %x, %lx\n", pUILangEnumProc, dwFlags, lParam); - - - if(!pUILangEnumProc) { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - if(dwFlags & ~MUI_LANGUAGE_ID) { - SetLastError(ERROR_INVALID_FLAGS); - return FALSE; - } - - enum_uilang.u.procW = pUILangEnumProc; - enum_uilang.flags = dwFlags; - enum_uilang.param = lParam; - - EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING, - (LPCWSTR)LOCALE_ILANGUAGE, enum_uilang_proc_w, - (LONG_PTR)&enum_uilang); - return TRUE; -} enum locationkind { LOCATION_NATION = 0, diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h index 78c4f581307..6203877aeb0 100644 --- a/dlls/kernelbase/kernelbase.h +++ b/dlls/kernelbase/kernelbase.h @@ -30,6 +30,7 @@ extern void init_startup_info( RTL_USER_PROCESS_PARAMETERS *params ) DECLSPEC_HI extern const WCHAR windows_dir[] DECLSPEC_HIDDEN; extern const WCHAR system_dir[] DECLSPEC_HIDDEN; +extern HANDLE kernel32_handle DECLSPEC_HIDDEN; static inline BOOL is_console_handle(HANDLE h) { diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 3a4608b532b..c1fa479525b 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -298,7 +298,7 @@ @ stdcall EnumDateFormatsW(ptr long long) kernel32.EnumDateFormatsW # @ stub EnumDeviceDrivers @ stdcall EnumDynamicTimeZoneInformation(long ptr) -@ stdcall EnumLanguageGroupLocalesW(ptr long long ptr) kernel32.EnumLanguageGroupLocalesW +@ stdcall EnumLanguageGroupLocalesW(ptr long long ptr) # @ stub EnumPageFilesA # @ stub EnumPageFilesW # @ stub EnumProcessModules @@ -311,16 +311,16 @@ @ stdcall EnumResourceNamesW(long wstr ptr long) @ stdcall EnumResourceTypesExA(long ptr long long long) @ stdcall EnumResourceTypesExW(long ptr long long long) -@ stdcall EnumSystemCodePagesW(ptr long) kernel32.EnumSystemCodePagesW +@ stdcall EnumSystemCodePagesW(ptr long) @ stdcall EnumSystemFirmwareTables(long ptr long) kernel32.EnumSystemFirmwareTables @ stdcall EnumSystemGeoID(long long ptr) kernel32.EnumSystemGeoID -@ stdcall EnumSystemLanguageGroupsW(ptr long ptr) kernel32.EnumSystemLanguageGroupsW -@ stdcall EnumSystemLocalesA(ptr long) kernel32.EnumSystemLocalesA -@ stdcall EnumSystemLocalesEx(ptr long long ptr) kernel32.EnumSystemLocalesEx -@ stdcall EnumSystemLocalesW(ptr long) kernel32.EnumSystemLocalesW +@ stdcall EnumSystemLanguageGroupsW(ptr long ptr) +@ stdcall EnumSystemLocalesA(ptr long) +@ stdcall EnumSystemLocalesEx(ptr long long ptr) +@ stdcall EnumSystemLocalesW(ptr long) @ stdcall EnumTimeFormatsEx(ptr wstr long long) kernel32.EnumTimeFormatsEx @ stdcall EnumTimeFormatsW(ptr long long) kernel32.EnumTimeFormatsW -@ stdcall EnumUILanguagesW(ptr long long) kernel32.EnumUILanguagesW +@ stdcall EnumUILanguagesW(ptr long long) # @ stub EnumerateStateAtomValues # @ stub EnumerateStateContainerItems @ stub EqualDomainSid @@ -826,12 +826,12 @@ @ stub InternalLcidToName @ stub Internal_EnumCalendarInfo @ stub Internal_EnumDateFormats -@ stub Internal_EnumLanguageGroupLocales -@ stub Internal_EnumSystemCodePages -@ stub Internal_EnumSystemLanguageGroups +@ stdcall Internal_EnumLanguageGroupLocales(ptr long long ptr long) +@ stdcall Internal_EnumSystemCodePages(ptr long long) +@ stdcall Internal_EnumSystemLanguageGroups(ptr long ptr long) @ stub Internal_EnumSystemLocales @ stub Internal_EnumTimeFormats -@ stub Internal_EnumUILanguages +@ stdcall Internal_EnumUILanguages(ptr long long long) # @ stub InternetTimeFromSystemTimeA # @ stub InternetTimeFromSystemTimeW # @ stub InternetTimeToSystemTimeA @@ -875,7 +875,7 @@ @ stdcall IsTokenRestricted(long) @ stdcall IsValidAcl(ptr) @ stdcall IsValidCodePage(long) kernel32.IsValidCodePage -@ stdcall IsValidLanguageGroup(long long) kernel32.IsValidLanguageGroup +@ stdcall IsValidLanguageGroup(long long) @ stdcall IsValidLocale(long long) kernel32.IsValidLocale @ stdcall IsValidLocaleName(wstr) kernel32.IsValidLocaleName # @ stub IsValidNLSVersion diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 027128780e6..204137bf809 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -24,12 +24,15 @@ */ #include +#include #include "ntstatus.h" #define WIN32_NO_STATUS #include "windef.h" #include "winbase.h" +#include "winreg.h" #include "winnls.h" +#include "winuser.h" #include "winternl.h" #include "kernelbase.h" #include "wine/debug.h" @@ -37,6 +40,198 @@ WINE_DEFAULT_DEBUG_CHANNEL(nls); +static const WCHAR codepages_key[] = +{ 'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t', + '\\','C','o','n','t','r','o','l','\\','N','l','s','\\','C','o','d','e','P','a','g','e',0}; +static const WCHAR language_groups_key[] = +{ 'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t', + '\\','C','o','n','t','r','o','l','\\','N','l','s', + '\\','L','a','n','g','u','a','g','e',' ','G','r','o','u','p','s',0 }; +static const WCHAR locales_key[] = +{ 'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t', + '\\','C','o','n','t','r','o','l','\\','N','l','s','\\','L','o','c','a','l','e',0}; +static const WCHAR altsort_key[] = {'A','l','t','e','r','n','a','t','e',' ','S','o','r','t','s',0}; + + +/****************************************************************************** + * Internal_EnumLanguageGroupLocales (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumLanguageGroupLocales( LANGGROUPLOCALE_ENUMPROCW proc, LGRPID id, + DWORD flags, LONG_PTR param, BOOL unicode ) +{ + WCHAR name[10], value[10]; + DWORD name_len, value_len, type, index = 0, alt = 0; + HKEY key, altkey; + LCID lcid; + + if (!proc || id < LGRPID_WESTERN_EUROPE || id > LGRPID_ARMENIAN) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, locales_key, 0, KEY_READ, &key )) return FALSE; + if (RegOpenKeyExW( key, altsort_key, 0, KEY_READ, &altkey )) altkey = 0; + + for (;;) + { + name_len = ARRAY_SIZE(name); + value_len = sizeof(value); + if (RegEnumValueW( alt ? altkey : key, index++, name, &name_len, NULL, + &type, (BYTE *)value, &value_len )) + { + if (alt++) break; + index = 0; + continue; + } + if (type != REG_SZ) continue; + if (id != wcstoul( value, NULL, 16 )) continue; + lcid = wcstoul( name, NULL, 16 ); + if (!unicode) + { + char nameA[10]; + WideCharToMultiByte( CP_ACP, 0, name, -1, nameA, sizeof(nameA), NULL, NULL ); + if (!((LANGGROUPLOCALE_ENUMPROCA)proc)( id, lcid, nameA, param )) break; + } + else if (!proc( id, lcid, name, param )) break; + } + RegCloseKey( altkey ); + RegCloseKey( key ); + return TRUE; +} + + +/*********************************************************************** + * Internal_EnumSystemCodePages (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumSystemCodePages( CODEPAGE_ENUMPROCW proc, DWORD flags, + BOOL unicode ) +{ + WCHAR name[10]; + DWORD name_len, type, index = 0; + HKEY key; + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, codepages_key, 0, KEY_READ, &key )) return FALSE; + + for (;;) + { + name_len = ARRAY_SIZE(name); + if (RegEnumValueW( key, index++, name, &name_len, NULL, &type, NULL, NULL )) break; + if (type != REG_SZ) continue; + if (!wcstoul( name, NULL, 10 )) continue; + if (!unicode) + { + char nameA[10]; + WideCharToMultiByte( CP_ACP, 0, name, -1, nameA, sizeof(nameA), NULL, NULL ); + if (!((CODEPAGE_ENUMPROCA)proc)( nameA )) break; + } + else if (!proc( name )) break; + } + RegCloseKey( key ); + return TRUE; +} + + +/****************************************************************************** + * Internal_EnumSystemLanguageGroups (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumSystemLanguageGroups( LANGUAGEGROUP_ENUMPROCW proc, + DWORD flags, LONG_PTR param, BOOL unicode ) +{ + WCHAR name[10], value[10], descr[80]; + DWORD name_len, value_len, type, index = 0; + HKEY key; + LGRPID id; + + if (!proc) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + switch (flags) + { + case 0: + flags = LGRPID_INSTALLED; + break; + case LGRPID_INSTALLED: + case LGRPID_SUPPORTED: + break; + default: + SetLastError( ERROR_INVALID_FLAGS ); + return FALSE; + } + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, language_groups_key, 0, KEY_READ, &key )) return FALSE; + + for (;;) + { + name_len = ARRAY_SIZE(name); + value_len = sizeof(value); + if (RegEnumValueW( key, index++, name, &name_len, NULL, &type, (BYTE *)value, &value_len )) break; + if (type != REG_SZ) continue; + + id = wcstoul( name, NULL, 16 ); + + if (!(flags & LGRPID_SUPPORTED) && !wcstoul( value, NULL, 10 )) continue; + if (!LoadStringW( kernel32_handle, 0x2000 + id, descr, ARRAY_SIZE(descr) )) descr[0] = 0; + TRACE( "%p: %u %s %s %x %lx\n", proc, id, debugstr_w(name), debugstr_w(descr), flags, param ); + if (!unicode) + { + char nameA[10], descrA[80]; + WideCharToMultiByte( CP_ACP, 0, name, -1, nameA, sizeof(nameA), NULL, NULL ); + WideCharToMultiByte( CP_ACP, 0, descr, -1, descrA, sizeof(descrA), NULL, NULL ); + if (!((LANGUAGEGROUP_ENUMPROCA)proc)( id, nameA, descrA, flags, param )) break; + } + else if (!proc( id, name, descr, flags, param )) break; + } + RegCloseKey( key ); + return TRUE; +} + + +/****************************************************************************** + * Internal_EnumUILanguages (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumUILanguages( UILANGUAGE_ENUMPROCW proc, DWORD flags, + LONG_PTR param, BOOL unicode ) +{ + WCHAR name[10]; + DWORD name_len, type, index = 0; + HKEY key; + + if (!proc) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + if (flags & ~MUI_LANGUAGE_ID) + { + SetLastError( ERROR_INVALID_FLAGS ); + return FALSE; + } + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, locales_key, 0, KEY_READ, &key )) return FALSE; + + for (;;) + { + name_len = ARRAY_SIZE(name); + if (RegEnumValueW( key, index++, name, &name_len, NULL, &type, NULL, NULL )) break; + if (type != REG_SZ) continue; + if (!wcstoul( name, NULL, 16 )) continue; + if (!unicode) + { + char nameA[10]; + WideCharToMultiByte( CP_ACP, 0, name, -1, nameA, sizeof(nameA), NULL, NULL ); + if (!((UILANGUAGE_ENUMPROCA)proc)( nameA, param )) break; + } + else if (!proc( name, param )) break; + } + RegCloseKey( key ); + return TRUE; +} + + /****************************************************************************** * CompareStringOrdinal (kernelbase.@) */ @@ -60,6 +255,143 @@ INT WINAPI DECLSPEC_HOTPATCH CompareStringOrdinal( const WCHAR *str1, INT len1, } +/****************************************************************************** + * EnumLanguageGroupLocalesW (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH EnumLanguageGroupLocalesW( LANGGROUPLOCALE_ENUMPROCW proc, LGRPID id, + DWORD flags, LONG_PTR param ) +{ + return Internal_EnumLanguageGroupLocales( proc, id, flags, param, TRUE ); +} + + +/****************************************************************************** + * EnumUILanguagesW (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH EnumUILanguagesW( UILANGUAGE_ENUMPROCW proc, DWORD flags, LONG_PTR param ) +{ + return Internal_EnumUILanguages( proc, flags, param, TRUE ); +} + + +/*********************************************************************** + * EnumSystemCodePagesW (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH EnumSystemCodePagesW( CODEPAGE_ENUMPROCW proc, DWORD flags ) +{ + return Internal_EnumSystemCodePages( proc, flags, TRUE ); +} + + +/****************************************************************************** + * EnumSystemLanguageGroupsW (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH EnumSystemLanguageGroupsW( LANGUAGEGROUP_ENUMPROCW proc, + DWORD flags, LONG_PTR param ) +{ + return Internal_EnumSystemLanguageGroups( proc, flags, param, TRUE ); +} + + +/****************************************************************************** + * EnumSystemLocalesA (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH EnumSystemLocalesA( LOCALE_ENUMPROCA proc, DWORD flags ) +{ + char name[10]; + DWORD name_len, type, index = 0; + HKEY key; + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, locales_key, 0, KEY_READ, &key )) return FALSE; + + for (;;) + { + name_len = ARRAY_SIZE(name); + if (RegEnumValueA( key, index++, name, &name_len, NULL, &type, NULL, NULL )) break; + if (type != REG_SZ) continue; + if (!strtoul( name, NULL, 16 )) continue; + if (!proc( name )) break; + } + RegCloseKey( key ); + return TRUE; +} + + +/****************************************************************************** + * EnumSystemLocalesW (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH EnumSystemLocalesW( LOCALE_ENUMPROCW proc, DWORD flags ) +{ + WCHAR name[10]; + DWORD name_len, type, index = 0; + HKEY key; + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, locales_key, 0, KEY_READ, &key )) return FALSE; + + for (;;) + { + name_len = ARRAY_SIZE(name); + if (RegEnumValueW( key, index++, name, &name_len, NULL, &type, NULL, NULL )) break; + if (type != REG_SZ) continue; + if (!wcstoul( name, NULL, 16 )) continue; + if (!proc( name )) break; + } + RegCloseKey( key ); + return TRUE; +} + + +/****************************************************************************** + * EnumSystemLocalesEx (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH EnumSystemLocalesEx( LOCALE_ENUMPROCEX proc, DWORD wanted_flags, + LPARAM param, void *reserved ) +{ + WCHAR buffer[256], name[10]; + DWORD name_len, type, neutral, flags, index = 0, alt = 0; + HKEY key, altkey; + LCID lcid; + + if (reserved) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, locales_key, 0, KEY_READ, &key )) return FALSE; + if (RegOpenKeyExW( key, altsort_key, 0, KEY_READ, &altkey )) altkey = 0; + + for (;;) + { + name_len = ARRAY_SIZE(name); + if (RegEnumValueW( alt ? altkey : key, index++, name, &name_len, NULL, &type, NULL, NULL )) + { + if (alt++) break; + index = 0; + continue; + } + if (type != REG_SZ) continue; + if (!(lcid = wcstoul( name, NULL, 16 ))) continue; + + GetLocaleInfoW( lcid, LOCALE_SNAME | LOCALE_NOUSEROVERRIDE, buffer, ARRAY_SIZE( buffer )); + if (!GetLocaleInfoW( lcid, LOCALE_INEUTRAL | LOCALE_NOUSEROVERRIDE | LOCALE_RETURN_NUMBER, + (LPWSTR)&neutral, sizeof(neutral) / sizeof(WCHAR) )) + neutral = 0; + + if (alt) + flags = LOCALE_ALTERNATE_SORTS; + else + flags = LOCALE_WINDOWS | (neutral ? LOCALE_NEUTRALDATA : LOCALE_SPECIFICDATA); + + if (wanted_flags && !(flags & wanted_flags)) continue; + if (!proc( buffer, flags, param )) break; + } + RegCloseKey( altkey ); + RegCloseKey( key ); + return TRUE; +} + + /****************************************************************************** * FindStringOrdinal (kernelbase.@) */ @@ -103,6 +435,28 @@ INT WINAPI DECLSPEC_HOTPATCH FindStringOrdinal( DWORD flag, const WCHAR *src, IN } +/****************************************************************************** + * IsValidLanguageGroup (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH IsValidLanguageGroup( LGRPID id, DWORD flags ) +{ + static const WCHAR format[] = { '%','x',0 }; + WCHAR name[10], value[10]; + DWORD type, value_len = sizeof(value); + BOOL ret = FALSE; + HKEY key; + + if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, language_groups_key, 0, KEY_READ, &key )) return FALSE; + + swprintf( name, ARRAY_SIZE(name), format, id ); + if (!RegQueryValueExW( key, name, NULL, &type, (BYTE *)value, &value_len ) && type == REG_SZ) + ret = (flags & LGRPID_SUPPORTED) || wcstoul( value, NULL, 10 ); + + RegCloseKey( key ); + return ret; +} + + /*********************************************************************** * LCIDToLocaleName (kernelbase.@) */ diff --git a/dlls/kernelbase/main.c b/dlls/kernelbase/main.c index 8f6c75f7f2e..e54222a5d63 100644 --- a/dlls/kernelbase/main.c +++ b/dlls/kernelbase/main.c @@ -34,6 +34,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(kernelbase); +HANDLE kernel32_handle = 0; + /*********************************************************************** * DllMain */ @@ -42,6 +44,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) if (reason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls( hinst ); + kernel32_handle = GetModuleHandleA( "kernel32.dll" ); init_startup_info( NtCurrentTeb()->Peb->ProcessParameters ); } return TRUE; diff --git a/loader/wine.inf.in b/loader/wine.inf.in index f469703e711..1e2cba487cf 100644 --- a/loader/wine.inf.in +++ b/loader/wine.inf.in @@ -716,150 +716,222 @@ HKLM,SOFTWARE\Microsoft\Active Setup\Installed Components\{6BF52A52-394A-11d3-B1 HKLM,SOFTWARE\Microsoft\Active Setup\Installed Components\{6BF52A52-394A-11d3-B153-00C04F79FAA6},"Version",2,"12,0,7601,18840" [Nls] -HKLM,System\CurrentControlSet\Control\Nls\Codepage,"37",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0401",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0402",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0403",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0404",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0405",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0406",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0407",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0408",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0409",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"040a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"040b",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"040c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"040d",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"040e",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"040f",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0410",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0411",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0412",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0413",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0414",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0415",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0416",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0418",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0419",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"041a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"041b",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"041c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"041d",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"041e",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"041f",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0420",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0421",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0422",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0423",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0424",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0425",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0426",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0427",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0429",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"042a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"042b",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"042c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"042d",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"042f",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0436",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0437",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0438",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0439",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"043e",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"043f",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0440",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0441",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0443",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0444",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0446",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0447",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0449",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"044a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"044b",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"044e",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"044f",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0450",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0452",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0456",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0457",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"045a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0465",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"047e",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"048f",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0490",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0491",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0494",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0801",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0804",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0807",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0809",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"080a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"080c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0810",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0813",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0814",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0816",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"081a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"081d",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"082c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"083e",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0843",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0894",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c01",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c04",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c07",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c09",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c0a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c0c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c1a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"0c94",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1001",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1004",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1007",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1009",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"100a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"100c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1401",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1404",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1407",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1409",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"140a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"140c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1801",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1809",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"180a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"180c",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1c01",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1c09",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"1c0a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2001",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2009",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"200a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2401",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2409",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"240a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2801",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2809",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"280a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2c01",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2c09",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"2c0a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"3001",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"3009",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"300a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"3401",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"3409",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"340a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"3801",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"380a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"3c01",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"3c0a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"4001",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"400a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"440a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"480a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"4c0a",,"" -HKLM,System\CurrentControlSet\Control\Nls\Language,"500a",,"" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"37",,"c_037.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"424",,"c_424.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"437",,"c_437.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"500",,"c_500.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"737",,"c_737.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"775",,"c_775.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"850",,"c_850.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"852",,"c_852.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"855",,"c_855.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"856",,"c_856.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"857",,"c_857.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"860",,"c_860.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"861",,"c_861.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"862",,"c_862.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"863",,"c_863.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"864",,"c_864.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"865",,"c_865.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"866",,"c_866.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"869",,"c_869.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"874",,"c_874.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"875",,"c_875.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"878",,"c_878.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"932",,"c_932.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"936",,"c_936.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"949",,"c_949.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"950",,"c_950.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1006",,"c_1006.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1026",,"c_1026.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1250",,"c_1250.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1251",,"c_1251.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1252",,"c_1252.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1253",,"c_1253.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1254",,"c_1254.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1255",,"c_1255.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1256",,"c_1256.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1257",,"c_1257.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1258",,"c_1258.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"1361",,"c_1361.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10000",,"c_10000.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10001",,"c_10001.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10002",,"c_10002.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10003",,"c_10003.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10004",,"c_10004.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10005",,"c_10005.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10006",,"c_10006.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10007",,"c_10007.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10008",,"c_10008.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10010",,"c_10010.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10017",,"c_10017.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10021",,"c_10021.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10029",,"c_10029.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10079",,"c_10079.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10081",,"c_10081.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"10082",,"c_10082.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"20127",,"c_20127.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"20866",,"c_20866.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"20932",,"c_20932.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"21866",,"c_21866.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28591",,"c_28591.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28592",,"c_28592.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28593",,"c_28593.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28594",,"c_28594.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28595",,"c_28595.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28596",,"c_28596.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28597",,"c_28597.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28598",,"c_28598.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28599",,"c_28599.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28600",,"c_28600.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28603",,"c_28603.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28604",,"c_28604.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28605",,"c_28605.nls" +HKLM,System\CurrentControlSet\Control\Nls\Codepage,"28606",,"c_28606.nls" + +HKLM,System\CurrentControlSet\Control\Nls\Language,"0401",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0402",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0403",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0404",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0405",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0406",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0407",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0408",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0409",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"040a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"040b",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"040c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"040d",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"040e",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"040f",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0410",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0411",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0412",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0413",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0414",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0415",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0416",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0418",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0419",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"041a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"041b",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"041c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"041d",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"041e",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"041f",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0420",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0421",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0422",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0423",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0424",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0425",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0426",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0427",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0429",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"042a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"042b",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"042c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"042d",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"042f",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0436",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0437",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0438",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0439",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"043e",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"043f",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0440",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0441",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0443",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0444",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0446",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0447",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0449",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"044a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"044b",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"044e",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"044f",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0450",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0452",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0456",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0457",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"045a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0465",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"047e",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"048f",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0490",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0491",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0494",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0801",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0804",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0807",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0809",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"080a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"080c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0810",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0813",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0814",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0816",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"081a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"081d",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"082c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"083e",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0843",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0894",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c01",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c04",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c07",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c09",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c0a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c0c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c1a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"0c94",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1001",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1004",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1007",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1009",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"100a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"100c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1401",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1404",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1407",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1409",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"140a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"140c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1801",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1809",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"180a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"180c",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1c01",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1c09",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"1c0a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2001",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2009",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"200a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2401",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2409",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"240a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2801",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2809",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"280a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2c01",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2c09",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"2c0a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"3001",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"3009",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"300a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"3401",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"3409",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"340a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"3801",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"380a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"3c01",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"3c0a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"4001",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"400a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"440a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"480a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"4c0a",,"l_intl.nls" +HKLM,System\CurrentControlSet\Control\Nls\Language,"500a",,"l_intl.nls" HKLM,System\CurrentControlSet\Control\Nls\Language,"Default",,"0409" HKLM,System\CurrentControlSet\Control\Nls\Language,"InstallLanguage",,"0409" @@ -904,6 +976,7 @@ HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000413",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000414",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000415",,"2" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000416",,"1" +HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000417",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000418",,"2" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000419",,"5" HKLM,System\CurrentControlSet\Control\Nls\Locale,"0000041a",,"2" @@ -936,6 +1009,7 @@ HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000440",,"5" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000441",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000443",,"6" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000444",,"5" +HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000445",,"f" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000446",,"f" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000447",,"f" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000449",,"f" @@ -948,6 +1022,8 @@ HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000452",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000456",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000457",,"f" HKLM,System\CurrentControlSet\Control\Nls\Locale,"0000045a",,"d" +HKLM,System\CurrentControlSet\Control\Nls\Locale,"0000045b",,"f" +HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000461",,"f" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000465",,"d" HKLM,System\CurrentControlSet\Control\Nls\Locale,"0000047e",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"0000048f",,"1" @@ -955,6 +1031,7 @@ HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000490",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000491",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000492",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000494",,"1" +HKLM,System\CurrentControlSet\Control\Nls\Locale,"000004a5",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000801",,"d" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000804",,"a" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000807",,"1" @@ -977,6 +1054,7 @@ HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000c07",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000c09",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000c0a",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000c0c",,"1" +HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000c13",,"1" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00000c1a",,"5" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00001001",,"d" HKLM,System\CurrentControlSet\Control\Nls\Locale,"00001004",,"a"