Hans Leidekker : pdh: Implement PdhCalculateCounterFromRawValue.
Alexandre Julliard
julliard at winehq.org
Mon Oct 1 07:55:00 CDT 2007
Module: wine
Branch: master
Commit: a83509c7d36b15cb084f47b6761f13192ffe413f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a83509c7d36b15cb084f47b6761f13192ffe413f
Author: Hans Leidekker <hans at it.vu.nl>
Date: Sat Sep 29 21:06:49 2007 +0200
pdh: Implement PdhCalculateCounterFromRawValue.
---
dlls/pdh/pdh.spec | 2 +-
dlls/pdh/pdh_main.c | 109 +++++++++++++++++++++++++++++++++-----------------
2 files changed, 73 insertions(+), 38 deletions(-)
diff --git a/dlls/pdh/pdh.spec b/dlls/pdh/pdh.spec
index 8735c0f..ad46f40 100644
--- a/dlls/pdh/pdh.spec
+++ b/dlls/pdh/pdh.spec
@@ -11,7 +11,7 @@
@ stub PdhBrowseCountersHA
@ stub PdhBrowseCountersHW
@ stub PdhBrowseCountersW
-@ stub PdhCalculateCounterFromRawValue
+@ stdcall PdhCalculateCounterFromRawValue(ptr long ptr ptr ptr)
@ stub PdhCloseLog
@ stdcall PdhCloseQuery(ptr)
@ stdcall PdhCollectQueryData(ptr)
diff --git a/dlls/pdh/pdh_main.c b/dlls/pdh/pdh_main.c
index 479fe3b..a97ee9b 100644
--- a/dlls/pdh/pdh_main.c
+++ b/dlls/pdh/pdh_main.c
@@ -96,6 +96,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
return TRUE;
}
+union value
+{
+ LONG longvalue;
+ double doublevalue;
+ LONGLONG largevalue;
+};
+
struct counter
{
DWORD magic; /* signature */
@@ -110,18 +117,8 @@ struct counter
LONGLONG base; /* samples per second */
FILETIME stamp; /* time stamp */
void (CALLBACK *collect)( struct counter * ); /* collect callback */
- union
- {
- LONG longvalue;
- double doublevalue;
- LONGLONG largevalue;
- } one; /* first value */
- union
- {
- LONG longvalue;
- double doublevalue;
- LONGLONG largevalue;
- } two; /* second value */
+ union value one; /* first value */
+ union value two; /* second value */
};
#define PDH_MAGIC_COUNTER 0x50444831 /* 'PDH1' */
@@ -319,6 +316,64 @@ PDH_STATUS WINAPI PdhAddEnglishCounterW( PDH_HQUERY query, LPCWSTR path,
return PdhAddCounterW( query, path, userdata, counter );
}
+/* caller must hold counter lock */
+static PDH_STATUS format_value( struct counter *counter, DWORD format, union value *raw1,
+ union value *raw2, PDH_FMT_COUNTERVALUE *value )
+{
+ LONG factor;
+
+ factor = counter->scale ? counter->scale : counter->defaultscale;
+ if (format & PDH_FMT_LONG)
+ {
+ if (format & PDH_FMT_1000) value->u.longValue = raw2->longvalue * 1000;
+ else value->u.longValue = raw2->longvalue * pow( 10, factor );
+ }
+ else if (format & PDH_FMT_LARGE)
+ {
+ if (format & PDH_FMT_1000) value->u.largeValue = raw2->largevalue * 1000;
+ else value->u.largeValue = raw2->largevalue * pow( 10, factor );
+ }
+ else if (format & PDH_FMT_DOUBLE)
+ {
+ if (format & PDH_FMT_1000) value->u.doubleValue = raw2->doublevalue * 1000;
+ else value->u.doubleValue = raw2->doublevalue * pow( 10, factor );
+ }
+ else
+ {
+ WARN("unknown format %x\n", format);
+ return PDH_INVALID_ARGUMENT;
+ }
+ return ERROR_SUCCESS;
+}
+
+/***********************************************************************
+ * PdhCalculateCounterFromRawValue (PDH.@)
+ */
+PDH_STATUS WINAPI PdhCalculateCounterFromRawValue( PDH_HCOUNTER handle, DWORD format,
+ PPDH_RAW_COUNTER raw1, PPDH_RAW_COUNTER raw2,
+ PPDH_FMT_COUNTERVALUE value )
+{
+ PDH_STATUS ret;
+ struct counter *counter = handle;
+
+ TRACE("%p 0x%08x %p %p %p\n", handle, format, raw1, raw2, value);
+
+ if (!value) return PDH_INVALID_ARGUMENT;
+
+ EnterCriticalSection( &pdh_handle_cs );
+ if (!counter || counter->magic != PDH_MAGIC_COUNTER)
+ {
+ LeaveCriticalSection( &pdh_handle_cs );
+ return PDH_INVALID_HANDLE;
+ }
+
+ ret = format_value( counter, format, (union value *)&raw1->SecondValue,
+ (union value *)&raw2->SecondValue, value );
+
+ LeaveCriticalSection( &pdh_handle_cs );
+ return ret;
+}
+
/* caller must hold query lock */
static void shutdown_query_thread( struct query *query )
{
@@ -630,7 +685,7 @@ PDH_STATUS WINAPI PdhGetCounterTimeBase( PDH_HCOUNTER handle, LONGLONG *base )
PDH_STATUS WINAPI PdhGetFormattedCounterValue( PDH_HCOUNTER handle, DWORD format,
LPDWORD type, PPDH_FMT_COUNTERVALUE value )
{
- LONG factor;
+ PDH_STATUS ret;
struct counter *counter = handle;
TRACE("%p %x %p %p\n", handle, format, type, value);
@@ -648,34 +703,14 @@ PDH_STATUS WINAPI PdhGetFormattedCounterValue( PDH_HCOUNTER handle, DWORD format
LeaveCriticalSection( &pdh_handle_cs );
return PDH_INVALID_DATA;
}
-
- factor = counter->scale ? counter->scale : counter->defaultscale;
- if (format & PDH_FMT_LONG)
- {
- if (format & PDH_FMT_1000) value->u.longValue = counter->two.longvalue * 1000;
- else value->u.longValue = counter->two.longvalue * pow( 10, factor );
- }
- else if (format & PDH_FMT_LARGE)
- {
- if (format & PDH_FMT_1000) value->u.largeValue = counter->two.largevalue * 1000;
- else value->u.largeValue = counter->two.largevalue * pow( 10, factor );
- }
- else if (format & PDH_FMT_DOUBLE)
- {
- if (format & PDH_FMT_1000) value->u.doubleValue = counter->two.doublevalue * 1000;
- else value->u.doubleValue = counter->two.doublevalue * pow( 10, factor );
- }
- else
+ if (!(ret = format_value( counter, format, &counter->one, &counter->two, value )))
{
- WARN("unknown format %x\n", format);
- LeaveCriticalSection( &pdh_handle_cs );
- return PDH_INVALID_ARGUMENT;
+ value->CStatus = ERROR_SUCCESS;
+ if (type) *type = counter->type;
}
- value->CStatus = ERROR_SUCCESS;
- if (type) *type = counter->type;
LeaveCriticalSection( &pdh_handle_cs );
- return ERROR_SUCCESS;
+ return ret;
}
/***********************************************************************
More information about the wine-cvs
mailing list