Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/advapi32/tests/perf.c | 10 +++++----- dlls/kernelbase/main.c | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/dlls/advapi32/tests/perf.c b/dlls/advapi32/tests/perf.c index 9236ea8bb75..a0862e65ea4 100644 --- a/dlls/advapi32/tests/perf.c +++ b/dlls/advapi32/tests/perf.c @@ -155,16 +155,16 @@ void test_provider_init(void) ok(size == instance->dwSize, "Got unexpected size %u, instance->dwSize %u.\n", size, instance->dwSize);
ret = PerfSetCounterRefValue(prov, instance, 1, &counter1); - todo_wine ok(!ret, "Got unexpected ret %u.\n", ret); + ok(!ret, "Got unexpected ret %u.\n", ret); ret = PerfSetCounterRefValue(prov, instance, 2, &counter2); - todo_wine ok(!ret, "Got unexpected ret %u.\n", ret); + ok(!ret, "Got unexpected ret %u.\n", ret);
ret = PerfSetCounterRefValue(prov, instance, 0, &counter2); - todo_wine ok(ret == ERROR_NOT_FOUND, "Got unexpected ret %u.\n", ret); + ok(ret == ERROR_NOT_FOUND, "Got unexpected ret %u.\n", ret);
- todo_wine ok(*(void **)(instance + 1) == &counter1, "Got unexpected counter value %p.\n", + ok(*(void **)(instance + 1) == &counter1, "Got unexpected counter value %p.\n", *(void **)(instance + 1)); - todo_wine ok(*(void **)((BYTE *)instance + sizeof(*instance) + sizeof(UINT64)) == &counter2, + ok(*(void **)((BYTE *)instance + sizeof(*instance) + sizeof(UINT64)) == &counter2, "Got unexpected counter value %p.\n", *(void **)(instance + 1));
ret = PerfDeleteInstance(prov, instance); diff --git a/dlls/kernelbase/main.c b/dlls/kernelbase/main.c index d90bedcc637..775c1c2ac07 100644 --- a/dlls/kernelbase/main.c +++ b/dlls/kernelbase/main.c @@ -312,11 +312,29 @@ ULONG WINAPI PerfSetCounterSetInfo( HANDLE handle, PERF_COUNTERSET_INFO *templat /*********************************************************************** * PerfSetCounterRefValue (KERNELBASE.@) */ -ULONG WINAPI PerfSetCounterRefValue(HANDLE provider, PPERF_COUNTERSET_INSTANCE instance, +ULONG WINAPI PerfSetCounterRefValue(HANDLE provider, PERF_COUNTERSET_INSTANCE *instance, ULONG counterid, void *address) { - FIXME("%p %p %u %p: stub\n", provider, instance, counterid, address); - return ERROR_CALL_NOT_IMPLEMENTED; + struct perf_provider *prov = perf_provider_from_handle( provider ); + struct counterset_template *template; + struct counterset_instance *inst; + unsigned int i; + + FIXME( "provider %p, instance %p, counterid %u, address %p semi-stub.\n", + provider, instance, counterid, address ); + + if (!prov || !instance || !address) return ERROR_INVALID_PARAMETER; + + inst = CONTAINING_RECORD(instance, struct counterset_instance, instance); + template = inst->template; + + for (i = 0; i < template->counterset.NumCounters; ++i) + if (template->counter[i].CounterId == counterid) break; + + if (i == template->counterset.NumCounters) return ERROR_NOT_FOUND; + *(void **)((BYTE *)&inst->instance + sizeof(PERF_COUNTERSET_INSTANCE) + template->counter[i].Offset) = address; + + return STATUS_SUCCESS; }
/***********************************************************************