Hans Leidekker : pdh: Implement and test PdhGetCounterInfo{A,
W} and PdhGetCounterTimeBase.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jul 10 08:02:34 CDT 2007
Module: wine
Branch: master
Commit: 3ea31cb20be7cfbe53317699b27ed1904f33c74e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ea31cb20be7cfbe53317699b27ed1904f33c74e
Author: Hans Leidekker <hans at it.vu.nl>
Date: Mon Jul 9 20:55:33 2007 +0200
pdh: Implement and test PdhGetCounterInfo{A, W} and PdhGetCounterTimeBase.
---
dlls/pdh/pdh.spec | 6 ++--
dlls/pdh/pdh_main.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/pdh/tests/pdh.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 167 insertions(+), 3 deletions(-)
diff --git a/dlls/pdh/pdh.spec b/dlls/pdh/pdh.spec
index 7ed4207..2f575f8 100644
--- a/dlls/pdh/pdh.spec
+++ b/dlls/pdh/pdh.spec
@@ -40,9 +40,9 @@
@ stub PdhExpandWildCardPathHW
@ stub PdhExpandWildCardPathW
@ stub PdhFormatFromRawValue
-@ stub PdhGetCounterInfoA
-@ stub PdhGetCounterInfoW
-@ stub PdhGetCounterTimeBase
+@ stdcall PdhGetCounterInfoA(ptr long ptr ptr)
+@ stdcall PdhGetCounterInfoW(ptr long ptr ptr)
+@ stdcall PdhGetCounterTimeBase(ptr ptr)
@ stub PdhGetDataSourceTimeRangeA
@ stub PdhGetDataSourceTimeRangeH
@ stub PdhGetDataSourceTimeRangeW
diff --git a/dlls/pdh/pdh_main.c b/dlls/pdh/pdh_main.c
index a04d1eb..62c99f0 100644
--- a/dlls/pdh/pdh_main.c
+++ b/dlls/pdh/pdh_main.c
@@ -2,6 +2,7 @@
* Performance Data Helper (pdh.dll)
*
* Copyright 2007 Andrey Turkin
+ * Copyright 2007 Hans Leidekker
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -284,6 +285,84 @@ PDH_STATUS WINAPI PdhCollectQueryData( PDH_HQUERY handle )
}
/***********************************************************************
+ * PdhGetCounterInfoA (PDH.@)
+ */
+PDH_STATUS WINAPI PdhGetCounterInfoA( PDH_HCOUNTER handle, BOOLEAN text, LPDWORD size, PPDH_COUNTER_INFO_A info )
+{
+ struct counter *counter = handle;
+
+ TRACE("%p %d %p %p\n", handle, text, size, info);
+
+ if (!counter) return PDH_INVALID_HANDLE;
+ if (!size) return PDH_INVALID_ARGUMENT;
+
+ if (*size < sizeof(PDH_COUNTER_INFO_A))
+ {
+ *size = sizeof(PDH_COUNTER_INFO_A);
+ return PDH_MORE_DATA;
+ }
+
+ memset( info, 0, sizeof(PDH_COUNTER_INFO_A) );
+
+ info->dwType = counter->type;
+ info->CStatus = counter->status;
+ info->lScale = counter->scale;
+ info->lDefaultScale = counter->defaultscale;
+ info->dwUserData = counter->user;
+ info->dwQueryUserData = counter->queryuser;
+
+ *size = sizeof(PDH_COUNTER_INFO_A);
+ return ERROR_SUCCESS;
+}
+
+/***********************************************************************
+ * PdhGetCounterInfoW (PDH.@)
+ */
+PDH_STATUS WINAPI PdhGetCounterInfoW( PDH_HCOUNTER handle, BOOLEAN text, LPDWORD size, PPDH_COUNTER_INFO_W info )
+{
+ struct counter *counter = handle;
+
+ TRACE("%p %d %p %p\n", handle, text, size, info);
+
+ if (!size) return PDH_INVALID_ARGUMENT;
+ if (!counter) return PDH_INVALID_HANDLE;
+
+ if (*size < sizeof(PDH_COUNTER_INFO_W))
+ {
+ *size = sizeof(PDH_COUNTER_INFO_W);
+ return PDH_MORE_DATA;
+ }
+
+ memset( info, 0, sizeof(PDH_COUNTER_INFO_W) );
+
+ info->dwType = counter->type;
+ info->CStatus = counter->status;
+ info->lScale = counter->scale;
+ info->lDefaultScale = counter->defaultscale;
+ info->dwUserData = counter->user;
+ info->dwQueryUserData = counter->queryuser;
+
+ *size = sizeof(PDH_COUNTER_INFO_A);
+ return ERROR_SUCCESS;
+}
+
+/***********************************************************************
+ * PdhGetCounterTimeBase (PDH.@)
+ */
+PDH_STATUS WINAPI PdhGetCounterTimeBase( PDH_HCOUNTER handle, LONGLONG *base )
+{
+ struct counter *counter = handle;
+
+ TRACE("%p %p\n", handle, base);
+
+ if (!base) return PDH_INVALID_ARGUMENT;
+ if (!counter) return PDH_INVALID_HANDLE;
+
+ *base = counter->base;
+ return ERROR_SUCCESS;
+}
+
+/***********************************************************************
* PdhGetFormattedCounterValue (PDH.@)
*/
PDH_STATUS WINAPI PdhGetFormattedCounterValue( PDH_HCOUNTER handle, DWORD format,
diff --git a/dlls/pdh/tests/pdh.c b/dlls/pdh/tests/pdh.c
index 6ddb097..12770ed 100644
--- a/dlls/pdh/tests/pdh.c
+++ b/dlls/pdh/tests/pdh.c
@@ -213,6 +213,89 @@ static void test_PdhSetCounterScaleFactor( void )
ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
}
+static void test_PdhGetCounterTimeBase( void )
+{
+ PDH_STATUS ret;
+ PDH_HQUERY query;
+ PDH_HCOUNTER counter;
+ LONGLONG base;
+
+ ret = PdhOpenQueryA( NULL, 0, &query );
+ ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
+
+ ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
+ ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterTimeBase( NULL, NULL );
+ ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterTimeBase( NULL, &base );
+ ok(ret == PDH_INVALID_HANDLE, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterTimeBase( counter, NULL );
+ ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterTimeBase( counter, &base );
+ ok(ret == ERROR_SUCCESS, "PdhGetCounterTimeBase failed 0x%08x\n", ret);
+
+ ret = PdhCloseQuery( query );
+ ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
+}
+
+static void test_PdhGetCounterInfo( void )
+{
+ PDH_STATUS ret;
+ PDH_HQUERY query;
+ PDH_HCOUNTER counter;
+ PDH_COUNTER_INFO_A info;
+ DWORD size;
+
+ ret = PdhOpenQueryA( NULL, 0, &query );
+ ok(ret == ERROR_SUCCESS, "PdhOpenQueryA failed 0x%08x\n", ret);
+
+ ret = PdhAddCounterA( query, "\\System\\System Up Time", 0, &counter );
+ ok(ret == ERROR_SUCCESS, "PdhAddCounterA failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterInfoA( NULL, 0, NULL, NULL );
+ ok(ret == PDH_INVALID_HANDLE, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterInfoA( counter, 0, NULL, NULL );
+ ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterInfoA( counter, 0, NULL, &info );
+ ok(ret == PDH_INVALID_ARGUMENT, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+
+ size = sizeof(info) - 1;
+ ret = PdhGetCounterInfoA( counter, 0, &size, NULL );
+ ok(ret == PDH_MORE_DATA, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+
+ size = sizeof(info);
+ ret = PdhGetCounterInfoA( counter, 0, &size, &info );
+ ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+ ok(size == sizeof(info), "PdhGetCounterInfoA failed %d\n", size);
+
+ ret = PdhGetCounterInfoA( counter, 0, &size, &info );
+ ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+ ok(info.lScale == 0, "lScale %d\n", info.lScale);
+
+ ret = PdhSetCounterScaleFactor( counter, 0 );
+ ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterInfoA( counter, 0, &size, &info );
+ ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+ ok(info.lScale == 0, "lScale %d\n", info.lScale);
+
+ ret = PdhSetCounterScaleFactor( counter, -5 );
+ ok(ret == ERROR_SUCCESS, "PdhSetCounterScaleFactor failed 0x%08x\n", ret);
+
+ ret = PdhGetCounterInfoA( counter, 0, &size, &info );
+ ok(ret == ERROR_SUCCESS, "PdhGetCounterInfoA failed 0x%08x\n", ret);
+ ok(info.lScale == -5, "lScale %d\n", info.lScale);
+
+ ret = PdhCloseQuery( query );
+ ok(ret == ERROR_SUCCESS, "PdhCloseQuery failed 0x%08x\n", ret);
+}
+
START_TEST(pdh)
{
test_open_close_query();
@@ -220,4 +303,6 @@ START_TEST(pdh)
test_PdhGetFormattedCounterValue();
test_PdhGetRawCounterValue();
test_PdhSetCounterScaleFactor();
+ test_PdhGetCounterTimeBase();
+ test_PdhGetCounterInfo();
}
More information about the wine-cvs
mailing list