Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

100 lines
2.7 KiB

// TODO: Move this to utility library.
#pragma once
#include <windows.h>
#include <winperf.h>
#include <malloc.h>
// For now, use the symbol offset from the perfsym.h file to identify a particular counter.
typedef __int32 PERFC;
class CAccumulator
{
public:
CAccumulator() { m_pb = NULL; m_cbAlloc = m_cbCur = 0; }
~CAccumulator() { free(m_pb); }
bool Accumulate(void * pb, DWORD cb);
BYTE * Buffer() { return m_pb; }
DWORD Size() { return m_cbCur; }
BYTE * Detach() { BYTE * pbT = m_pb; m_pb = NULL; m_cbAlloc = m_cbCur = 0; return pbT; }
private:
DWORD m_cbAlloc;
DWORD m_cbCur;
BYTE * m_pb;
};
struct PerfObject
{
DWORD ObjectNameTitleIndex;
DWORD DetailLevel; // Do we care?
DWORD DefaultCounter;
LARGE_INTEGER PerfTime;
LARGE_INTEGER PerfFreq;
};
struct PerfCounter
{
DWORD CounterNameTitleIndex; // Relative to start of this app's block; Offset into global database will be added later
DWORD DefaultScale;
DWORD DetailLevel; // Do we care?
DWORD CounterType;
};
struct PerfInstanceHeader
{
bool fInUse; // TRUE if active instance
DWORD dwPID; // Process ID of owning process
};
class CPerfCounterManager
{
friend class CPerfCounterObject;
public:
CPerfCounterManager() { m_hSharedMem = NULL; m_pbSharedMem = NULL; m_ppot = NULL; }
~CPerfCounterManager();
DWORD Init(char * mapname, __int32 cCountersPerObject, __int32 cObjectsMax);
// These functions used only by the performance DLL.
DWORD Open(LPWSTR lpDeviceNames, char * appname, PerfObject * ppo, PerfCounter * apc);
DWORD Collect(LPWSTR lpwszValue, LPVOID *lppData, LPDWORD lpcbBytes, LPDWORD lpcObjectTypes);
DWORD Close();
// These functions used only by the application, indirectly via CPerfCounterObject.
__int32 AllocInstance();
void FreeInstance(__int32 iInstance);
private:
HANDLE m_hSharedMem;
unsigned __int8 * m_pbSharedMem;
unsigned __int32 m_cCountersPerObject;
unsigned __int32 m_cObjectsMax;
unsigned __int32 m_cbPerCounterBlock;
unsigned __int32 m_cbPerInstance;
CAccumulator m_accumHeader;
PERF_OBJECT_TYPE * m_ppot;
};
// An instance of a particular performance object.
class CPerfCounterObject
{
public:
CPerfCounterObject() { m_ppcm = NULL; }
~CPerfCounterObject();
bool Init(CPerfCounterManager *);
void IncrementCounter(PERFC perfc);
void SetCounter(PERFC perfc, __int32 value);
private:
CPerfCounterManager * m_ppcm;
int m_iInstance;
};