Paul Gofman : kernel32: Implement GetUserDefaultGeoName().
Alexandre Julliard
julliard at winehq.org
Tue Mar 9 14:55:18 CST 2021
Module: wine
Branch: master
Commit: e610a56734f72f114c2233efc65c93f9223db358
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e610a56734f72f114c2233efc65c93f9223db358
Author: Paul Gofman <pgofman at codeweavers.com>
Date: Mon Mar 8 19:34:38 2021 +0300
kernel32: Implement GetUserDefaultGeoName().
Fixes crash on launch in Outriders demo.
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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);
More information about the wine-cvs
mailing list