[PATCH v2 2/7] kernel32: Handle GEOCLASS_REGION in Get/SetUserGeoID.
João Diogo Ferreira
devilj at outlook.pt
Tue Oct 29 23:30:55 CDT 2019
Signed-off-by: João Diogo Craveiro Ferreira <devilj at outlook.pt>
---
Supersedes: 170933, 171825
V2: Introduce trace logs.
---
dlls/kernel32/locale.c | 57 ++++++++++++++++++++++++++++++------------
1 file changed, 41 insertions(+), 16 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 7c97915199..cd7ec45da3 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -4002,6 +4002,7 @@ GEOID WINAPI GetUserGeoID(GEOCLASS geoclass)
GEOID ret = GEOID_NOT_AVAILABLE;
static const WCHAR geoW[] = {'G','e','o',0};
static const WCHAR nationW[] = {'N','a','t','i','o','n',0};
+ static const WCHAR regionW[] = {'R','e','g','i','o','n',0};
WCHAR bufferW[40], *end;
HANDLE hkey, hsubkey = 0;
UNICODE_STRING keyW;
@@ -4009,20 +4010,29 @@ GEOID WINAPI GetUserGeoID(GEOCLASS geoclass)
DWORD count = sizeof(bufferW);
RtlInitUnicodeString(&keyW, nationW);
+ if (geoclass == GEOCLASS_NATION)
+ {
+ TRACE("(GEOCLASS_NATION)\n");
+ RtlInitUnicodeString(&keyW, nationW);
+ }
+ else if (geoclass == GEOCLASS_REGION)
+ {
+ TRACE("(GEOCLASS_REGION)\n");
+ RtlInitUnicodeString(&keyW, regionW);
+ }
+ else
+ {
+ WARN("Unknown geoclass %d\n", geoclass);
+ return ret;
+ }
+
if (!(hkey = create_registry_key())) return ret;
- switch (geoclass) {
- case GEOCLASS_NATION:
- if ((hsubkey = NLS_RegOpenKey(hkey, geoW)))
- {
- if ((NtQueryValueKey(hsubkey, &keyW, KeyValuePartialInformation,
- bufferW, count, &count) == STATUS_SUCCESS ) && info->DataLength)
- ret = strtolW((const WCHAR*)info->Data, &end, 10);
- }
- break;
- case GEOCLASS_REGION:
- FIXME("GEOCLASS_REGION not handled yet\n");
- break;
+ if ((hsubkey = NLS_RegOpenKey(hkey, geoW)))
+ {
+ if((NtQueryValueKey(hsubkey, &keyW, KeyValuePartialInformation,
+ bufferW, count, &count) == STATUS_SUCCESS ) && info->DataLength)
+ ret = strtolW((const WCHAR*)info->Data, &end, 10);
}
NtClose(hkey);
@@ -4035,15 +4045,26 @@ GEOID WINAPI GetUserGeoID(GEOCLASS geoclass)
*/
BOOL WINAPI SetUserGeoID(GEOID geoid)
{
+ const struct geoinfo_t *geoinfo = get_geoinfo_dataptr(GeoID);
static const WCHAR geoW[] = {'G','e','o',0};
static const WCHAR nationW[] = {'N','a','t','i','o','n',0};
+ static const WCHAR regionW[] = {'R','e','g','i','o','n',0};
static const WCHAR formatW[] = {'%','i',0};
UNICODE_STRING nameW, keyW;
WCHAR bufferW[10];
OBJECT_ATTRIBUTES attr;
HANDLE hkey;
- if(!(hkey = create_registry_key())) return FALSE;
+ if (!geoinfo)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ if (!(hkey = create_registry_key()))
+ {
+ SetLastError(ERROR_INTERNAL_ERROR);
+ return FALSE;
+ }
attr.Length = sizeof(attr);
attr.RootDirectory = hkey;
@@ -4052,16 +4073,20 @@ BOOL WINAPI SetUserGeoID(GEOID geoid)
attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL;
RtlInitUnicodeString(&nameW, geoW);
- RtlInitUnicodeString(&keyW, nationW);
- if (NtCreateKey(&hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL) != STATUS_SUCCESS)
+ if (geoinfo->kind == LOCATION_NATION)
+ RtlInitUnicodeString(&keyW, nationW);
+ else
+ RtlInitUnicodeString(&keyW, regionW);
+ if (NtCreateKey(&hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL) != STATUS_SUCCESS)
{
NtClose(attr.RootDirectory);
+ SetLastError(ERROR_INTERNAL_ERROR);
return FALSE;
}
- sprintfW(bufferW, formatW, geoid);
+ sprintfW(bufferW, formatW, geoinfo->id);
NtSetValueKey(hkey, &keyW, 0, REG_SZ, bufferW, (strlenW(bufferW) + 1) * sizeof(WCHAR));
NtClose(attr.RootDirectory);
NtClose(hkey);
--
2.23.0
More information about the wine-devel
mailing list