120 lines
2.6 KiB
C
120 lines
2.6 KiB
C
|
|
/******************************************************************************
|
|
|
|
C O U N T E R D A T A
|
|
|
|
Name: cntrdata.c
|
|
|
|
Description:
|
|
This module contains functions that access counters of an instance
|
|
of object in performance data.
|
|
|
|
Functions:
|
|
FirstCounter
|
|
NextCounter
|
|
FindCounter
|
|
CounterData
|
|
|
|
******************************************************************************/
|
|
|
|
#include <windows.h>
|
|
#include <winperf.h>
|
|
#include "perfdata.h"
|
|
|
|
|
|
|
|
|
|
//*********************************************************************
|
|
//
|
|
// FirstCounter
|
|
//
|
|
// Find the first counter in pObject.
|
|
//
|
|
// Returns a pointer to the first counter. If pObject is NULL
|
|
// then NULL is returned.
|
|
//
|
|
PPERF_COUNTER FirstCounter (PPERF_OBJECT pObject)
|
|
{
|
|
if (pObject)
|
|
return (PPERF_COUNTER)((PCHAR) pObject + pObject->HeaderLength);
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
|
|
//*********************************************************************
|
|
//
|
|
// NextCounter
|
|
//
|
|
// Find the next counter of pCounter.
|
|
//
|
|
// If pCounter is the last counter of an object type, bogus data
|
|
// maybe returned. The caller should do the checking.
|
|
//
|
|
// Returns a pointer to a counter. If pCounter is NULL then
|
|
// NULL is returned.
|
|
//
|
|
PPERF_COUNTER NextCounter (PPERF_COUNTER pCounter)
|
|
{
|
|
if (pCounter)
|
|
return (PPERF_COUNTER)((PCHAR) pCounter + pCounter->ByteLength);
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
|
|
//*********************************************************************
|
|
//
|
|
// FindCounter
|
|
//
|
|
// Find a counter specified by TitleIndex.
|
|
//
|
|
// Returns a pointer to the counter. If counter is not found
|
|
// then NULL is returned.
|
|
//
|
|
PPERF_COUNTER FindCounter (PPERF_OBJECT pObject, DWORD TitleIndex)
|
|
{
|
|
PPERF_COUNTER pCounter;
|
|
DWORD i = 0;
|
|
|
|
if (pCounter = FirstCounter (pObject))
|
|
while (i < pObject->NumCounters)
|
|
{
|
|
if (pCounter->CounterNameTitleIndex == TitleIndex)
|
|
return pCounter;
|
|
|
|
pCounter = NextCounter (pCounter);
|
|
i++;
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//*********************************************************************
|
|
//
|
|
// CounterData
|
|
//
|
|
// Returns counter data for an object instance. If pInst or pCount
|
|
// is NULL then NULL is returne.
|
|
//
|
|
PVOID CounterData (PPERF_INSTANCE pInst, PPERF_COUNTER pCount)
|
|
{
|
|
PPERF_COUNTER_BLOCK pCounterBlock;
|
|
|
|
if (pCount && pInst)
|
|
{
|
|
pCounterBlock = (PPERF_COUNTER_BLOCK)((PCHAR)pInst + pInst->ByteLength);
|
|
return (PVOID)((PCHAR)pCounterBlock + pCount->CounterOffset);
|
|
}
|
|
else
|
|
return NULL;
|
|
}
|