Fixes crash on launch in Outriders demo.
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/kernel32/kernel32.spec | 1 + dlls/kernelbase/kernelbase.spec | 1 + dlls/kernelbase/locale.c | 50 +++++++++++++++++++++++++++++++++ include/winnls.h | 1 + 4 files changed, 53 insertions(+)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index ee2e3f8ad31..5dee1d9b906 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -763,6 +763,7 @@ @ stdcall -import GetOEMCP() @ stdcall -import GetOverlappedResult(long ptr ptr long) @ stdcall -import GetOverlappedResultEx(long ptr ptr long long) +@ stdcall -import GetUserDefaultGeoName(ptr long) @ stdcall -import GetUserPreferredUILanguages(long ptr ptr ptr) @ stdcall GetPackageFamilyName(long ptr ptr) kernelbase.GetPackageFamilyName @ stdcall GetPackageFullName(long ptr ptr) kernelbase.GetPackageFullName diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 543961d2ce6..a0cd5f82a18 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -741,6 +741,7 @@ @ stub GetUILanguageInfo # @ stub GetUnicodeStringToEightBitSizeRoutine # @ stub GetUnicodeStringToEightBitStringRoutine +@ stdcall GetUserDefaultGeoName(ptr long) @ stdcall GetUserDefaultLCID() @ stdcall GetUserDefaultLangID() @ stdcall GetUserDefaultLocaleName(ptr long) diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index b746feca639..7126dc74d01 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -5740,6 +5740,12 @@ BOOL WINAPI DECLSPEC_HOTPATCH SetUserGeoID( GEOID id ) const WCHAR *name = geoinfo->kind == LOCATION_NATION ? L"Nation" : L"Region"; swprintf( bufferW, ARRAY_SIZE(bufferW), L"%u", geoinfo->id ); RegSetValueExW( hkey, name, 0, REG_SZ, (BYTE *)bufferW, (lstrlenW(bufferW) + 1) * sizeof(WCHAR) ); + + if (geoinfo->kind == LOCATION_NATION || geoinfo->kind == LOCATION_BOTH) + lstrcpyW( bufferW, geoinfo->iso2W ); + else + swprintf( bufferW, ARRAY_SIZE(bufferW), L"%03u", geoinfo->uncode ); + RegSetValueExW( hkey, L"Name", 0, REG_SZ, (BYTE *)bufferW, (lstrlenW(bufferW) + 1) * sizeof(WCHAR) ); RegCloseKey( hkey ); } return TRUE; @@ -5877,3 +5883,47 @@ INT WINAPI DECLSPEC_HOTPATCH WideCharToMultiByte( UINT codepage, DWORD flags, LP TRACE( "cp %d %s -> %s, ret = %d\n", codepage, debugstr_wn(src, srclen), debugstr_an(dst, ret), ret ); return ret; } + + +/*********************************************************************** + * GetUserDefaultGeoName (kernelbase.@) + */ +INT WINAPI GetUserDefaultGeoName(LPWSTR geo_name, int count) +{ + const struct geoinfo *geoinfo; + WCHAR buffer[32]; + LSTATUS status; + DWORD size; + HKEY key; + + TRACE( "geo_name %p, count %d.\n", geo_name, count ); + + if (count && !geo_name) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return 0; + } + if (!(status = RegOpenKeyExW( intl_key, L"Geo", 0, KEY_ALL_ACCESS, &key ))) + { + size = sizeof(buffer); + status = RegQueryValueExW( key, L"Name", NULL, NULL, (BYTE *)buffer, &size ); + RegCloseKey( key ); + } + if (status) + { + if ((geoinfo = get_geoinfo_ptr( GetUserGeoID( GEOCLASS_NATION ))) && geoinfo->id != 39070) + lstrcpyW( buffer, geoinfo->iso2W ); + else + lstrcpyW( buffer, L"001" ); + } + size = lstrlenW( buffer ) + 1; + if (count < size) + { + if (!count) + return size; + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return 0; + } + lstrcpyW( geo_name, buffer ); + return size; +} diff --git a/include/winnls.h b/include/winnls.h index 07a31cfde88..04838cfa8d7 100644 --- a/include/winnls.h +++ b/include/winnls.h @@ -946,6 +946,7 @@ WINBASEAPI INT WINAPI GetTimeFormatA(LCID,DWORD,const SYSTEMTIME*,LPCSTR WINBASEAPI INT WINAPI GetTimeFormatEx(LPCWSTR,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,INT); WINBASEAPI INT WINAPI GetTimeFormatW(LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,INT); #define GetTimeFormat WINELIB_NAME_AW(GetTimeFormat) +WINBASEAPI INT WINAPI GetUserDefaultGeoName(LPWSTR,int); WINBASEAPI LANGID WINAPI GetUserDefaultLangID(void); WINBASEAPI LCID WINAPI GetUserDefaultLCID(void); WINBASEAPI INT WINAPI GetUserDefaultLocaleName(LPWSTR,int);
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/kernel32/kernel32.spec | 1 + dlls/kernelbase/kernelbase.spec | 1 + dlls/kernelbase/locale.c | 46 +++++++++++++++++++++++++++++++++ include/winnls.h | 1 + 4 files changed, 49 insertions(+)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 5dee1d9b906..0eb66a0e3b0 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -1482,6 +1482,7 @@ @ stdcall -arch=x86_64 SetUmsThreadInformation(ptr long ptr long) @ stdcall -import SetUnhandledExceptionFilter(ptr) @ stdcall -import SetUserGeoID(long) +@ stdcall -import SetUserGeoName(wstr) @ stub SetVDMCurrentDirectories @ stdcall SetVolumeLabelA(str str) @ stdcall SetVolumeLabelW(wstr wstr) diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index a0cd5f82a18..08a2f726817 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1509,6 +1509,7 @@ @ stdcall SetTokenInformation(long long ptr long) @ stdcall SetUnhandledExceptionFilter(ptr) @ stdcall SetUserGeoID(long) +@ stdcall SetUserGeoName(wstr) @ stdcall SetWaitableTimer(long ptr long ptr ptr long) @ stdcall SetWaitableTimerEx(long ptr long ptr ptr ptr long) @ stdcall -arch=i386,x86_64 SetXStateFeaturesMask(ptr int64) diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 7126dc74d01..24e8cd3f338 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -5927,3 +5927,49 @@ INT WINAPI GetUserDefaultGeoName(LPWSTR geo_name, int count) lstrcpyW( geo_name, buffer ); return size; } + + +/*********************************************************************** + * SetUserDefaultGeoName (kernelbase.@) + */ +BOOL WINAPI SetUserGeoName(PWSTR geo_name) +{ + unsigned int i; + WCHAR *endptr; + int uncode; + + TRACE( "geo_name %s.\n", debugstr_w( geo_name )); + + if (!geo_name) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (lstrlenW( geo_name ) == 3) + { + uncode = wcstol( geo_name, &endptr, 10 ); + if (!uncode || endptr != geo_name + 3) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + for (i = 0; i < ARRAY_SIZE(geoinfodata); ++i) + if (geoinfodata[i].uncode == uncode) + break; + } + else + { + if (!lstrcmpiW( geo_name, L"XX" )) + return SetUserGeoID( 39070 ); + for (i = 0; i < ARRAY_SIZE(geoinfodata); ++i) + if (!lstrcmpiW( geo_name, geoinfodata[i].iso2W )) + break; + } + if (i == ARRAY_SIZE(geoinfodata)) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + return SetUserGeoID( geoinfodata[i].id ); +} diff --git a/include/winnls.h b/include/winnls.h index 04838cfa8d7..4b1323cc694 100644 --- a/include/winnls.h +++ b/include/winnls.h @@ -983,6 +983,7 @@ WINBASEAPI BOOL WINAPI SetThreadLocale(LCID); WINBASEAPI BOOL WINAPI SetThreadPreferredUILanguages(DWORD,PCZZWSTR,PULONG); WINBASEAPI LANGID WINAPI SetThreadUILanguage(LANGID); WINBASEAPI BOOL WINAPI SetUserGeoID(GEOID); +WINBASEAPI BOOL WINAPI SetUserGeoName(PWSTR); WINBASEAPI INT WINAPI WideCharToMultiByte(UINT,DWORD,LPCWSTR,INT,LPSTR,INT,LPCSTR,LPBOOL); WINBASEAPI INT WINAPI FindNLSStringEx(const WCHAR *,DWORD,const WCHAR *,INT,const WCHAR *,INT,INT *,NLSVERSIONINFO *,void *,LPARAM);
Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/kernel32/tests/locale.c | 215 +++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index 55566d3e703..42e14eb736f 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -40,6 +40,7 @@ #include "winerror.h" #include "winnls.h" #include "winternl.h" +#include "winreg.h"
static const WCHAR upper_case[] = {'\t','J','U','S','T','!',' ','A',',',' ','T','E','S','T',';',' ','S','T','R','I','N','G',' ','1','/','*','+','-','.','\r','\n',0}; static const WCHAR lower_case[] = {'\t','j','u','s','t','!',' ','a',',',' ','t','e','s','t',';',' ','s','t','r','i','n','g',' ','1','/','*','+','-','.','\r','\n',0}; @@ -74,6 +75,8 @@ static INT (WINAPI *pCompareStringEx)(LPCWSTR, DWORD, LPCWSTR, INT, LPCWSTR, INT LPNLSVERSIONINFO, LPVOID, LPARAM); static INT (WINAPI *pGetGeoInfoA)(GEOID, GEOTYPE, LPSTR, INT, LANGID); static INT (WINAPI *pGetGeoInfoW)(GEOID, GEOTYPE, LPWSTR, INT, LANGID); +static INT (WINAPI *pGetUserDefaultGeoName)(LPWSTR, int); +static BOOL (WINAPI *pSetUserGeoName)(PWSTR); static BOOL (WINAPI *pEnumSystemGeoID)(GEOCLASS, GEOID, GEO_ENUMPROC); static BOOL (WINAPI *pGetSystemPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*); static BOOL (WINAPI *pGetThreadPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*); @@ -121,6 +124,8 @@ static void InitFunctionPointers(void) X(CompareStringEx); X(GetGeoInfoA); X(GetGeoInfoW); + X(GetUserDefaultGeoName); + X(SetUserGeoName); X(EnumSystemGeoID); X(GetSystemPreferredUILanguages); X(GetThreadPreferredUILanguages); @@ -6913,6 +6918,215 @@ static void test_NLSVersion(void) else win_skip( "IsValidNLSVersion not available\n" ); }
+static void test_geo_name(void) +{ + WCHAR reg_name[32], buf[32], set_name[32], nation[32], region[32]; + BOOL have_name = FALSE, have_region = FALSE, have_nation = FALSE; + DWORD size, type, name_size; + LSTATUS status; + GEOID geoid; + BOOL bret; + HKEY key; + int ret; + + if (!pSetUserGeoName || !pGetUserDefaultGeoName) + { + win_skip("GetUserDefaultGeoName / SetUserGeoName is not available, skipping test.\n"); + return; + } + + status = RegOpenKeyExA(HKEY_CURRENT_USER, "Control Panel\International\Geo", 0, KEY_READ | KEY_WRITE, &key); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + + size = sizeof(reg_name); + if (!RegQueryValueExW(key, L"Name", NULL, &type, (BYTE *)reg_name, &size)) + have_name = TRUE; + + lstrcpyW(buf, L"QQ"); + RegSetValueExW(key, L"Name", 0, REG_SZ, (BYTE *)buf, (lstrlenW(buf) + 1) * sizeof(WCHAR)); + + size = sizeof(reg_name); + if ((ret = pGetUserDefaultGeoName(NULL, 0)) == 1) + { + if (have_name) + { + status = RegSetValueExW(key, L"Name", 0, REG_SZ, (BYTE *)reg_name, (lstrlenW(reg_name) + 1) * sizeof(*reg_name)); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + } + else + { + RegDeleteValueW(key, L"Name"); + } + win_skip("Geo names are not available, skipping test.\n"); + return; + } + + size = sizeof(nation); + if (!RegQueryValueExW(key, L"Nation", NULL, &type, (BYTE *)nation, &size)) + have_nation = TRUE; + size = sizeof(region); + if (!RegQueryValueExW(key, L"Region", NULL, &type, (BYTE *)region, &size)) + have_region = TRUE; + + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(NULL, 0); + ok((ret == 3 || ret == 4) && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + name_size = ret; + + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, 0); + ok(ret >= 3 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, 2); + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(NULL, 1); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(NULL, name_size); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, name_size); + ok(ret == name_size && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"QQ"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + SetLastError(0xdeadbeef); + bret = pSetUserGeoName(NULL); + ok(!bret && GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + + lstrcpyW(set_name, L"QQ"); + SetLastError(0xdeadbeef); + bret = pSetUserGeoName(set_name); + ok(!bret && GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + + lstrcpyW(set_name, L"Xx"); + SetLastError(0xdeadbeef); + bret = pSetUserGeoName(set_name); + ok((bret && GetLastError() == 0xdeadbeef) || broken(bret && GetLastError() == 0), + "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok(ret == 4 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"001"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + geoid = GetUserGeoID(GEOCLASS_REGION); + ok(geoid == 39070, "Got unexpected geoid %u.\n", geoid); + size = sizeof(buf); + status = RegQueryValueExW(key, L"Name", NULL, &type, (BYTE *)buf, &size); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + ok(type == REG_SZ, "Got unexpected type %#x.\n", type); + ok(!lstrcmpW(buf, L"001"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + lstrcpyW(set_name, L"ar"); + SetLastError(0xdeadbeef); + bret = pSetUserGeoName(set_name); + ok((bret && GetLastError() == 0xdeadbeef) || broken(bret && GetLastError() == 0), + "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok((ret == 3 && GetLastError() == 0xdeadbeef) || broken(ret == 3 && GetLastError() == 0), + "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"AR"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + geoid = GetUserGeoID(GEOCLASS_NATION); + ok(geoid == 11, "Got unexpected geoid %u.\n", geoid); + + lstrcpyW(set_name, L"150"); + SetLastError(0xdeadbeef); + bret = pSetUserGeoName(set_name); + ok((bret && GetLastError() == 0xdeadbeef) || broken(bret && GetLastError() == 0), + "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok((ret == 4 && GetLastError() == 0xdeadbeef) || broken(ret == 4 && GetLastError() == 0), + "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"150"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + geoid = GetUserGeoID(GEOCLASS_NATION); + ok(geoid == 11, "Got unexpected geoid %u.\n", geoid); + + lstrcpyW(set_name, L"150a"); + SetLastError(0xdeadbeef); + bret = pSetUserGeoName(set_name); + ok(!bret && GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + + bret = SetUserGeoID(21242); + ok(bret, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok(ret == 3 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"XX"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + bret = SetUserGeoID(42483); + ok(bret, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok(ret == 4 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"011"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + bret = SetUserGeoID(333); + ok(bret, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError()); + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok(ret == 3 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"AN"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + RegDeleteValueW(key, L"Name"); + RegDeleteValueW(key, L"Region"); + lstrcpyW(buf, L"124"); + status = RegSetValueExW(key, L"Nation", 0, REG_SZ, (BYTE *)buf, (lstrlenW(buf) + 1) * sizeof(*buf)); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok(ret == 3 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"JM"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + lstrcpyW(buf, L"333"); + status = RegSetValueExW(key, L"Region", 0, REG_SZ, (BYTE *)buf, (lstrlenW(buf) + 1) * sizeof(*buf)); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok(ret == 3 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"JM"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + RegDeleteValueW(key, L"Nation"); + SetLastError(0xdeadbeef); + ret = pGetUserDefaultGeoName(buf, ARRAY_SIZE(buf)); + ok(ret == 4 && GetLastError() == 0xdeadbeef, "Got unexpected ret %u, GetLastError() %u.\n", ret, GetLastError()); + ok(!lstrcmpW(buf, L"001"), "Got unexpected name %s.\n", wine_dbgstr_w(buf)); + + /* Restore user geo data. */ + if (have_name) + { + status = RegSetValueExW(key, L"Name", 0, REG_SZ, (BYTE *)reg_name, (lstrlenW(reg_name) + 1) * sizeof(*reg_name)); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + } + else + { + RegDeleteValueW(key, L"Name"); + } + if (have_nation) + { + status = RegSetValueExW(key, L"Nation", 0, REG_SZ, (BYTE *)nation, (lstrlenW(nation) + 1) * sizeof(*nation)); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + } + else + { + RegDeleteValueW(key, L"Nation"); + } + if (have_region) + { + status = RegSetValueExW(key, L"Region", 0, REG_SZ, (BYTE *)region, (lstrlenW(region) + 1) * sizeof(*region)); + ok(status == ERROR_SUCCESS, "Got unexpected status %#x.\n", status); + } + else + { + RegDeleteValueW(key, L"Region"); + } + + RegCloseKey(key); +} + START_TEST(locale) { InitFunctionPointers(); @@ -6963,6 +7177,7 @@ START_TEST(locale) test_NormalizeString(); test_SpecialCasing(); test_NLSVersion(); + test_geo_name(); /* this requires collation table patch to make it MS compatible */ if (0) test_sorting(); }