Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
August 2021
- 78 participants
- 929 discussions
11 Aug '21
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
tests/d3d12.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index aaf4bfca..9e8aa837 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -9432,6 +9432,29 @@ static void test_shader_instructions(void)
0x00000001, 0x00000000,
};
static struct named_shader ps_ftod = {"ftod", ps_ftod_code, sizeof(ps_ftod_code)};
+ static const DWORD ps_dmul_code[] =
+ {
+#if 0
+ double2 src0;
+
+ void main(out uint4 dst : SV_Target)
+ {
+ asuint(src0.x * src0.y, dst.x, dst.y);
+ asuint(src0.x * -src0.y, dst.z, dst.w);
+ }
+#endif
+ 0x43425844, 0xe8fbac4e, 0x46b3cd8c, 0x6a38f67a, 0xfe02dbd5, 0x00000001, 0x00000134, 0x00000004,
+ 0x00000030, 0x00000040, 0x00000074, 0x00000124, 0x4e475349, 0x00000008, 0x00000000, 0x00000008,
+ 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001,
+ 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x000000a8, 0x00000050,
+ 0x0000002a, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2,
+ 0x00000000, 0x02000068, 0x00000001, 0x090000c2, 0x00100032, 0x00000000, 0x00208ee6, 0x00000000,
+ 0x00000000, 0x00208446, 0x00000000, 0x00000000, 0x05000036, 0x00102032, 0x00000000, 0x00100046,
+ 0x00000000, 0x0a0000c2, 0x00100032, 0x00000000, 0x80208ee6, 0x00000041, 0x00000000, 0x00000000,
+ 0x00208446, 0x00000000, 0x00000000, 0x05000036, 0x001020c2, 0x00000000, 0x00100406, 0x00000000,
+ 0x0100003e, 0x30494653, 0x00000008, 0x00000001, 0x00000000,
+ };
+ static const struct named_shader ps_dmul = {"dmul", ps_dmul_code, sizeof(ps_dmul_code)};
static const DWORD ps_ddiv_code[] =
{
#if 0
@@ -9984,6 +10007,7 @@ static void test_shader_instructions(void)
{&ps_utod, {.u = {{3, 0xffffffff}}}, {.d = {3.0, 4294967295.0}}, true, true},
{&ps_itod, {.u = {{3, INT_MIN}}}, {.d = {3.0, -2147483648.0}}, true, true},
{&ps_ftod, {.f = {{-2.5f, -2.5f}}}, {.d = {-2.5, 2.5}}, true, true},
+ {&ps_dmul, {.d = {{ 1.5, 3.0}}}, {.d = { 4.5, -4.5}}, true, true},
{&ps_ddiv, {.d = {{ 2.0, 4.0}}}, {.d = { 0.5, 2.0}}, true, true},
{&ps_ddiv, {.d = {{ 2.0, -4.0}}}, {.d = {-0.5, -2.0}}, true, true},
{&ps_drcp, {.d = {{ 2.0, -0.5}}}, {.d = { 0.5, -2.0}}, true, true},
--
2.32.0
2
9
11 Aug '21
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/advapi32/tests/registry.c | 517 +++++++++++++++++++++------------
1 file changed, 338 insertions(+), 179 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 4daf40b7aad..7e1348bf33d 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -3600,218 +3600,377 @@ static void test_RegNotifyChangeKeyValue(void)
CloseHandle(event);
}
-#define cmp_li(a, b, c) cmp_li_real(a, b, c, __LINE__)
-static void cmp_li_real(LARGE_INTEGER *l1, LARGE_INTEGER *l2, LONGLONG slack, int line)
+static const char *find_counter_value(const char *text, const char *index)
{
- LONGLONG diff = l2->QuadPart - l1->QuadPart;
- if (diff < 0) diff = -diff;
- ok_(__FILE__, line)(diff <= slack, "values don't match: %s/%s\n",
- wine_dbgstr_longlong(l1->QuadPart), wine_dbgstr_longlong(l2->QuadPart));
+ const char *p = text;
+
+ while (*p)
+ {
+ if (!strcmp(p, index))
+ return p + strlen(p) + 1;
+
+ p += strlen(p) + 1;
+ p += strlen(p) + 1;
+ }
+
+ return NULL;
}
-static void test_RegQueryValueExPerformanceData(void)
+static void test_counter_values(const char *text, HKEY key)
{
- static const char * const names[] = { NULL, "", "Global", "2", "invalid counter name" };
- DWORD cbData, len, i, type;
- BYTE *value;
- DWORD dwret;
- LONG limit = 6;
- PERF_DATA_BLOCK *pdb;
- HKEY hkey;
- BYTE buf[256 + sizeof(PERF_DATA_BLOCK)];
+ const char *p = text;
+ const char *name;
- /* Test with data == NULL */
- dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, NULL, &cbData );
- ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
+ ok(!strcmp(p, "1"), "got first index %s\n", debugstr_a(p));
+ p += strlen(p) + 1;
+ ok(!strcmp(p, "1847"), "got first name %s\n", debugstr_a(p));
+ p += strlen(p) + 1;
- dwret = RegQueryValueExW( HKEY_PERFORMANCE_DATA, L"Global", NULL, NULL, NULL, &cbData );
- ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
-
- /* Test ERROR_MORE_DATA, start with small buffer */
- len = 10;
- value = HeapAlloc(GetProcessHeap(), 0, len);
- cbData = len;
- type = 0xdeadbeef;
- dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, &type, value, &cbData );
- ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
- ok(type == REG_BINARY, "got %u\n", type);
- while( dwret == ERROR_MORE_DATA && limit)
+ while (*p)
{
- len = len * 10;
- value = HeapReAlloc( GetProcessHeap(), 0, value, len );
- cbData = len;
- type = 0xdeadbeef;
- dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, &type, value, &cbData );
- limit--;
- }
- ok(limit > 0, "too many times ERROR_MORE_DATA returned\n");
+ unsigned int index = atoi(p);
- ok(dwret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", dwret);
- ok(type == REG_BINARY, "got %u\n", type);
+ ok(index > 0, "expected nonzero index\n");
- /* Check returned data */
- if (dwret == ERROR_SUCCESS)
- {
- ok(len >= sizeof(PERF_DATA_BLOCK), "got size %d\n", len);
- if (len >= sizeof(PERF_DATA_BLOCK)) {
- pdb = (PERF_DATA_BLOCK*) value;
- ok(pdb->Signature[0] == 'P', "expected Signature[0] = 'P', got 0x%x\n", pdb->Signature[0]);
- ok(pdb->Signature[1] == 'E', "expected Signature[1] = 'E', got 0x%x\n", pdb->Signature[1]);
- ok(pdb->Signature[2] == 'R', "expected Signature[2] = 'R', got 0x%x\n", pdb->Signature[2]);
- ok(pdb->Signature[3] == 'F', "expected Signature[3] = 'F', got 0x%x\n", pdb->Signature[3]);
- /* TODO: check other field */
- }
+ p += strlen(p) + 1;
+ ok(*p, "name missing for %u\n", index);
+ p += strlen(p) + 1;
}
- HeapFree(GetProcessHeap(), 0, value);
+ name = find_counter_value(text, "1846");
+ ok(name != NULL, "did not find name\n");
+ if (key != HKEY_PERFORMANCE_NLSTEXT)
+ ok(!strcmp(name, "End Marker"), "got name %s\n", debugstr_a(name));
+}
- for (i = 0; i < ARRAY_SIZE(names); i++)
+static void test_help_values(const char *text, HKEY key)
+{
+ const char *p = text;
+ const char *name;
+
+ while (*p)
{
- cbData = 0xdeadbeef;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, names[i], NULL, NULL, NULL, &cbData);
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
+ unsigned int index = atoi(p);
- cbData = 0;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, names[i], NULL, NULL, NULL, &cbData);
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
+ ok(index > 0, "expected nonzero index\n");
- cbData = 0xdeadbeef;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_TEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
-
- cbData = 0;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_TEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
-
- cbData = 0xdeadbeef;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_NLSTEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
-
- cbData = 0;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_NLSTEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
+ p += strlen(p) + 1;
+ p += strlen(p) + 1;
}
- memset(buf, 0x77, sizeof(buf));
- type = 0xdeadbeef;
- cbData = sizeof(buf);
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "invalid counter name", NULL, &type, buf, &cbData);
- ok(dwret == ERROR_SUCCESS, "got %u\n", dwret);
- ok(type == REG_BINARY, "got %u\n", type);
- if (dwret == ERROR_SUCCESS)
+ name = find_counter_value(text, "1847");
+ ok(name != NULL, "did not find name\n");
+ if (key != HKEY_PERFORMANCE_NLSTEXT)
+ ok(!strcmp(name, "End Marker"), "got name %s\n", debugstr_a(name));
+}
+
+static void test_performance_keys(void)
+{
+ static const HKEY keys[] = {HKEY_PERFORMANCE_DATA, HKEY_PERFORMANCE_TEXT, HKEY_PERFORMANCE_NLSTEXT};
+ static const char *const names[] = {NULL, "", "Global", "2", "invalid counter name", "System"};
+ DWORD size, type, sysname_len, expect_size, key_count, value_count;
+ LARGE_INTEGER perftime1, perftime2, systime1, systime2, freq;
+ WCHAR sysname[MAX_COMPUTERNAME_LENGTH + 1];
+ unsigned int buffer_size = 1024 * 1024;
+ void *buffer, *bufferW;
+ PERF_DATA_BLOCK *data;
+ union
{
- SYSTEMTIME st;
- WCHAR sysname[MAX_COMPUTERNAME_LENGTH + 1];
- DWORD sysname_len;
- LARGE_INTEGER counter, freq, ftime;
+ FILETIME f;
+ LONGLONG l;
+ } file_time;
+ unsigned int i, j;
+ HKEY key;
+ LONG ret;
- GetSystemTime(&st);
- GetSystemTimeAsFileTime((FILETIME *)&ftime);
- QueryPerformanceCounter(&counter);
- QueryPerformanceFrequency(&freq);
+ buffer = malloc(buffer_size);
- sysname_len = MAX_COMPUTERNAME_LENGTH + 1;
- GetComputerNameW(sysname, &sysname_len);
+ sysname_len = ARRAY_SIZE(sysname);
+ GetComputerNameW(sysname, &sysname_len);
- pdb = (PERF_DATA_BLOCK *)buf;
- ok(pdb->Signature[0] == 'P', "got '%c'\n", pdb->Signature[0]);
- ok(pdb->Signature[1] == 'E', "got '%c'\n", pdb->Signature[1]);
- ok(pdb->Signature[2] == 'R', "got '%c'\n", pdb->Signature[2]);
- ok(pdb->Signature[3] == 'F', "got '%c'\n", pdb->Signature[3]);
+ for (i = 0; i < ARRAY_SIZE(keys); ++i)
+ {
+ winetest_push_context("key %p", keys[i]);
- ok(pdb->LittleEndian == 1, "got %u\n", pdb->LittleEndian);
- ok(pdb->Version == 1, "got %u\n", pdb->Version);
- ok(pdb->Revision == 1, "got %u\n", pdb->Revision);
- len = (sizeof(*pdb) + pdb->SystemNameLength + 7) & ~7;
- ok(pdb->TotalByteLength == len, "got %u vs %u\n", pdb->TotalByteLength, len);
- ok(pdb->HeaderLength == pdb->TotalByteLength, "got %u\n", pdb->HeaderLength);
- ok(pdb->NumObjectTypes == 0, "got %u\n", pdb->NumObjectTypes);
-todo_wine
- ok(pdb->DefaultObject != 0, "got %u\n", pdb->DefaultObject);
- ok(pdb->SystemTime.wYear == st.wYear, "got %u\n", pdb->SystemTime.wYear);
- ok(pdb->SystemTime.wMonth == st.wMonth, "got %u\n", pdb->SystemTime.wMonth);
- ok(pdb->SystemTime.wDayOfWeek == st.wDayOfWeek, "got %u\n", pdb->SystemTime.wDayOfWeek);
- ok(pdb->SystemTime.wDay == st.wDay, "got %u\n", pdb->SystemTime.wDay);
- if (U(pdb->PerfTime).LowPart != 0x77777777) /* TestBot is broken */
- cmp_li(&pdb->PerfTime, &counter, freq.QuadPart);
- if (U(pdb->PerfFreq).LowPart != 0x77777777) /* TestBot is broken */
- cmp_li(&pdb->PerfFreq, &freq, 0);
- cmp_li(&pdb->PerfTime100nSec, &ftime, 200000); /* TestBot needs huge slack value */
- ok(pdb->SystemNameLength == (sysname_len + 1) * sizeof(WCHAR), "expected %u, got %u\n",
- (sysname_len + 1) * 2 /*sizeof(WCHAR)*/, pdb->SystemNameLength);
- ok(pdb->SystemNameOffset == sizeof(*pdb), "got %u\n", pdb->SystemNameOffset);
- ok(!lstrcmpW(sysname, (LPCWSTR)(pdb + 1)), "%s != %s\n",
- wine_dbgstr_w(sysname), wine_dbgstr_w((LPCWSTR)(pdb + 1)));
-
- len = pdb->TotalByteLength - (sizeof(*pdb) + pdb->SystemNameLength);
- if (len)
+ for (j = 0; j < ARRAY_SIZE(names); ++j)
{
- BYTE remainder[8], *p;
+ winetest_push_context("value %s", debugstr_a(names[j]));
- memset(remainder, 0x77, sizeof(remainder));
- p = buf + sizeof(*pdb) + pdb->SystemNameLength;
- ok(!memcmp(p, remainder, len), "remainder: %02x,%02x...\n", p[0], p[1]);
+ QueryPerformanceFrequency(&freq);
+
+ size = 0;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, NULL, NULL, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ ok(!size, "got size %u\n", size);
+
+ size = 10;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, NULL, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(size == 10, "got size %u\n", size);
+
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, NULL, NULL, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+
+ QueryPerformanceCounter(&perftime1);
+ NtQuerySystemTime(&systime1);
+
+ size = buffer_size;
+ type = 0xdeadbeef;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(type == REG_BINARY, "got type %u\n", type);
+ ok(size >= sizeof(PERF_DATA_BLOCK) && size < buffer_size, "got size %u\n", size);
+ }
+
+ if (ret)
+ {
+ winetest_pop_context();
+ continue;
+ }
+
+ QueryPerformanceCounter(&perftime2);
+ NtQuerySystemTime(&systime2);
+
+ data = buffer;
+ ok(!wcsncmp(data->Signature, L"PERF", 4), "got signature %s\n",
+ debugstr_wn(data->Signature, 4));
+ ok(data->LittleEndian == 1, "got endianness %u\n", data->LittleEndian);
+ ok(data->Version == 1, "got version %u\n", data->Version);
+ ok(data->Revision == 1, "got version %u\n", data->Revision);
+ ok(data->TotalByteLength == size, "expected size %u, got %u\n",
+ size, data->TotalByteLength);
+
+ expect_size = sizeof(PERF_DATA_BLOCK) + data->SystemNameLength;
+ expect_size = (expect_size + 7) & ~7;
+
+ ok(data->HeaderLength == expect_size, "expected header size %u, got %u\n",
+ expect_size, data->HeaderLength);
+ /* todo: test objects... */
+ todo_wine ok(data->DefaultObject == 238, "got default object %u\n", data->DefaultObject);
+
+ ok(data->PerfTime.QuadPart >= perftime1.QuadPart
+ && data->PerfTime.QuadPart <= perftime2.QuadPart,
+ "got times %I64u, %I64u, %I64u\n",
+ perftime1.QuadPart, data->PerfTime.QuadPart, perftime2.QuadPart);
+ ok(data->PerfFreq.QuadPart == freq.QuadPart, "expected frequency %I64u, got %I64u\n",
+ freq.QuadPart, data->PerfFreq.QuadPart);
+ ok(data->PerfTime100nSec.QuadPart >= systime1.QuadPart
+ && data->PerfTime100nSec.QuadPart <= systime2.QuadPart,
+ "got times %I64u, %I64u, %I64u\n",
+ systime1.QuadPart, data->PerfTime100nSec.QuadPart, systime2.QuadPart);
+ SystemTimeToFileTime(&data->SystemTime, &file_time.f);
+ /* SYSTEMTIME has a granularity of 1 ms */
+ ok(file_time.l >= systime1.QuadPart - 10000 && file_time.l <= systime2.QuadPart,
+ "got times %I64u, %I64u, %I64u\n", systime1.QuadPart, file_time.l, systime2.QuadPart);
+
+ ok(data->SystemNameLength == (sysname_len + 1) * sizeof(WCHAR),
+ "expected name len %u, got %u\n",
+ (sysname_len + 1) * sizeof(WCHAR), data->SystemNameLength);
+ ok(data->SystemNameOffset == sizeof(PERF_DATA_BLOCK),
+ "got name offset %u\n", data->SystemNameOffset);
+ ok(!wcscmp(sysname, (const WCHAR *)(data + 1)), "expected name %s, got %s\n",
+ debugstr_w(sysname), debugstr_w((const WCHAR *)(data + 1)));
+
+ winetest_pop_context();
}
+
+ /* test the "Counter" value */
+
+ size = 0xdeadbeef;
+ ret = RegQueryValueExA(keys[i], "cOuNtEr", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0 && size < 0xdeadbeef, "got size %u\n", size);
+ }
+
+ type = 0xdeadbeef;
+ size = 0;
+ ret = RegQueryValueExA(keys[i], "cOuNtEr", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ todo_wine ok(size > 0, "got size %u\n", size);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "cOuNtEr", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_counter_values(buffer, keys[i]);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "cOuNtErwine", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_counter_values(buffer, keys[i]);
+
+ size = 0;
+ ret = RegQueryValueExW(keys[i], L"cOuNtEr", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0, "got size %u\n", size);
+ }
+
+ bufferW = malloc(size);
+
+ type = 0xdeadbeef;
+ ret = RegQueryValueExW(keys[i], L"cOuNtEr", NULL, &type, bufferW, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ }
+ if (type == REG_MULTI_SZ)
+ {
+ WideCharToMultiByte(CP_ACP, 0, bufferW, size / sizeof(WCHAR), buffer, buffer_size, NULL, NULL);
+ test_counter_values(buffer, keys[i]);
+ }
+
+ /* test the "Help" value */
+
+ size = 0xdeadbeef;
+ ret = RegQueryValueExA(keys[i], "hElP", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0 && size < 0xdeadbeef, "got size %u\n", size);
+ }
+
+ type = 0xdeadbeef;
+ size = 0;
+ ret = RegQueryValueExA(keys[i], "hElP", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ todo_wine ok(size > 0, "got size %u\n", size);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "hElP", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_help_values(buffer, keys[i]);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "hElPwine", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_help_values(buffer, keys[i]);
+
+ size = 0;
+ ret = RegQueryValueExW(keys[i], L"hElP", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0, "got size %u\n", size);
+ }
+
+ bufferW = malloc(size);
+
+ type = 0xdeadbeef;
+ ret = RegQueryValueExW(keys[i], L"hElP", NULL, &type, bufferW, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ }
+ if (type == REG_MULTI_SZ)
+ {
+ WideCharToMultiByte(CP_ACP, 0, bufferW, size / sizeof(WCHAR), buffer, buffer_size, NULL, NULL);
+ test_help_values(buffer, keys[i]);
+ }
+
+ /* test other registry APIs */
+
+ ret = RegOpenKeyA(keys[i], NULL, &key);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegOpenKeyA(keys[i], "Global", &key);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegOpenKeyExA(keys[i], "Global", 0, KEY_READ, &key);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ size = 0;
+ ret = RegQueryValueA(keys[i], "Global", NULL, (LONG *)&size);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegSetValueA(keys[i], "Global", REG_SZ, "dummy", 5);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegQueryInfoKeyA(keys[i], NULL, NULL, NULL, &key_count, NULL,
+ NULL, &value_count, NULL, NULL, NULL, NULL);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(!key_count, "got %u subkeys\n", key_count);
+ todo_wine ok(value_count == 2, "got %u values\n", value_count);
+
+ size = buffer_size;
+ ret = RegEnumValueA(keys[i], 0, buffer, &size, NULL, NULL, NULL, NULL);
+ todo_wine ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ ok(size == buffer_size, "got size %u\n", size);
+
+ ret = RegCloseKey(keys[i]);
+ ok(!ret, "got %u\n", ret);
+
+ ret = RegCloseKey(keys[i]);
+ ok(!ret, "got %u\n", ret);
+
+ winetest_pop_context();
}
- dwret = RegOpenKeyA(HKEY_PERFORMANCE_DATA, NULL, &hkey);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
+ ret = RegSetValueExA(HKEY_PERFORMANCE_DATA, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
- dwret = RegOpenKeyA(HKEY_PERFORMANCE_DATA, "Global", &hkey);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
+ ret = RegSetValueExA(HKEY_PERFORMANCE_TEXT, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
- dwret = RegOpenKeyExA(HKEY_PERFORMANCE_DATA, "Global", 0, KEY_READ, &hkey);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- dwret = RegQueryValueA(HKEY_PERFORMANCE_DATA, "Global", NULL, (LONG *)&cbData);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- dwret = RegSetValueA(HKEY_PERFORMANCE_DATA, "Global", REG_SZ, "dummy", 4);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- dwret = RegSetValueExA(HKEY_PERFORMANCE_DATA, "Global", 0, REG_SZ, (const BYTE *)"dummy", 40);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- cbData = sizeof(buf);
- dwret = RegEnumKeyA(HKEY_PERFORMANCE_DATA, 0, (LPSTR)buf, cbData);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- cbData = sizeof(buf);
- dwret = RegEnumValueA(HKEY_PERFORMANCE_DATA, 0, (LPSTR)buf, &cbData, NULL, NULL, NULL, NULL);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "got %u\n", dwret);
-todo_wine
- ok(cbData == sizeof(buf), "got %u\n", cbData);
-
- dwret = RegEnumValueA(HKEY_PERFORMANCE_DATA, 0, NULL, &cbData, NULL, NULL, NULL, NULL);
- ok(dwret == ERROR_INVALID_PARAMETER, "got %u\n", dwret);
+ ret = RegSetValueExA(HKEY_PERFORMANCE_NLSTEXT, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
if (pRegSetKeyValueW)
{
- dwret = pRegSetKeyValueW(HKEY_PERFORMANCE_DATA, NULL, L"Global", REG_SZ, L"dummy", 10);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
+ ret = pRegSetKeyValueW(HKEY_PERFORMANCE_DATA, NULL, L"Global", REG_SZ, L"dummy", 10);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = pRegSetKeyValueW(HKEY_PERFORMANCE_TEXT, NULL, L"Global", REG_SZ, L"dummy", 10);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
+
+ ret = pRegSetKeyValueW(HKEY_PERFORMANCE_NLSTEXT, NULL, L"Global", REG_SZ, L"dummy", 10);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
}
- dwret = RegCloseKey(HKEY_PERFORMANCE_DATA);
- ok(dwret == ERROR_SUCCESS, "got %u\n", dwret);
+ ret = RegEnumKeyA(HKEY_PERFORMANCE_DATA, 0, buffer, buffer_size);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegEnumKeyA(HKEY_PERFORMANCE_TEXT, 0, buffer, buffer_size);
+ todo_wine ok(ret == ERROR_NO_MORE_ITEMS, "got %u\n", ret);
+
+ ret = RegEnumKeyA(HKEY_PERFORMANCE_NLSTEXT, 0, buffer, buffer_size);
+ todo_wine ok(ret == ERROR_NO_MORE_ITEMS, "got %u\n", ret);
+
+ free(buffer);
}
static void test_perflib_key(void)
@@ -4348,7 +4507,7 @@ START_TEST(registry)
test_delete_key_value();
test_RegOpenCurrentUser();
test_RegNotifyChangeKeyValue();
- test_RegQueryValueExPerformanceData();
+ test_performance_keys();
test_RegLoadMUIString();
test_EnumDynamicTimeZoneInformation();
test_perflib_key();
--
2.30.2
2
5
11 Aug '21
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/advapi32/tests/registry.c | 516 +++++++++++++++++++++------------
1 file changed, 337 insertions(+), 179 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 4daf40b7aad..85fb757792a 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -3600,218 +3600,376 @@ static void test_RegNotifyChangeKeyValue(void)
CloseHandle(event);
}
-#define cmp_li(a, b, c) cmp_li_real(a, b, c, __LINE__)
-static void cmp_li_real(LARGE_INTEGER *l1, LARGE_INTEGER *l2, LONGLONG slack, int line)
+static const char *find_counter_value(const char *text, const char *index)
{
- LONGLONG diff = l2->QuadPart - l1->QuadPart;
- if (diff < 0) diff = -diff;
- ok_(__FILE__, line)(diff <= slack, "values don't match: %s/%s\n",
- wine_dbgstr_longlong(l1->QuadPart), wine_dbgstr_longlong(l2->QuadPart));
+ const char *p = text;
+
+ while (*p)
+ {
+ if (!strcmp(p, index))
+ return p + strlen(p) + 1;
+
+ p += strlen(p) + 1;
+ p += strlen(p) + 1;
+ }
+
+ return NULL;
}
-static void test_RegQueryValueExPerformanceData(void)
+static void test_counter_values(const char *text, HKEY key)
{
- static const char * const names[] = { NULL, "", "Global", "2", "invalid counter name" };
- DWORD cbData, len, i, type;
- BYTE *value;
- DWORD dwret;
- LONG limit = 6;
- PERF_DATA_BLOCK *pdb;
- HKEY hkey;
- BYTE buf[256 + sizeof(PERF_DATA_BLOCK)];
+ const char *p = text;
+ const char *name;
- /* Test with data == NULL */
- dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, NULL, &cbData );
- ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
+ ok(!strcmp(p, "1"), "got first index %s\n", debugstr_a(p));
+ p += strlen(p) + 1;
+ ok(!strcmp(p, "1847"), "got first name %s\n", debugstr_a(p));
+ p += strlen(p) + 1;
- dwret = RegQueryValueExW( HKEY_PERFORMANCE_DATA, L"Global", NULL, NULL, NULL, &cbData );
- ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
-
- /* Test ERROR_MORE_DATA, start with small buffer */
- len = 10;
- value = HeapAlloc(GetProcessHeap(), 0, len);
- cbData = len;
- type = 0xdeadbeef;
- dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, &type, value, &cbData );
- ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
- ok(type == REG_BINARY, "got %u\n", type);
- while( dwret == ERROR_MORE_DATA && limit)
+ while (*p)
{
- len = len * 10;
- value = HeapReAlloc( GetProcessHeap(), 0, value, len );
- cbData = len;
- type = 0xdeadbeef;
- dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, &type, value, &cbData );
- limit--;
- }
- ok(limit > 0, "too many times ERROR_MORE_DATA returned\n");
+ unsigned int index = atoi(p);
- ok(dwret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", dwret);
- ok(type == REG_BINARY, "got %u\n", type);
+ ok(index > 0, "expected nonzero index\n");
- /* Check returned data */
- if (dwret == ERROR_SUCCESS)
- {
- ok(len >= sizeof(PERF_DATA_BLOCK), "got size %d\n", len);
- if (len >= sizeof(PERF_DATA_BLOCK)) {
- pdb = (PERF_DATA_BLOCK*) value;
- ok(pdb->Signature[0] == 'P', "expected Signature[0] = 'P', got 0x%x\n", pdb->Signature[0]);
- ok(pdb->Signature[1] == 'E', "expected Signature[1] = 'E', got 0x%x\n", pdb->Signature[1]);
- ok(pdb->Signature[2] == 'R', "expected Signature[2] = 'R', got 0x%x\n", pdb->Signature[2]);
- ok(pdb->Signature[3] == 'F', "expected Signature[3] = 'F', got 0x%x\n", pdb->Signature[3]);
- /* TODO: check other field */
- }
+ p += strlen(p) + 1;
+ ok(*p, "name missing for %u\n", index);
+ p += strlen(p) + 1;
}
- HeapFree(GetProcessHeap(), 0, value);
+ name = find_counter_value(text, "1846");
+ ok(name != NULL, "did not find name\n");
+ if (key != HKEY_PERFORMANCE_NLSTEXT)
+ ok(!strcmp(name, "End Marker"), "got name %s\n", debugstr_a(name));
+}
- for (i = 0; i < ARRAY_SIZE(names); i++)
+static void test_help_values(const char *text, HKEY key)
+{
+ const char *p = text;
+ const char *name;
+
+ while (*p)
{
- cbData = 0xdeadbeef;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, names[i], NULL, NULL, NULL, &cbData);
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
+ unsigned int index = atoi(p);
- cbData = 0;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, names[i], NULL, NULL, NULL, &cbData);
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
+ ok(index > 0, "expected nonzero index\n");
- cbData = 0xdeadbeef;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_TEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
-
- cbData = 0;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_TEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
-
- cbData = 0xdeadbeef;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_NLSTEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
-
- cbData = 0;
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_NLSTEXT, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
- ok(cbData == 0, "got %u\n", cbData);
+ p += strlen(p) + 1;
+ p += strlen(p) + 1;
}
- memset(buf, 0x77, sizeof(buf));
- type = 0xdeadbeef;
- cbData = sizeof(buf);
- dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "invalid counter name", NULL, &type, buf, &cbData);
- ok(dwret == ERROR_SUCCESS, "got %u\n", dwret);
- ok(type == REG_BINARY, "got %u\n", type);
- if (dwret == ERROR_SUCCESS)
+ name = find_counter_value(text, "1847");
+ ok(name != NULL, "did not find name\n");
+ if (key != HKEY_PERFORMANCE_NLSTEXT)
+ ok(!strcmp(name, "End Marker"), "got name %s\n", debugstr_a(name));
+}
+
+static void test_performance_keys(void)
+{
+ static const HKEY keys[] = {HKEY_PERFORMANCE_DATA, HKEY_PERFORMANCE_TEXT, HKEY_PERFORMANCE_NLSTEXT};
+ static const char *const names[] = {NULL, "", "Global", "2", "invalid counter name", "System"};
+ DWORD size, type, sysname_len, expect_size, key_count, value_count;
+ LARGE_INTEGER perftime1, perftime2, systime1, systime2, freq;
+ WCHAR sysname[MAX_COMPUTERNAME_LENGTH + 1];
+ unsigned int buffer_size = 1024 * 1024;
+ void *buffer, *bufferW;
+ PERF_DATA_BLOCK *data;
+ union
{
- SYSTEMTIME st;
- WCHAR sysname[MAX_COMPUTERNAME_LENGTH + 1];
- DWORD sysname_len;
- LARGE_INTEGER counter, freq, ftime;
+ FILETIME f;
+ LONGLONG l;
+ } file_time;
+ unsigned int i, j;
+ HKEY key;
+ LONG ret;
- GetSystemTime(&st);
- GetSystemTimeAsFileTime((FILETIME *)&ftime);
- QueryPerformanceCounter(&counter);
- QueryPerformanceFrequency(&freq);
+ buffer = malloc(buffer_size);
- sysname_len = MAX_COMPUTERNAME_LENGTH + 1;
- GetComputerNameW(sysname, &sysname_len);
+ sysname_len = ARRAY_SIZE(sysname);
+ GetComputerNameW(sysname, &sysname_len);
- pdb = (PERF_DATA_BLOCK *)buf;
- ok(pdb->Signature[0] == 'P', "got '%c'\n", pdb->Signature[0]);
- ok(pdb->Signature[1] == 'E', "got '%c'\n", pdb->Signature[1]);
- ok(pdb->Signature[2] == 'R', "got '%c'\n", pdb->Signature[2]);
- ok(pdb->Signature[3] == 'F', "got '%c'\n", pdb->Signature[3]);
+ for (i = 0; i < ARRAY_SIZE(keys); ++i)
+ {
+ winetest_push_context("key %p", keys[i]);
- ok(pdb->LittleEndian == 1, "got %u\n", pdb->LittleEndian);
- ok(pdb->Version == 1, "got %u\n", pdb->Version);
- ok(pdb->Revision == 1, "got %u\n", pdb->Revision);
- len = (sizeof(*pdb) + pdb->SystemNameLength + 7) & ~7;
- ok(pdb->TotalByteLength == len, "got %u vs %u\n", pdb->TotalByteLength, len);
- ok(pdb->HeaderLength == pdb->TotalByteLength, "got %u\n", pdb->HeaderLength);
- ok(pdb->NumObjectTypes == 0, "got %u\n", pdb->NumObjectTypes);
-todo_wine
- ok(pdb->DefaultObject != 0, "got %u\n", pdb->DefaultObject);
- ok(pdb->SystemTime.wYear == st.wYear, "got %u\n", pdb->SystemTime.wYear);
- ok(pdb->SystemTime.wMonth == st.wMonth, "got %u\n", pdb->SystemTime.wMonth);
- ok(pdb->SystemTime.wDayOfWeek == st.wDayOfWeek, "got %u\n", pdb->SystemTime.wDayOfWeek);
- ok(pdb->SystemTime.wDay == st.wDay, "got %u\n", pdb->SystemTime.wDay);
- if (U(pdb->PerfTime).LowPart != 0x77777777) /* TestBot is broken */
- cmp_li(&pdb->PerfTime, &counter, freq.QuadPart);
- if (U(pdb->PerfFreq).LowPart != 0x77777777) /* TestBot is broken */
- cmp_li(&pdb->PerfFreq, &freq, 0);
- cmp_li(&pdb->PerfTime100nSec, &ftime, 200000); /* TestBot needs huge slack value */
- ok(pdb->SystemNameLength == (sysname_len + 1) * sizeof(WCHAR), "expected %u, got %u\n",
- (sysname_len + 1) * 2 /*sizeof(WCHAR)*/, pdb->SystemNameLength);
- ok(pdb->SystemNameOffset == sizeof(*pdb), "got %u\n", pdb->SystemNameOffset);
- ok(!lstrcmpW(sysname, (LPCWSTR)(pdb + 1)), "%s != %s\n",
- wine_dbgstr_w(sysname), wine_dbgstr_w((LPCWSTR)(pdb + 1)));
-
- len = pdb->TotalByteLength - (sizeof(*pdb) + pdb->SystemNameLength);
- if (len)
+ for (j = 0; j < ARRAY_SIZE(names); ++j)
{
- BYTE remainder[8], *p;
+ winetest_push_context("value %s", debugstr_a(names[j]));
- memset(remainder, 0x77, sizeof(remainder));
- p = buf + sizeof(*pdb) + pdb->SystemNameLength;
- ok(!memcmp(p, remainder, len), "remainder: %02x,%02x...\n", p[0], p[1]);
+ QueryPerformanceFrequency(&freq);
+
+ size = 0;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, NULL, NULL, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ ok(!size, "got size %u\n", size);
+
+ size = 10;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, NULL, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(size == 10, "got size %u\n", size);
+
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, NULL, NULL, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+
+ QueryPerformanceCounter(&perftime1);
+ NtQuerySystemTime(&systime1);
+
+ size = buffer_size;
+ type = 0xdeadbeef;
+ ret = RegQueryValueExA(keys[i], names[j], NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(type == REG_BINARY, "got type %u\n", type);
+ ok(size >= sizeof(PERF_DATA_BLOCK) && size < buffer_size, "got size %u\n", size);
+ }
+
+ if (ret)
+ {
+ winetest_pop_context();
+ continue;
+ }
+
+ QueryPerformanceCounter(&perftime2);
+ NtQuerySystemTime(&systime2);
+
+ data = buffer;
+ ok(!wcsncmp(data->Signature, L"PERF", 4), "got signature %s\n",
+ debugstr_wn(data->Signature, 4));
+ ok(data->LittleEndian == 1, "got endianness %u\n", data->LittleEndian);
+ ok(data->Version == 1, "got version %u\n", data->Version);
+ ok(data->Revision == 1, "got version %u\n", data->Revision);
+ ok(data->TotalByteLength == size, "expected size %u, got %u\n",
+ size, data->TotalByteLength);
+
+ expect_size = sizeof(PERF_DATA_BLOCK) + data->SystemNameLength;
+ expect_size = (expect_size + 7) & ~7;
+
+ ok(data->HeaderLength == expect_size, "expected header size %u, got %u\n",
+ expect_size, data->HeaderLength);
+ /* todo: test objects... */
+ todo_wine ok(data->DefaultObject == 238, "got default object %u\n", data->DefaultObject);
+
+ ok(data->PerfTime.QuadPart >= perftime1.QuadPart
+ && data->PerfTime.QuadPart <= perftime2.QuadPart,
+ "got times %I64u, %I64u, %I64u\n",
+ perftime1.QuadPart, data->PerfTime.QuadPart, perftime2.QuadPart);
+ ok(data->PerfFreq.QuadPart == freq.QuadPart, "expected frequency %I64u, got %I64u\n",
+ freq.QuadPart, data->PerfFreq.QuadPart);
+ ok(data->PerfTime100nSec.QuadPart >= systime1.QuadPart
+ && data->PerfTime100nSec.QuadPart <= systime2.QuadPart,
+ "got times %I64u, %I64u, %I64u\n",
+ systime1.QuadPart, data->PerfTime100nSec.QuadPart, systime2.QuadPart);
+ SystemTimeToFileTime(&data->SystemTime, &file_time.f);
+ ok(file_time.l >= systime1.QuadPart && file_time.l <= systime2.QuadPart,
+ "got times %I64u, %I64u, %I64u\n", perftime1.QuadPart, file_time.l, perftime2.QuadPart);
+
+ ok(data->SystemNameLength == (sysname_len + 1) * sizeof(WCHAR),
+ "expected name len %u, got %u\n",
+ (sysname_len + 1) * sizeof(WCHAR), data->SystemNameLength);
+ ok(data->SystemNameOffset == sizeof(PERF_DATA_BLOCK),
+ "got name offset %u\n", data->SystemNameOffset);
+ ok(!wcscmp(sysname, (const WCHAR *)(data + 1)), "expected name %s, got %s\n",
+ debugstr_w(sysname), debugstr_w((const WCHAR *)(data + 1)));
+
+ winetest_pop_context();
}
+
+ /* test the "Counter" value */
+
+ size = 0xdeadbeef;
+ ret = RegQueryValueExA(keys[i], "cOuNtEr", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0 && size < 0xdeadbeef, "got size %u\n", size);
+ }
+
+ type = 0xdeadbeef;
+ size = 0;
+ ret = RegQueryValueExA(keys[i], "cOuNtEr", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ todo_wine ok(size > 0, "got size %u\n", size);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "cOuNtEr", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_counter_values(buffer, keys[i]);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "cOuNtErwine", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_counter_values(buffer, keys[i]);
+
+ size = 0;
+ ret = RegQueryValueExW(keys[i], L"cOuNtEr", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0, "got size %u\n", size);
+ }
+
+ bufferW = malloc(size);
+
+ type = 0xdeadbeef;
+ ret = RegQueryValueExW(keys[i], L"cOuNtEr", NULL, &type, bufferW, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ }
+ if (type == REG_MULTI_SZ)
+ {
+ WideCharToMultiByte(CP_ACP, 0, bufferW, size / sizeof(WCHAR), buffer, buffer_size, NULL, NULL);
+ test_counter_values(buffer, keys[i]);
+ }
+
+ /* test the "Help" value */
+
+ size = 0xdeadbeef;
+ ret = RegQueryValueExA(keys[i], "hElP", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0 && size < 0xdeadbeef, "got size %u\n", size);
+ }
+
+ type = 0xdeadbeef;
+ size = 0;
+ ret = RegQueryValueExA(keys[i], "hElP", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ todo_wine ok(size > 0, "got size %u\n", size);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "hElP", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_help_values(buffer, keys[i]);
+
+ type = 0xdeadbeef;
+ size = buffer_size;
+ ret = RegQueryValueExA(keys[i], "hElPwine", NULL, &type, buffer, &size);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ if (type == REG_MULTI_SZ)
+ test_help_values(buffer, keys[i]);
+
+ size = 0;
+ ret = RegQueryValueExW(keys[i], L"hElP", NULL, NULL, NULL, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(size > 0, "got size %u\n", size);
+ }
+
+ bufferW = malloc(size);
+
+ type = 0xdeadbeef;
+ ret = RegQueryValueExW(keys[i], L"hElP", NULL, &type, bufferW, &size);
+ todo_wine
+ {
+ ok(!ret, "got %u\n", ret);
+ ok(type == REG_MULTI_SZ, "got type %u\n", type);
+ }
+ if (type == REG_MULTI_SZ)
+ {
+ WideCharToMultiByte(CP_ACP, 0, bufferW, size / sizeof(WCHAR), buffer, buffer_size, NULL, NULL);
+ test_help_values(buffer, keys[i]);
+ }
+
+ /* test other registry APIs */
+
+ ret = RegOpenKeyA(keys[i], NULL, &key);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegOpenKeyA(keys[i], "Global", &key);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegOpenKeyExA(keys[i], "Global", 0, KEY_READ, &key);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ size = 0;
+ ret = RegQueryValueA(keys[i], "Global", NULL, (LONG *)&size);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegSetValueA(keys[i], "Global", REG_SZ, "dummy", 5);
+ todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
+ ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegQueryInfoKeyA(keys[i], NULL, NULL, NULL, &key_count, NULL,
+ NULL, &value_count, NULL, NULL, NULL, NULL);
+ todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
+ ok(!ret, "got %u\n", ret);
+ todo_wine ok(!key_count, "got %u subkeys\n", key_count);
+ todo_wine ok(value_count == 2, "got %u values\n", value_count);
+
+ size = buffer_size;
+ ret = RegEnumValueA(keys[i], 0, buffer, &size, NULL, NULL, NULL, NULL);
+ todo_wine ok(ret == ERROR_MORE_DATA, "got %u\n", ret);
+ ok(size == buffer_size, "got size %u\n", size);
+
+ ret = RegCloseKey(keys[i]);
+ ok(!ret, "got %u\n", ret);
+
+ ret = RegCloseKey(keys[i]);
+ ok(!ret, "got %u\n", ret);
+
+ winetest_pop_context();
}
- dwret = RegOpenKeyA(HKEY_PERFORMANCE_DATA, NULL, &hkey);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
+ ret = RegSetValueExA(HKEY_PERFORMANCE_DATA, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
- dwret = RegOpenKeyA(HKEY_PERFORMANCE_DATA, "Global", &hkey);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
+ ret = RegSetValueExA(HKEY_PERFORMANCE_TEXT, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
- dwret = RegOpenKeyExA(HKEY_PERFORMANCE_DATA, "Global", 0, KEY_READ, &hkey);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- dwret = RegQueryValueA(HKEY_PERFORMANCE_DATA, "Global", NULL, (LONG *)&cbData);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- dwret = RegSetValueA(HKEY_PERFORMANCE_DATA, "Global", REG_SZ, "dummy", 4);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- dwret = RegSetValueExA(HKEY_PERFORMANCE_DATA, "Global", 0, REG_SZ, (const BYTE *)"dummy", 40);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- cbData = sizeof(buf);
- dwret = RegEnumKeyA(HKEY_PERFORMANCE_DATA, 0, (LPSTR)buf, cbData);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
-
- cbData = sizeof(buf);
- dwret = RegEnumValueA(HKEY_PERFORMANCE_DATA, 0, (LPSTR)buf, &cbData, NULL, NULL, NULL, NULL);
-todo_wine
- ok(dwret == ERROR_MORE_DATA, "got %u\n", dwret);
-todo_wine
- ok(cbData == sizeof(buf), "got %u\n", cbData);
-
- dwret = RegEnumValueA(HKEY_PERFORMANCE_DATA, 0, NULL, &cbData, NULL, NULL, NULL, NULL);
- ok(dwret == ERROR_INVALID_PARAMETER, "got %u\n", dwret);
+ ret = RegSetValueExA(HKEY_PERFORMANCE_NLSTEXT, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
if (pRegSetKeyValueW)
{
- dwret = pRegSetKeyValueW(HKEY_PERFORMANCE_DATA, NULL, L"Global", REG_SZ, L"dummy", 10);
-todo_wine
- ok(dwret == ERROR_INVALID_HANDLE, "got %u\n", dwret);
+ ret = pRegSetKeyValueW(HKEY_PERFORMANCE_DATA, NULL, L"Global", REG_SZ, L"dummy", 10);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = pRegSetKeyValueW(HKEY_PERFORMANCE_TEXT, NULL, L"Global", REG_SZ, L"dummy", 10);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
+
+ ret = pRegSetKeyValueW(HKEY_PERFORMANCE_NLSTEXT, NULL, L"Global", REG_SZ, L"dummy", 10);
+ todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
}
- dwret = RegCloseKey(HKEY_PERFORMANCE_DATA);
- ok(dwret == ERROR_SUCCESS, "got %u\n", dwret);
+ ret = RegEnumKeyA(HKEY_PERFORMANCE_DATA, 0, buffer, buffer_size);
+ todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+
+ ret = RegEnumKeyA(HKEY_PERFORMANCE_TEXT, 0, buffer, buffer_size);
+ todo_wine ok(ret == ERROR_NO_MORE_ITEMS, "got %u\n", ret);
+
+ ret = RegEnumKeyA(HKEY_PERFORMANCE_NLSTEXT, 0, buffer, buffer_size);
+ todo_wine ok(ret == ERROR_NO_MORE_ITEMS, "got %u\n", ret);
+
+ free(buffer);
}
static void test_perflib_key(void)
@@ -4348,7 +4506,7 @@ START_TEST(registry)
test_delete_key_value();
test_RegOpenCurrentUser();
test_RegNotifyChangeKeyValue();
- test_RegQueryValueExPerformanceData();
+ test_performance_keys();
test_RegLoadMUIString();
test_EnumDynamicTimeZoneInformation();
test_perflib_key();
--
2.30.2
2
9
[PATCH] quartz: Increment reference count for the advise thread to avoid crashes caused by DLL unloading.
by Hiroki Awata 11 Aug '21
by Hiroki Awata 11 Aug '21
11 Aug '21
Some games crash when the DLL is unloaded during SleepConditionVariableCS on SystemClockAdviseThread.
This is due to the fact that DllCanUnloadNow returns S_OK even though the advise thread is running.
Incrementing the reference count when creating the advise thread resolves it.
Signed-off-by: Hiroki Awata <castaneai(a)by.black>
---
dlls/quartz/systemclock.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/dlls/quartz/systemclock.c b/dlls/quartz/systemclock.c
index 73a923a7b99..7302de0e58f 100644
--- a/dlls/quartz/systemclock.c
+++ b/dlls/quartz/systemclock.c
@@ -104,6 +104,7 @@ static ULONG WINAPI system_clock_inner_Release(IUnknown *iface)
WakeConditionVariable(&clock->cv);
WaitForSingleObject(clock->thread, INFINITE);
CloseHandle(clock->thread);
+ InterlockedDecrement(&object_locks);
}
LIST_FOR_EACH_ENTRY_SAFE(sink, cursor, &clock->sinks, struct advise_sink, entry)
@@ -207,6 +208,8 @@ static HRESULT add_sink(struct system_clock *clock, DWORD_PTR handle,
if (!InterlockedCompareExchange(&clock->thread_created, TRUE, FALSE))
{
clock->thread = CreateThread(NULL, 0, SystemClockAdviseThread, clock, 0, NULL);
+ if (clock->thread)
+ InterlockedIncrement(&object_locks);
}
WakeConditionVariable(&clock->cv);
--
2.27.0
4
7
[PATCH v2] include: Remove interfaces already define in msxml6.idl
by Alistair Leslie-Hughes 10 Aug '21
by Alistair Leslie-Hughes 10 Aug '21
10 Aug '21
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msxml3/factory.c | 1 +
dlls/msxml3/tests/saxreader.c | 1 +
dlls/msxml3/tests/schema.c | 5 ++
dlls/msxml3/uuid.c | 11 ++++
include/msxml2.idl | 109 ----------------------------------
include/msxml6.idl | 24 ++++----
6 files changed, 30 insertions(+), 121 deletions(-)
diff --git a/dlls/msxml3/factory.c b/dlls/msxml3/factory.c
index 445cfbf730d..b8452ff4b4e 100644
--- a/dlls/msxml3/factory.c
+++ b/dlls/msxml3/factory.c
@@ -35,6 +35,7 @@
#include "ole2.h"
#include "msxml.h"
#include "msxml2.h"
+#include "msxml6.h"
#include "xmlparser.h"
/* undef the #define in msxml2 so that we can access the v.2 version
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index e401aafc87d..05e9d2c3468 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -29,6 +29,7 @@
#include "windows.h"
#include "ole2.h"
#include "msxml2.h"
+#include "msxml6.h"
#include "msxml2did.h"
#include "ocidl.h"
#include "dispex.h"
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c
index b66be76c159..cb95394aa39 100644
--- a/dlls/msxml3/tests/schema.c
+++ b/dlls/msxml3/tests/schema.c
@@ -32,6 +32,11 @@
#include "dispex.h"
#include "cguid.h"
+DEFINE_GUID(CLSID_MXXMLWriter60, 0x88d96a0f, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_SAXAttributes60, 0x88d96a0e, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+
#include "wine/test.h"
#define EXPECT_HR(hr,hr_exp) \
diff --git a/dlls/msxml3/uuid.c b/dlls/msxml3/uuid.c
index 4abbe5e4763..333d4f3d3c7 100644
--- a/dlls/msxml3/uuid.c
+++ b/dlls/msxml3/uuid.c
@@ -41,6 +41,17 @@
#include "initguid.h"
#include "msxml2.h"
+/* Cannot include msxml6 here since we will get a duplicate LIBID_MSXML2 error. */
+DEFINE_GUID(CLSID_FreeThreadedDOMDocument60, 0x88d96a06, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_MXNamespaceManager60, 0x88d96a11, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_MXXMLWriter60, 0x88d96a0f, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_SAXAttributes60, 0x88d96a0e, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_ServerXMLHTTP60, 0x88d96a0b, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_XMLHTTP60, 0x88d96a0a, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+DEFINE_GUID(CLSID_XSLTemplate60, 0x88d96a08, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);
+
/*
* Note that because of a #define in msxml2.h, we end up initializing
* CLSID_DOMDocument2 to be the v.3 version independent DOMDocument
diff --git a/include/msxml2.idl b/include/msxml2.idl
index 916e0e8ab3d..1d1ba7a5248 100644
--- a/include/msxml2.idl
+++ b/include/msxml2.idl
@@ -1612,15 +1612,6 @@ coclass FreeThreadedDOMDocument40
[default, source] dispinterface XMLDOMDocumentEvents;
}
-[
- uuid(88d96a06-f192-11d4-a65f-0040963251e5),
-]
-coclass FreeThreadedDOMDocument60
-{
- [default] interface IXMLDOMDocument3;
- [default, source] dispinterface XMLDOMDocumentEvents;
-}
-
[
helpstring("Free threaded XML DOM Document"),
progid("Msxml2.FreeThreadedDOMDocument"),
@@ -1662,14 +1653,6 @@ coclass XMLHTTP40
[default] interface IXMLHTTPRequest;
}
-[
- uuid(88d96a0a-f192-11d4-a65f-0040963251e5)
-]
-coclass XMLHTTP60
-{
- [default] interface IXMLHTTPRequest;
-}
-
[
helpstring("XML HTTP"),
progid("Msxml2.XMLHTTP"),
@@ -1702,14 +1685,6 @@ coclass ServerXMLHTTP40
[default] interface IServerXMLHTTPRequest2;
}
-[
- uuid(88d96a0b-f192-11d4-a65f-0040963251e5)
-]
-coclass ServerXMLHTTP60
-{
- [default] interface IServerXMLHTTPRequest2;
-}
-
[
helpstring("Server XML HTTP"),
progid("Msxml2.ServerXMLHTTP"),
@@ -1750,14 +1725,6 @@ coclass XMLSchemaCache40
[default] interface IXMLDOMSchemaCollection2;
}
-[
- uuid(88d96a07-f192-11d4-a65f-0040963251e5)
-]
-coclass XMLSchemaCache60
-{
- [default] interface IXMLDOMSchemaCollection2;
-}
-
[
helpstring("XML Schema Cache"),
progid("Msxml2.XMLSchemaCache"),
@@ -1798,14 +1765,6 @@ coclass XSLTemplate40
[default] interface IXSLTemplate;
}
-[
- uuid(88d96a08-f192-11d4-a65f-0040963251e5)
-]
-coclass XSLTemplate60
-{
- [default] interface IXSLTemplate;
-}
-
[
helpstring("XSL Template"),
progid("Msxml2.XSLTemplate"),
@@ -3297,15 +3256,6 @@ coclass SAXXMLReader40
interface ISAXXMLReader;
}
-[
- uuid(88d96a0c-f192-11d4-a65f-0040963251e5)
-]
-coclass SAXXMLReader60
-{
- [default] interface IVBSAXXMLReader;
- interface ISAXXMLReader;
-}
-
[
helpstring("SAX XML Reader"),
progid("Msxml2.SAXXMLReader"),
@@ -3380,26 +3330,6 @@ coclass MXHTMLWriter40
interface IVBSAXLexicalHandler;
}
-[
- uuid(88d96a10-f192-11d4-a65f-0040963251e5)
-]
-coclass MXHTMLWriter60
-{
- [default] interface IMXWriter;
-
- interface ISAXContentHandler;
- interface ISAXDeclHandler;
- interface ISAXDTDHandler;
- interface ISAXErrorHandler;
- interface ISAXLexicalHandler;
-
- interface IVBSAXContentHandler;
- interface IVBSAXDeclHandler;
- interface IVBSAXDTDHandler;
- interface IVBSAXErrorHandler;
- interface IVBSAXLexicalHandler;
-}
-
[
helpstring("MXXMLWriter 3.0"),
progid("Msxml2.MXXMLWriter.3.0"),
@@ -3444,26 +3374,6 @@ coclass MXXMLWriter40
interface IVBSAXLexicalHandler;
}
-[
- uuid(88d96a0f-f192-11d4-a65f-0040963251e5)
-]
-coclass MXXMLWriter60
-{
- [default] interface IMXWriter;
-
- interface ISAXContentHandler;
- interface ISAXDeclHandler;
- interface ISAXDTDHandler;
- interface ISAXErrorHandler;
- interface ISAXLexicalHandler;
-
- interface IVBSAXContentHandler;
- interface IVBSAXDeclHandler;
- interface IVBSAXDTDHandler;
- interface IVBSAXErrorHandler;
- interface IVBSAXLexicalHandler;
-}
-
[
helpstring("MXXMLWriter"),
progid("Msxml2.MXXMLWriter"),
@@ -3506,15 +3416,6 @@ coclass MXNamespaceManager40
interface IMXNamespaceManager;
}
-[
- uuid(88d96a11-f192-11d4-a65f-0040963251e5)
-]
-coclass MXNamespaceManager60
-{
- [default] interface IVBMXNamespaceManager;
- interface IMXNamespaceManager;
-}
-
[
helpstring("SAXAttributes 3.0"),
progid("Msxml2.SAXAttributes.3.0"),
@@ -3539,16 +3440,6 @@ coclass SAXAttributes40
interface ISAXAttributes;
}
-[
- uuid(88d96a0e-f192-11d4-a65f-0040963251e5)
-]
-coclass SAXAttributes60
-{
- [default] interface IMXAttributes;
- interface IVBSAXAttributes;
- interface ISAXAttributes;
-}
-
[
helpstring("SAXAttributes"),
progid("Msxml2.SAXAttributes"),
diff --git a/include/msxml6.idl b/include/msxml6.idl
index 4948de39f1f..e6a0a5feda5 100644
--- a/include/msxml6.idl
+++ b/include/msxml6.idl
@@ -3048,18 +3048,6 @@ coclass DOMDocument60
[default, source] dispinterface XMLDOMDocumentEvents;
}
-[
- helpstring("Free threaded XML DOM Document 6.0"),
- progid("Msxml2.FreeThreadedDOMDocument.6.0"),
- threading(both),
- uuid(88d96a06-f192-11d4-a65f-0040963251e5),
-]
-coclass FreeThreadedDOMDocument60
-{
- [default] interface IXMLDOMDocument3;
- [default, source] dispinterface XMLDOMDocumentEvents;
-}
-
[
helpstring("SAX XML Reader 6.0"),
progid("Msxml2.SAXXMLReader.6.0"),
@@ -3165,6 +3153,18 @@ coclass XSLTemplate60
[default] interface IXSLTemplate;
}
+[
+ helpstring("Free threaded XML DOM Document 6.0"),
+ progid("Msxml2.FreeThreadedDOMDocument.6.0"),
+ threading(both),
+ uuid(88d96a06-f192-11d4-a65f-0040963251e5),
+]
+coclass FreeThreadedDOMDocument60
+{
+ [default] interface IXMLDOMDocument3;
+ [default, source] dispinterface XMLDOMDocumentEvents;
+}
+
[
helpstring("XML HTTP 6.0"),
progid("Msxml2.XMLHTTP.6.0"),
--
2.30.2
3
3
Signed-off-by: David Curtiss <david.curtiss(a)ni.com>
---
dlls/kernel32/tests/locale.c | 94 +++++++++++++++++++++++++++++++++++-
dlls/kernelbase/locale.c | 44 +++++++++++++++--
2 files changed, 134 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 75c86bbaf21..7c5f00f91c7 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -87,6 +87,7 @@ static INT (WINAPI *pFindNLSStringEx)(LPCWSTR, DWORD, LPCWSTR, INT, LPCWSTR, INT
static LANGID (WINAPI *pSetThreadUILanguage)(LANGID);
static LANGID (WINAPI *pGetThreadUILanguage)(VOID);
static INT (WINAPI *pNormalizeString)(NORM_FORM, LPCWSTR, INT, LPWSTR, INT);
+static INT (WINAPI *pResolveLocaleName)(LPCWSTR, LPWSTR, INT);
static INT (WINAPI *pFindStringOrdinal)(DWORD, LPCWSTR lpStringSource, INT, LPCWSTR, INT, BOOL);
static BOOL (WINAPI *pGetNLSVersion)(NLS_FUNCTION,LCID,NLSVERSIONINFO*);
static BOOL (WINAPI *pGetNLSVersionEx)(NLS_FUNCTION,LPCWSTR,NLSVERSIONINFOEX*);
@@ -135,6 +136,7 @@ static void InitFunctionPointers(void)
X(SetThreadUILanguage);
X(GetThreadUILanguage);
X(NormalizeString);
+ X(ResolveLocaleName);
X(FindStringOrdinal);
X(GetNLSVersion);
X(GetNLSVersionEx);
@@ -1903,7 +1905,7 @@ static void test_CompareStringA(void)
ret = lstrcmpA(NULL, "");
ok (ret == -1 || broken(ret == -2) /* win9x */, "lstrcmpA(NULL, \"\") should return -1, got %d\n", ret);
-
+
if (0) { /* this requires collation table patch to make it MS compatible */
ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "'o", -1, "-o", -1 );
@@ -6522,6 +6524,95 @@ static void test_NormalizeString(void)
}
}
+static void test_ResolveLocaleName(void)
+{
+ INT ret;
+ WCHAR buffer[BUFFER_SIZE], input[BUFFER_SIZE], Expected[BUFFER_SIZE], Alternate[BUFFER_SIZE];
+ INT buffer_size = BUFFER_SIZE;
+
+ if (!pResolveLocaleName)
+ {
+ win_skip( "ResolveLocaleName not available\n" );
+ return;
+ }
+
+ /* already-valid cases */
+ STRINGSW("fr-FR","fr-FR");
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ STRINGSW("fr-BE","fr-BE");
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ /* just-resolve cases */
+ STRINGSW("fr","fr-FR");
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ /* truncate-and-resolve cases */
+ STRINGSW("fr-aaa-BE","fr-FR");
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ STRINGSW("fr-BE_aaa","fr-BE"); /* old Windows gives fr-FR; new gives fr-BE */
+ MultiByteToWideChar(CP_ACP,0,"fr-FR",-1,Alternate,ARRAY_SIZE(Alternate));
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW;
+ ok(wcsncmp(buffer, Expected, lstrlenW(Expected)) == 0
+ || wcsncmp(buffer, Alternate, lstrlenW(Alternate)) == 0,
+ "Bad conversion\n");
+
+ STRINGSW("fr-BE-x-y-z","fr-BE");
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ /* just-big-enough buffer size */
+ STRINGSW("fr","fr-FR");
+ buffer_size = lstrlenW(Expected) + 1;
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ buffer_size = BUFFER_SIZE; /* restore normal value */
+
+ /* unknown locales return empty string */
+ STRINGSW("xx-XX",""); /* unknown locale */
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ STRINGSW("xx",""); /* unknown locale, no hyphen */
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ STRINGSW("-en-US",""); /* string is empty after truncated */
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ EXPECT_LENW; EXPECT_EQW;
+
+ /* when no output buffer, returns required buffer size */
+ STRINGSW("en-US","en-US");
+ ret = pResolveLocaleName(input, NULL, buffer_size);
+ EXPECT_LENW;
+
+ STRINGSW("en-US-x-y-z","en-US");
+ ret = pResolveLocaleName(input, NULL, buffer_size);
+ EXPECT_LENW;
+
+ /* buffer-size error cases */
+ STRINGSW("fr","");
+ buffer_size = 5; /* too small to hold "fr-FR\0" */
+ ret = pResolveLocaleName(input, buffer, buffer_size);
+ ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER,
+ "Expected ret == 0 w/ error %d, got %d (%s), error %d\n",
+ ERROR_INSUFFICIENT_BUFFER, ret, wine_dbgstr_w(buffer), GetLastError());
+
+ /* null-input error cases */
+ STRINGSW("en-US","");
+ ret = pResolveLocaleName(NULL, buffer, buffer_size);
+ ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER,
+ "Expected ret == 0 w/ error %d, got %d (%s), error %d\n",
+ ERROR_INSUFFICIENT_BUFFER, ret, wine_dbgstr_w(buffer), GetLastError());
+}
+
static void test_SpecialCasing(void)
{
int ret, i;
@@ -7180,6 +7271,7 @@ START_TEST(locale)
test_FindStringOrdinal();
test_SetThreadUILanguage();
test_NormalizeString();
+ test_ResolveLocaleName();
test_SpecialCasing();
test_NLSVersion();
test_geo_name();
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index 89b35775053..3fe311b0728 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -5623,10 +5623,48 @@ INT WINAPI DECLSPEC_HOTPATCH NormalizeString(NORM_FORM form, const WCHAR *src, I
*/
INT WINAPI DECLSPEC_HOTPATCH ResolveLocaleName( LPCWSTR name, LPWSTR buffer, INT len )
{
- FIXME( "stub: %s, %p, %d\n", wine_dbgstr_w(name), buffer, len );
+ LCID lcid;
+ WCHAR local_buffer[LOCALE_NAME_MAX_LENGTH];
+ WCHAR *output_buffer = buffer ? buffer : local_buffer;
+ WCHAR *p = 0;
+ INT new_len;
- SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
- return 0;
+ if (!name)
+ {
+ SetLastError( ERROR_INSUFFICIENT_BUFFER );
+ return 0;
+ }
+
+ TRACE( "(%s, %p, %d)\n", debugstr_w(name), buffer, len );
+
+ for (;;)
+ {
+ lcid = LocaleNameToLCID( p ? local_buffer : name, 0 );
+ if (lcid) break;
+
+ if (!p) /* first loop iteration */
+ {
+ lstrcpynW( local_buffer, name, LOCALE_NAME_MAX_LENGTH );
+ local_buffer[LOCALE_NAME_MAX_LENGTH - 1] = L'\0';
+ p = local_buffer + lstrlenW( local_buffer );
+ }
+ if (p == local_buffer)
+ {
+ /* fail-safe in case LocaleNameToLCID doesn't recognize "" */
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return 0;
+ }
+
+ for (--p; p > local_buffer; --p)
+ {
+ if (*p == L'-' || *p == L'_') break;
+ }
+ *p = L'\0';
+ }
+ new_len = LCIDToLocaleName( lcid, output_buffer, len, 0 );
+
+ TRACE( "(%s, %p, %d) returning %d %s\n", debugstr_w(name), buffer, len, new_len, debugstr_w(output_buffer) );
+ return new_len;
}
--
2.32.0.windows.2
1
0
On some systems <sys/sysinfo.h> may be present while the sysinfo
function may not, or at least not as part of standard libraries,
so check whether the function is actually available before using
it.
This fixes builds on FreeBSD with the devel/libsysinfo present.
Signed-off-by: Gerald Pfeifer <gerald(a)pfeifer.com>
---
configure.ac | 1 +
dlls/ntdll/unix/virtual.c | 3 ++-
include/config.h.in | 3 +++
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 69e27147088..065b3f231bf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2205,6 +2205,7 @@ AC_CHECK_FUNCS(\
setprogname \
sigprocmask \
symlink \
+ sysinfo \
tcdrain \
thr_kill2
)
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index f055be94238..c47055fb657 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -2692,7 +2692,8 @@ ULONG_PTR get_system_affinity_mask(void)
*/
void virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info, BOOL wow64 )
{
-#if defined(HAVE_STRUCT_SYSINFO_TOTALRAM) && defined(HAVE_STRUCT_SYSINFO_MEM_UNIT)
+#if defined(HAVE_SYSINFO) \
+ && defined(HAVE_STRUCT_SYSINFO_TOTALRAM) && defined(HAVE_STRUCT_SYSINFO_MEM_UNIT)
struct sysinfo sinfo;
if (!sysinfo(&sinfo))
diff --git a/include/config.h.in b/include/config.h.in
index ad770281471..24f7b64ffd3 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -744,6 +744,9 @@
/* Define to 1 if you have the <syscall.h> header file. */
#undef HAVE_SYSCALL_H
+/* Define to 1 if you have the `sysinfo' function. */
+#undef HAVE_SYSINFO
+
/* Define to 1 if you have the
<SystemConfiguration/SCDynamicStoreCopyDHCPInfo.h> header file. */
#undef HAVE_SYSTEMCONFIGURATION_SCDYNAMICSTORECOPYDHCPINFO_H
--
2.31.1
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
v2: reuse existing buffer field for string pointer.
dlls/d3d10/effect.c | 22 ++++-
dlls/d3d10/tests/effect.c | 181 ++++++++++++++++----------------------
2 files changed, 97 insertions(+), 106 deletions(-)
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 86ef50aac01..e121ad9cac2 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -1330,12 +1330,28 @@ static HRESULT parse_fx10_variable_head(const char *data, size_t data_size,
static HRESULT parse_fx10_annotation(const char *data, size_t data_size,
const char **ptr, struct d3d10_effect_variable *a)
{
+ DWORD offset;
HRESULT hr;
if (FAILED(hr = parse_fx10_variable_head(data, data_size, ptr, a)))
return hr;
- skip_dword_unknown("annotation", ptr, 1);
+ read_dword(ptr, &offset);
+ TRACE("Annotation value is at offset %#x.\n", offset);
+
+ switch (a->type->basetype)
+ {
+ case D3D10_SVT_STRING:
+ if (!fx10_copy_string(data, data_size, offset, (char **)&a->u.buffer.local_buffer))
+ {
+ ERR("Failed to copy name.\n");
+ return E_OUTOFMEMORY;
+ }
+ break;
+
+ default:
+ FIXME("Unhandled object type %#x.\n", a->type->basetype);
+ }
/* mark the variable as annotation */
a->flag = D3D10_EFFECT_VARIABLE_ANNOTATION;
@@ -2826,6 +2842,10 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
heap_free(v->u.resource.srv);
break;
+ case D3D10_SVT_STRING:
+ heap_free(v->u.buffer.local_buffer);
+ break;
+
default:
break;
}
diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c
index fc0b8180b97..871bf78cc27 100644
--- a/dlls/d3d10/tests/effect.c
+++ b/dlls/d3d10/tests/effect.c
@@ -1161,7 +1161,7 @@ static void test_effect_variable_element(void)
* test_effect_variable_type_class
*/
#if 0
-cbuffer cb <String s = "STRING";>
+cbuffer cb <String s = "STRING"; String s2 = "STRING"; >
{
float f;
vector <int, 2> i;
@@ -1186,109 +1186,60 @@ GeometryShader gs[2];
PixelShader ps;
VertexShader vs[1];
#endif
-static DWORD fx_test_evtc[] = {
-0x43425844, 0xc04c50cb, 0x0afeb4ef, 0xbb93f346,
-0x97a29499, 0x00000001, 0x00000659, 0x00000001,
-0x00000024, 0x30315846, 0x0000062d, 0xfeff1001,
-0x00000001, 0x00000004, 0x00000011, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x000003d9,
-0x00000000, 0x00000008, 0x00000001, 0x00000001,
-0x00000001, 0x00000001, 0x00000001, 0x00000001,
-0x00000004, 0x00000000, 0x00000000, 0x53006263,
-0x6e697274, 0x00070067, 0x00020000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00010000,
-0x00730000, 0x49525453, 0x6600474e, 0x74616f6c,
-0x00003300, 0x00000100, 0x00000000, 0x00000400,
-0x00001000, 0x00000400, 0x00090900, 0x69006600,
-0x0032746e, 0x00000057, 0x00000001, 0x00000000,
-0x00000008, 0x00000010, 0x00000008, 0x00001112,
-0x69750069, 0x7832746e, 0x007a0033, 0x00010000,
-0x00000000, 0x00280000, 0x00300000, 0x00180000,
-0x5a1b0000, 0x00750000, 0x6c6f6f62, 0x00337832,
-0x000000a0, 0x00000001, 0x00000000, 0x0000001c,
-0x00000020, 0x00000018, 0x00001a23, 0x6c420062,
-0x53646e65, 0x65746174, 0x0000c600, 0x00000200,
-0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000200, 0x656c6200, 0x4400646e, 0x68747065,
-0x6e657453, 0x536c6963, 0x65746174, 0x0000f300,
-0x00000200, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000300, 0x70656400, 0x74736874,
-0x69636e65, 0x6152006c, 0x72657473, 0x72657a69,
-0x74617453, 0x012e0065, 0x00020000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00040000,
-0x61720000, 0x53007473, 0x6c706d61, 0x74537265,
-0x00657461, 0x0000015f, 0x00000002, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000015,
-0x006d6173, 0x646e6552, 0x61547265, 0x74656772,
-0x77656956, 0x00018c00, 0x00000200, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00001300,
-0x76747200, 0x70654400, 0x74536874, 0x69636e65,
-0x6569566c, 0x01bd0077, 0x00020000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00140000,
-0x73640000, 0x65540076, 0x72757478, 0x00443165,
-0x000001ee, 0x00000002, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x0000000a, 0x54003174,
-0x75747865, 0x44316572, 0x61727241, 0x02170079,
-0x00020000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x000b0000, 0x31740000, 0x65540061,
-0x72757478, 0x00443265, 0x00000246, 0x00000002,
-0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x0000000c, 0x54003274, 0x75747865, 0x44326572,
-0x6f00534d, 0x02000002, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x0e000000, 0x74000000,
-0x736d6432, 0x78655400, 0x65727574, 0x72414432,
-0x00796172, 0x0000029d, 0x00000002, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x0000000d,
-0x00613274, 0x74786554, 0x32657275, 0x41534d44,
-0x79617272, 0x0002cc00, 0x00000200, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000f00,
-0x64327400, 0x0061736d, 0x74786554, 0x33657275,
-0x03000044, 0x00020000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00100000, 0x33740000,
-0x78655400, 0x65727574, 0x65627543, 0x00032900,
-0x00000200, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00001100, 0x00717400, 0x6d6f6547,
-0x79727465, 0x64616853, 0x54007265, 0x02000003,
-0x02000000, 0x00000000, 0x00000000, 0x00000000,
-0x07000000, 0x67000000, 0x69500073, 0x536c6578,
-0x65646168, 0x03820072, 0x00020000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00050000,
-0x73700000, 0x72655600, 0x53786574, 0x65646168,
-0x03ad0072, 0x00020000, 0x00010000, 0x00000000,
-0x00000000, 0x00000000, 0x00060000, 0x73760000,
-0x00000400, 0x00006000, 0x00000000, 0x00000400,
-0xffffff00, 0x000001ff, 0x00002a00, 0x00000e00,
-0x00002c00, 0x00005500, 0x00003900, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00007800, 0x00005c00, 0x00000000, 0x00000400,
-0x00000000, 0x00000000, 0x00000000, 0x00009e00,
-0x00008200, 0x00000000, 0x00001000, 0x00000000,
-0x00000000, 0x00000000, 0x0000c400, 0x0000a800,
-0x00000000, 0x00004000, 0x00000000, 0x00000000,
-0x00000000, 0x0000ed00, 0x0000d100, 0x00000000,
-0xffffff00, 0x000000ff, 0x00000000, 0x00012100,
-0x00010500, 0x00000000, 0xffffff00, 0x000000ff,
-0x00000000, 0x00015a00, 0x00013e00, 0x00000000,
-0xffffff00, 0x000000ff, 0x00000000, 0x00018800,
-0x00016c00, 0x00000000, 0xffffff00, 0x000000ff,
-0x00000000, 0x0001b900, 0x00019d00, 0x00000000,
-0xffffff00, 0x000000ff, 0x0001ea00, 0x0001ce00,
-0x00000000, 0xffffff00, 0x000000ff, 0x00021400,
-0x0001f800, 0x00000000, 0xffffff00, 0x000000ff,
-0x00024200, 0x00022600, 0x00000000, 0xffffff00,
-0x000000ff, 0x00026c00, 0x00025000, 0x00000000,
-0xffffff00, 0x000000ff, 0x00029700, 0x00027b00,
-0x00000000, 0xffffff00, 0x000000ff, 0x0002c800,
-0x0002ac00, 0x00000000, 0xffffff00, 0x000000ff,
-0x0002f900, 0x0002dd00, 0x00000000, 0xffffff00,
-0x000000ff, 0x00032600, 0x00030a00, 0x00000000,
-0xffffff00, 0x000000ff, 0x00035100, 0x00033500,
-0x00000000, 0xffffff00, 0x000000ff, 0x00037f00,
-0x00036300, 0x00000000, 0xffffff00, 0x000000ff,
-0x00000000, 0x00000000, 0x0003aa00, 0x00038e00,
-0x00000000, 0xffffff00, 0x000000ff, 0x00000000,
-0x0003d600, 0x0003ba00, 0x00000000, 0xffffff00,
-0x000000ff, 0x00000000, 0x00000000,
+static DWORD fx_test_evtc[] =
+{
+0x43425844, 0x16ff7a62, 0x6eb690dc, 0x60dd5ba4, 0x903b0ce7, 0x00000001, 0x00000668, 0x00000001,
+0x00000024, 0x30315846, 0x0000063c, 0xfeff1001, 0x00000001, 0x00000004, 0x00000011, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x000003dc, 0x00000000, 0x00000008, 0x00000001, 0x00000001,
+0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000004, 0x00000000, 0x00000000, 0x53006263,
+0x6e697274, 0x00070067, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+0x00730000, 0x49525453, 0x7300474e, 0x6c660032, 0x0074616f, 0x00000036, 0x00000001, 0x00000000,
+0x00000004, 0x00000010, 0x00000004, 0x00000909, 0x6e690066, 0x5a003274, 0x01000000, 0x00000000,
+0x08000000, 0x10000000, 0x08000000, 0x12000000, 0x69000011, 0x6e697500, 0x33783274, 0x00007d00,
+0x00000100, 0x00000000, 0x00002800, 0x00003000, 0x00001800, 0x005a1b00, 0x62007500, 0x326c6f6f,
+0xa3003378, 0x01000000, 0x00000000, 0x1c000000, 0x20000000, 0x18000000, 0x23000000, 0x6200001a,
+0x656c4200, 0x7453646e, 0x00657461, 0x000000c9, 0x00000002, 0x00000000, 0x00000000, 0x00000000,
+0x00000000, 0x00000002, 0x6e656c62, 0x65440064, 0x53687470, 0x636e6574, 0x74536c69, 0x00657461,
+0x000000f6, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x74706564,
+0x65747368, 0x6c69636e, 0x73615200, 0x69726574, 0x5372657a, 0x65746174, 0x00013100, 0x00000200,
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x73617200, 0x61530074, 0x656c706d,
+0x61745372, 0x62006574, 0x02000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x15000000,
+0x73000000, 0x52006d61, 0x65646e65, 0x72615472, 0x56746567, 0x00776569, 0x0000018f, 0x00000002,
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000013, 0x00767472, 0x74706544, 0x65745368,
+0x6c69636e, 0x77656956, 0x0001c000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x00001400, 0x76736400, 0x78655400, 0x65727574, 0xf1004431, 0x02000001, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x0a000000, 0x74000000, 0x65540031, 0x72757478, 0x41443165, 0x79617272,
+0x00021a00, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000b00, 0x61317400,
+0x78655400, 0x65727574, 0x49004432, 0x02000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x0c000000, 0x74000000, 0x65540032, 0x72757478, 0x4d443265, 0x02720053, 0x00020000, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x000e0000, 0x32740000, 0x00736d64, 0x74786554, 0x32657275,
+0x72724144, 0xa0007961, 0x02000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0d000000,
+0x74000000, 0x54006132, 0x75747865, 0x44326572, 0x7241534d, 0x00796172, 0x000002cf, 0x00000002,
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000f, 0x6d643274, 0x54006173, 0x75747865,
+0x44336572, 0x00030300, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001000,
+0x00337400, 0x74786554, 0x43657275, 0x00656275, 0x0000032c, 0x00000002, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x00000011, 0x47007174, 0x656d6f65, 0x53797274, 0x65646168, 0x03570072,
+0x00020000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00070000, 0x73670000, 0x78695000,
+0x68536c65, 0x72656461, 0x00038500, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x00000500, 0x00737000, 0x74726556, 0x68537865, 0x72656461, 0x0003b000, 0x00000200, 0x00000100,
+0x00000000, 0x00000000, 0x00000000, 0x00000600, 0x00737600, 0x00000004, 0x00000060, 0x00000000,
+0x00000004, 0xffffffff, 0x00000002, 0x0000002a, 0x0000000e, 0x0000002c, 0x00000033, 0x0000000e,
+0x0000002c, 0x00000058, 0x0000003c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x0000007b, 0x0000005f, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x000000a1,
+0x00000085, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x000000c7, 0x000000ab,
+0x00000000, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x000000f0, 0x000000d4, 0x00000000,
+0xffffffff, 0x00000000, 0x00000000, 0x00000124, 0x00000108, 0x00000000, 0xffffffff, 0x00000000,
+0x00000000, 0x0000015d, 0x00000141, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x0000018b,
+0x0000016f, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x000001bc, 0x000001a0, 0x00000000,
+0xffffffff, 0x00000000, 0x000001ed, 0x000001d1, 0x00000000, 0xffffffff, 0x00000000, 0x00000217,
+0x000001fb, 0x00000000, 0xffffffff, 0x00000000, 0x00000245, 0x00000229, 0x00000000, 0xffffffff,
+0x00000000, 0x0000026f, 0x00000253, 0x00000000, 0xffffffff, 0x00000000, 0x0000029a, 0x0000027e,
+0x00000000, 0xffffffff, 0x00000000, 0x000002cb, 0x000002af, 0x00000000, 0xffffffff, 0x00000000,
+0x000002fc, 0x000002e0, 0x00000000, 0xffffffff, 0x00000000, 0x00000329, 0x0000030d, 0x00000000,
+0xffffffff, 0x00000000, 0x00000354, 0x00000338, 0x00000000, 0xffffffff, 0x00000000, 0x00000382,
+0x00000366, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x000003ad, 0x00000391,
+0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x000003d9, 0x000003bd, 0x00000000, 0xffffffff,
+0x00000000, 0x00000000,
};
static BOOL is_valid_check(BOOL a, BOOL b)
@@ -1382,6 +1333,7 @@ static void check_as(ID3D10EffectVariable *variable)
static void test_effect_variable_type_class(void)
{
+ ID3D10EffectStringVariable *string_var;
ID3D10Effect *effect;
ID3D10EffectConstantBuffer *constantbuffer, *null_buffer, *parent;
ID3D10EffectVariable *variable;
@@ -1392,6 +1344,7 @@ static void test_effect_variable_type_class(void)
ULONG refcount;
HRESULT hr;
unsigned int variable_nr = 0;
+ const char *str1, *str2;
if (!(device = create_device()))
{
@@ -1413,7 +1366,7 @@ static void test_effect_variable_type_class(void)
ok(strcmp(vd.Name, "cb") == 0, "Name is \"%s\", expected \"cb\"\n", vd.Name);
ok(vd.Semantic == NULL, "Semantic is \"%s\", expected NULL\n", vd.Semantic);
ok(vd.Flags == 0, "Type is %u, expected 0\n", vd.Flags);
- ok(vd.Annotations == 1, "Elements is %u, expected 1\n", vd.Annotations);
+ ok(vd.Annotations == 2, "Elements is %u, expected 1\n", vd.Annotations);
ok(vd.BufferOffset == 0, "Members is %u, expected 0\n", vd.BufferOffset);
ok(vd.ExplicitBindPoint == 0, "ExplicitBindPoint is %u, expected 0\n", vd.ExplicitBindPoint);
@@ -1469,6 +1422,24 @@ static void test_effect_variable_type_class(void)
ok(td.UnpackedSize == 0x0, "UnpackedSize is %#x, expected 0x0\n", td.UnpackedSize);
ok(td.Stride == 0x0, "Stride is %#x, expected 0x0\n", td.Stride);
+ string_var = variable->lpVtbl->AsString(variable);
+ hr = string_var->lpVtbl->GetString(string_var, &str1);
+todo_wine
+ ok(SUCCEEDED(hr), "GetString failed %#x.\n", hr);
+ if (SUCCEEDED(hr))
+ ok(!strcmp(str1, "STRING"), "Unexpected value %s.\n", str1);
+
+ variable = constantbuffer->lpVtbl->GetAnnotationByIndex(constantbuffer, 1);
+ string_var = variable->lpVtbl->AsString(variable);
+ hr = string_var->lpVtbl->GetString(string_var, &str2);
+todo_wine
+ ok(SUCCEEDED(hr), "GetString failed %#x.\n", hr);
+ if (SUCCEEDED(hr))
+ {
+ ok(str2 != str1, "Unexpected string pointer.\n");
+ ok(!strcmp(str2, "STRING"), "Unexpected value %s.\n", str1);
+ }
+
/* check float f */
variable = constantbuffer->lpVtbl->GetMemberByIndex(constantbuffer, variable_nr++);
hr = variable->lpVtbl->GetDesc(variable, &vd);
--
2.30.2
3
4
Signed-off-by: Georg Lehmann <dadschoorse(a)gmail.com>
---
dlls/winevulkan/make_vulkan | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index 5e683d42de7..55b5b71691e 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -64,7 +64,7 @@ from enum import Enum
LOGGER = logging.Logger("vulkan")
LOGGER.addHandler(logging.StreamHandler())
-VK_XML_VERSION = "1.2.185"
+VK_XML_VERSION = "1.2.188"
WINE_VK_VERSION = (1, 2)
# Filenames to create.
--
2.32.0
1
0
Instead of waiting for it.
Otherwise the module may be unloaded on process shutdown while the
thread is still busy processing events, causing possible invalid memory
access (for instance when accessing the static pnp_devset device list).
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
I'm not sure what's best here, the crash is pretty hard to reproduce,
and most likely to happen with a device that sends a lot of events
(the DualShock 4 for instance reports a constant stream of data).
It's possible to reproduce it more easily by adding Sleep calls in the
event processing functions.
We could wait a bit before terminating the thread but as we are shutting
down the process I don't know if it's even worth it.
dlls/winebus.sys/bus_sdl.c | 31 ++++++-------------------------
1 file changed, 6 insertions(+), 25 deletions(-)
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index f3fcc20893e..6133c8eb147 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -67,7 +67,6 @@ static DWORD map_controllers = 0;
static void *sdl_handle = NULL;
static HANDLE deviceloop_handle;
-static UINT quit_event = -1;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL
MAKE_FUNCPTR(SDL_GetError);
@@ -1072,39 +1071,21 @@ static DWORD CALLBACK deviceloop_thread(void *args)
SetEvent(init_done);
- while (1) {
- while (pSDL_WaitEvent(&event) != 0) {
- if (event.type == quit_event) {
- TRACE("Device thread exiting\n");
- return 0;
- }
- process_device_event(&event);
- }
- }
+ while (pSDL_WaitEvent(&event) != 0)
+ process_device_event(&event);
+
+ ERR("SDL_WaitEvent failed: %s\n", pSDL_GetError());
+ return -1;
}
void sdl_driver_unload( void )
{
- SDL_Event event;
-
TRACE("Unload Driver\n");
if (!deviceloop_handle)
return;
- quit_event = pSDL_RegisterEvents(1);
- if (quit_event == -1) {
- ERR("error registering quit event\n");
- return;
- }
-
- event.type = quit_event;
- if (pSDL_PushEvent(&event) != 1) {
- ERR("error pushing quit event\n");
- return;
- }
-
- WaitForSingleObject(deviceloop_handle, INFINITE);
+ TerminateThread(deviceloop_handle, 0);
CloseHandle(deviceloop_handle);
dlclose(sdl_handle);
}
--
2.32.0
2
4