From a430a69f8ba5372e478b8dd463f1347b6c35c38e Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Mon, 8 Mar 2021 19:34:39 +0300 Subject: [PATCH] kernel32: Implement SetUserGeoName(). Signed-off-by: Paul Gofman Signed-off-by: Alexandre Julliard --- 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);