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