CNTRDATA.C


/******************************************************************************\
* This is a part of the Microsoft Source Code Samples.
* Copyright 1993 - 1998 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/


/******************************************************************************

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;
}