Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/advapi32/tests/registry.c | 18 ++++++++++++------ dlls/kernelbase/registry.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index e1ad31f70fd..eb5ce542af5 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -3784,7 +3784,7 @@ static void test_performance_keys(void)
size = 0xdeadbeef; ret = RegQueryValueExA(keys[i], "cOuNtEr", NULL, NULL, NULL, &size); - todo_wine + todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA) { ok(!ret, "got %u\n", ret); ok(size > 0 && size < 0xdeadbeef, "got size %u\n", size); @@ -3794,15 +3794,19 @@ static void test_performance_keys(void) 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); + 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); + ok(type == REG_MULTI_SZ, "got type %u\n", type); + } if (type == REG_MULTI_SZ) test_counter_values(buffer, keys[i]);
@@ -3810,14 +3814,16 @@ static void test_performance_keys(void) 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); + 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 + todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA) { ok(!ret, "got %u\n", ret); ok(size > 0, "got size %u\n", size); @@ -3827,7 +3833,7 @@ static void test_performance_keys(void)
type = 0xdeadbeef; ret = RegQueryValueExW(keys[i], L"cOuNtEr", NULL, &type, bufferW, &size); - todo_wine + todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA) { ok(!ret, "got %u\n", ret); ok(type == REG_MULTI_SZ, "got type %u\n", type); diff --git a/dlls/kernelbase/registry.c b/dlls/kernelbase/registry.c index 3a551ecbec5..31698cb0948 100644 --- a/dlls/kernelbase/registry.c +++ b/dlls/kernelbase/registry.c @@ -1204,6 +1204,27 @@ LONG WINAPI RegSetKeyValueA( HKEY hkey, LPCSTR subkey, LPCSTR name, DWORD type, return ret; }
+/* FIXME: we should read data from system32/perf009c.dat (or perf###c depending + * on locale) instead */ +static DWORD query_perf_names( DWORD *type, void *data, DWORD *ret_size, BOOL unicode ) +{ + static const WCHAR names[] = L"1\0" "1847\0" "1846\0End Marker\0"; + DWORD size = *ret_size; + + if (type) *type = REG_MULTI_SZ; + *ret_size = sizeof(names); + if (!unicode) *ret_size /= sizeof(WCHAR); + + if (!data) return ERROR_SUCCESS; + if (size < *ret_size) return ERROR_MORE_DATA; + + if (unicode) + memcpy( data, names, sizeof(names) ); + else + RtlUnicodeToMultiByteN( data, size, NULL, names, sizeof(names) ); + return ERROR_SUCCESS; +} + struct perf_provider { HMODULE perflib; @@ -1338,7 +1359,7 @@ static DWORD collect_data(struct perf_provider *provider, const WCHAR *query, vo
#define MAX_SERVICE_NAME 260
-static DWORD query_perf_data(const WCHAR *query, DWORD *type, void *data, DWORD *ret_size) +static DWORD query_perf_data( const WCHAR *query, DWORD *type, void *data, DWORD *ret_size, BOOL unicode ) { DWORD err, i, data_size; HKEY root; @@ -1347,6 +1368,9 @@ static DWORD query_perf_data(const WCHAR *query, DWORD *type, void *data, DWORD if (!ret_size) return ERROR_INVALID_PARAMETER;
+ if (!wcsnicmp( query, L"counter", 7 )) + return query_perf_names( type, data, ret_size, unicode ); + data_size = *ret_size; *ret_size = 0;
@@ -1480,7 +1504,7 @@ LSTATUS WINAPI DECLSPEC_HOTPATCH RegQueryValueExW( HKEY hkey, LPCWSTR name, LPDW if ((data && !count) || reserved) return ERROR_INVALID_PARAMETER;
if (hkey == HKEY_PERFORMANCE_DATA) - return query_perf_data(name, type, data, count); + return query_perf_data( name, type, data, count, TRUE );
if (!(hkey = get_special_root_hkey( hkey, 0 ))) return ERROR_INVALID_HANDLE;
@@ -1587,7 +1611,7 @@ LSTATUS WINAPI DECLSPEC_HOTPATCH RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWO
if (hkey == HKEY_PERFORMANCE_DATA) { - DWORD ret = query_perf_data( nameW.Buffer, type, data, count ); + DWORD ret = query_perf_data( nameW.Buffer, type, data, count, FALSE ); RtlFreeUnicodeString( &nameW ); return ret; }