However a few time zones were missing the MUI display name in some Windows 1809 versions.
Signed-off-by: Francois Gouget fgouget@codeweavers.com --- On cw-gtx560 and cw-rx460, Windows 1809 is missing the MUI display name for the following time zones. Morocco Standard Time Russian Standard Time Sao Tome Standard Time
Allowing for the "not found" errors (as is done before for EnumDynamicTimeZoneInformation()) fixes these three failures. https://test.winehq.org/data/patterns.html#advapi32:registry
The patch also gets rid of the displayname. Unless we wanted to check that some strings fit into 32 characters that should not matter. --- dlls/advapi32/tests/registry.c | 63 ++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 19 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 66382876fa5..e678f449836 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -4012,9 +4012,8 @@ static void test_EnumDynamicTimeZoneInformation(void) { LSTATUS status; HKEY key, subkey; - WCHAR name[32]; + WCHAR name[128]; WCHAR keyname[128]; - WCHAR displayname[128]; WCHAR sysdir[MAX_PATH]; DWORD index, ret, gle, size; DYNAMIC_TIME_ZONE_INFORMATION bogus_dtzi, dtzi; @@ -4058,6 +4057,7 @@ static void test_EnumDynamicTimeZoneInformation(void) index = 0; while (!(status = RegEnumKeyW(key, index, keyname, ARRAY_SIZE(keyname)))) { + winetest_push_context("%s" , wine_dbgstr_w(keyname)); subkey = NULL; status = RegOpenKeyExW(key, keyname, 0, KEY_QUERY_VALUE, &subkey); ok(status == ERROR_SUCCESS, "got %d\n", status); @@ -4079,31 +4079,55 @@ static void test_EnumDynamicTimeZoneInformation(void) { size = sizeof(name); memset(name, 0, sizeof(name)); + status = pRegGetValueW(subkey, NULL, L"Std", RRF_RT_REG_SZ, NULL, name, &size); + ok(status == ERROR_SUCCESS, "status %d Std %s\n", status, + wine_dbgstr_w(name)); + ok(*name, "Std name is empty\n"); if (pRegLoadMUIStringW) + { + size = sizeof(name); + memset(name, 0, sizeof(name)); status = pRegLoadMUIStringW(subkey, L"MUI_Std", name, size, &size, 0, sysdir); - else - status = pRegGetValueW(subkey, NULL, L"Std", RRF_RT_REG_SZ, NULL, name, &size); - ok(status == ERROR_SUCCESS, "status %d name %s\n", status, wine_dbgstr_w(name)); - ok(!memcmp(&dtzi.StandardName, name, size), - "expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(dtzi.StandardName)); + ok(status == ERROR_SUCCESS, "status %d MUI_Std %s\n", + status, wine_dbgstr_w(name)); + } + ok(!memcmp(&dtzi.StandardName, name, size), "expected %s, got %s\n", + wine_dbgstr_w(name), wine_dbgstr_w(dtzi.StandardName));
size = sizeof(name); memset(name, 0, sizeof(name)); + status = pRegGetValueW(subkey, NULL, L"Dlt", RRF_RT_REG_SZ, NULL, name, &size); + ok(status == ERROR_SUCCESS, "status %d %s Dlt %s\n", + status, wine_dbgstr_w(keyname), wine_dbgstr_w(name)); + ok(*name, "Dlt name is empty\n"); if (pRegLoadMUIStringW) + { + size = sizeof(name); + memset(name, 0, sizeof(name)); status = pRegLoadMUIStringW(subkey, L"MUI_Dlt", name, size, &size, 0, sysdir); - else - status = pRegGetValueW(subkey, NULL, L"Dlt", RRF_RT_REG_SZ, NULL, name, &size); - ok(status == ERROR_SUCCESS, "status %d name %s\n", status, wine_dbgstr_w(name)); - ok(!memcmp(&dtzi.DaylightName, name, size), - "expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(dtzi.DaylightName)); - - size = sizeof(displayname); - memset(displayname, 0, sizeof(displayname)); + ok(status == ERROR_SUCCESS, "status %d %s MUI_Dlt %s\n", + status, wine_dbgstr_w(keyname), wine_dbgstr_w(name)); + } + ok(!memcmp(&dtzi.DaylightName, name, size), "expected %s, got %s\n", + wine_dbgstr_w(name), wine_dbgstr_w(dtzi.DaylightName)); + + size = sizeof(name); + memset(name, 0, sizeof(name)); + status = pRegGetValueW(subkey, NULL, L"Display", RRF_RT_REG_SZ, NULL, name, &size); + ok(status == ERROR_SUCCESS, "status %d %s Display %s\n", + status, wine_dbgstr_w(keyname), wine_dbgstr_w(name)); + ok(*name, "Display name is empty\n"); if (pRegLoadMUIStringW) - status = pRegLoadMUIStringW(subkey, L"MUI_Display", displayname, size, &size, 0, sysdir); - else - status = pRegGetValueW(subkey, NULL, L"Display", RRF_RT_REG_SZ, NULL, displayname, &size); - todo_wine ok(status == ERROR_SUCCESS, "status %d displayname %s\n", status, wine_dbgstr_w(displayname)); + { + size = sizeof(name); + memset(name, 0, sizeof(name)); + status = pRegLoadMUIStringW(subkey, L"MUI_Display", name, size, &size, 0, sysdir); + /* recently added time zones may not have MUI strings */ + todo_wine ok((status == ERROR_SUCCESS && *name) || + broken(status == ERROR_RESOURCE_TYPE_NOT_FOUND) /* Win10 1809 32-bit */ || + broken(status == ERROR_MUI_FILE_NOT_FOUND) /* Win10 1809 64-bit */, + "status %d MUI_Display %s\n", status, wine_dbgstr_w(name)); + } } else { @@ -4132,6 +4156,7 @@ static void test_EnumDynamicTimeZoneInformation(void) "expected %s, got %s\n", dbgstr_SYSTEMTIME(&tz_data.dlt_date), dbgstr_SYSTEMTIME(&dtzi.DaylightDate));
+ winetest_pop_context(); RegCloseKey(subkey); index++; }
Hi,
Il 15/05/21 17:37, Francois Gouget ha scritto:
@@ -4079,31 +4079,55 @@ static void test_EnumDynamicTimeZoneInformation(void) { size = sizeof(name); memset(name, 0, sizeof(name));
status = pRegGetValueW(subkey, NULL, L"Std", RRF_RT_REG_SZ, NULL, name, &size);
ok(status == ERROR_SUCCESS, "status %d Std %s\n", status,
wine_dbgstr_w(name));
ok(*name, "Std name is empty\n"); if (pRegLoadMUIStringW)
{
size = sizeof(name);
memset(name, 0, sizeof(name)); status = pRegLoadMUIStringW(subkey, L"MUI_Std", name, size, &size, 0, sysdir);
else
status = pRegGetValueW(subkey, NULL, L"Std", RRF_RT_REG_SZ, NULL, name, &size);
ok(status == ERROR_SUCCESS, "status %d name %s\n", status, wine_dbgstr_w(name));
ok(!memcmp(&dtzi.StandardName, name, size),
"expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(dtzi.StandardName));
ok(status == ERROR_SUCCESS, "status %d MUI_Std %s\n",
status, wine_dbgstr_w(name));
}
ok(!memcmp(&dtzi.StandardName, name, size), "expected %s, got %s\n",
wine_dbgstr_w(name), wine_dbgstr_w(dtzi.StandardName)); size = sizeof(name); memset(name, 0, sizeof(name));
status = pRegGetValueW(subkey, NULL, L"Dlt", RRF_RT_REG_SZ, NULL, name, &size);
ok(status == ERROR_SUCCESS, "status %d %s Dlt %s\n",
status, wine_dbgstr_w(keyname), wine_dbgstr_w(name));
ok(*name, "Dlt name is empty\n"); if (pRegLoadMUIStringW)
{
size = sizeof(name);
memset(name, 0, sizeof(name)); status = pRegLoadMUIStringW(subkey, L"MUI_Dlt", name, size, &size, 0, sysdir);
else
status = pRegGetValueW(subkey, NULL, L"Dlt", RRF_RT_REG_SZ, NULL, name, &size);
ok(status == ERROR_SUCCESS, "status %d name %s\n", status, wine_dbgstr_w(name));
ok(!memcmp(&dtzi.DaylightName, name, size),
"expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(dtzi.DaylightName));
size = sizeof(displayname);
memset(displayname, 0, sizeof(displayname));
ok(status == ERROR_SUCCESS, "status %d %s MUI_Dlt %s\n",
status, wine_dbgstr_w(keyname), wine_dbgstr_w(name));
}
ok(!memcmp(&dtzi.DaylightName, name, size), "expected %s, got %s\n",
wine_dbgstr_w(name), wine_dbgstr_w(dtzi.DaylightName));
size = sizeof(name);
memset(name, 0, sizeof(name));
status = pRegGetValueW(subkey, NULL, L"Display", RRF_RT_REG_SZ, NULL, name, &size);
ok(status == ERROR_SUCCESS, "status %d %s Display %s\n",
status, wine_dbgstr_w(keyname), wine_dbgstr_w(name));
ok(*name, "Display name is empty\n"); if (pRegLoadMUIStringW)
status = pRegLoadMUIStringW(subkey, L"MUI_Display", displayname, size, &size, 0, sysdir);
else
status = pRegGetValueW(subkey, NULL, L"Display", RRF_RT_REG_SZ, NULL, displayname, &size);
todo_wine ok(status == ERROR_SUCCESS, "status %d displayname %s\n", status, wine_dbgstr_w(displayname));
{
size = sizeof(name);
memset(name, 0, sizeof(name));
status = pRegLoadMUIStringW(subkey, L"MUI_Display", name, size, &size, 0, sysdir);
/* recently added time zones may not have MUI strings */
todo_wine ok((status == ERROR_SUCCESS && *name) ||
broken(status == ERROR_RESOURCE_TYPE_NOT_FOUND) /* Win10 1809 32-bit */ ||
broken(status == ERROR_MUI_FILE_NOT_FOUND) /* Win10 1809 64-bit */,
"status %d MUI_Display %s\n", status, wine_dbgstr_w(name));
Why don't you check for *name after the first two calls to pRegLoadMUIStringW?
} } else {
Thanks, Giovanni.
On Mon, 17 May 2021, Giovanni Mascellani wrote: [...]
/* recently added time zones may not have MUI strings */
todo_wine ok((status == ERROR_SUCCESS && *name) ||
broken(status == ERROR_RESOURCE_TYPE_NOT_FOUND) /* Win10
1809 32-bit */ ||
broken(status == ERROR_MUI_FILE_NOT_FOUND) /* Win10 1809
64-bit */,
"status %d MUI_Display %s\n", status,
wine_dbgstr_w(name));
Why don't you check for *name after the first two calls to pRegLoadMUIStringW?
It would be redundant with the memcmp() that follows? (or I misunderstood)
status = pRegLoadMUIStringW(subkey, L"MUI_Std", name, size, &size, 0, sysdir); ok(status == ERROR_SUCCESS, "status %d MUI_Std %s\n", status, wine_dbgstr_w(name)); } ok(!memcmp(&dtzi.StandardName, name, size), "expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(dtzi.StandardName));
Hi,
Il 17/05/21 14:41, Francois Gouget ha scritto:
On Mon, 17 May 2021, Giovanni Mascellani wrote: [...]
/* recently added time zones may not have MUI strings */
todo_wine ok((status == ERROR_SUCCESS && *name) ||
broken(status == ERROR_RESOURCE_TYPE_NOT_FOUND) /* Win10
1809 32-bit */ ||
broken(status == ERROR_MUI_FILE_NOT_FOUND) /* Win10 1809
64-bit */,
"status %d MUI_Display %s\n", status,
wine_dbgstr_w(name));
Why don't you check for *name after the first two calls to pRegLoadMUIStringW?
It would be redundant with the memcmp() that follows? (or I misunderstood)
status = pRegLoadMUIStringW(subkey, L"MUI_Std", name, size, &size, 0, sysdir); ok(status == ERROR_SUCCESS, "status %d MUI_Std %s\n", status, wine_dbgstr_w(name)); } ok(!memcmp(&dtzi.StandardName, name, size), "expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(dtzi.StandardName));
Unless I am mistaken, memcmp() checks that dtzi.StandardName and name are the same string (or, technically, that name is a prefix of dtzi.StandardName, which might be longer). They could be both empty strings.
BTW, this is not really a big problem in practice. I asked just because I saw that in the case of Display you did this check.
Thanks, Giovanni.
On Mon, 17 May 2021, Giovanni Mascellani wrote: [...]
It would be redundant with the memcmp() that follows? (or I misunderstood)
status = pRegLoadMUIStringW(subkey, L"MUI_Std", name, size,
&size, 0, sysdir); ok(status == ERROR_SUCCESS, "status %d MUI_Std %s\n", status, wine_dbgstr_w(name)); } ok(!memcmp(&dtzi.StandardName, name, size), "expected %s, got %s\n", wine_dbgstr_w(name), wine_dbgstr_w(dtzi.StandardName));
Unless I am mistaken, memcmp() checks that dtzi.StandardName and name are the same string (or, technically, that name is a prefix of dtzi.StandardName, which might be longer). They could be both empty strings.
Right. I assumed that dtzi.*Name was known to be valid / cannot be empty. I only added the *name check for the display name because we don't have anything to compare it to.
BTW, this is not really a big problem in practice. I asked just because I saw that in the case of Display you did this check.
I'll resubmit with the extra *name checks.