Leaked source code of windows server 2003
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.
 
 
 
 
 
 

186 lines
4.8 KiB

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
perfhelp.h
Abstract:
<abstract>
--*/
#ifndef _PERFHELP_H_
#define _PERFHELP_H_
#include <winperf.h>
__inline
PERF_OBJECT_TYPE *
FirstObject(IN PERF_DATA_BLOCK * pPerfData)
{
PERF_OBJECT_TYPE * pReturn;
LPBYTE pEndOfBuffer;
pReturn = (PPERF_OBJECT_TYPE)((PBYTE)(pPerfData) + (pPerfData)->HeaderLength);
pEndOfBuffer = (LPBYTE)((LPBYTE)pPerfData + pPerfData->TotalByteLength);
if ((LPBYTE)pReturn >= pEndOfBuffer) pReturn = NULL;
return (pReturn);
}
#define NextObject(pObject) \
(PPERF_OBJECT_TYPE)((pObject)->TotalByteLength != 0 ? (PPERF_OBJECT_TYPE)((PBYTE)(pObject) + (pObject)->TotalByteLength) : NULL)
#define FirstInstance(pObjectDef) \
(PERF_INSTANCE_DEFINITION *)((PCHAR) pObjectDef + pObjectDef->DefinitionLength)
// the return of this macro must be cast to the correct type of pointer by the caller
#define EndOfObject(pObjectDef) \
((PCHAR) pObjectDef + pObjectDef->TotalByteLength)
__inline
PERF_INSTANCE_DEFINITION *
NextInstance(
IN PERF_INSTANCE_DEFINITION *pInstDef
)
{
PERF_COUNTER_BLOCK *pCounterBlock;
pCounterBlock = (PERF_COUNTER_BLOCK *)
((PCHAR) pInstDef + pInstDef->ByteLength);
return (PERF_INSTANCE_DEFINITION *)
((PCHAR) pCounterBlock + pCounterBlock->ByteLength);
}
#define PERF_TIMER_TYPE_FIELD \
(PERF_TIMER_TICK | PERF_TIMER_100NS | PERF_OBJECT_TIMER)
class PerfHelper
{
static void GetInstances(
LPBYTE pBuf,
CClassMapInfo *pClassMap,
IWbemObjectSink *pSink
);
static void RefreshInstances(
LPBYTE pBuf,
CNt5Refresher *pRef
);
static PERF_INSTANCE_DEFINITION * GetInstanceByName(
PERF_DATA_BLOCK *pDataBlock,
PERF_OBJECT_TYPE *pObjectDef,
LPWSTR pInstanceName,
LPWSTR pParentName,
DWORD dwIndex);
static PERF_INSTANCE_DEFINITION * GetInstanceByNameUsingParentTitleIndex(
PERF_DATA_BLOCK *pDataBlock,
PERF_OBJECT_TYPE *pObjectDef,
LPWSTR pInstanceName,
LPWSTR pParentName,
DWORD dwIndex);
static DWORD GetInstanceNameStr (
PPERF_INSTANCE_DEFINITION pInstance,
LPWSTR lpszInstance,
size_t cchBufferSize,
DWORD dwCodePage);
static DWORD GetUnicodeInstanceName (
PPERF_INSTANCE_DEFINITION pInstance,
LPWSTR lpszInstance, size_t cchBufferSize );
static LPWSTR GetInstanceName(PPERF_INSTANCE_DEFINITION pInstDef)
{
return (LPWSTR) ((PCHAR) pInstDef + pInstDef->NameOffset);
}
static DWORD GetAnsiInstanceName (
PPERF_INSTANCE_DEFINITION pInstance,
LPWSTR lpszInstance,
size_t cchBufferSize,
DWORD dwCodePage);
static PERF_INSTANCE_DEFINITION * GetInstanceByUniqueId (
PERF_OBJECT_TYPE *pObjectDef,
LONG InstanceUniqueId);
static PERF_INSTANCE_DEFINITION * GetInstance(
PERF_OBJECT_TYPE *pObjectDef,
LONG InstanceNumber);
static PERF_OBJECT_TYPE * GetObjectDefByName (
PERF_DATA_BLOCK *pDataBlock,
DWORD dwLastNameIndex,
LPCWSTR *NameArray,
LPCWSTR szObjectName);
static PERF_OBJECT_TYPE * GetObjectDefByTitleIndex (
PERF_DATA_BLOCK *pDataBlock,
DWORD ObjectTypeTitleIndex);
static BOOL PerfHelper::IsMatchingInstance (
PERF_INSTANCE_DEFINITION *pInstanceDef,
DWORD dwCodePage,
LPWSTR szInstanceNameToMatch,
DWORD dwInstanceNameLength);
static void RefreshEnumeratorInstances (
IN RefresherCacheEl *pThisCacheEl,
IN PERF_DATA_BLOCK *PerfData,
IN PERF_OBJECT_TYPE *PerfObj);
public:
static BOOL ParseInstanceName (
LPCWSTR szInstanceString,
LPWSTR szInstanceName,
size_t cchInstanceName,
LPWSTR szParentName,
size_t cchParentName,
LPDWORD lpIndex);
static DWORD GetFullInstanceNameStr (
PERF_DATA_BLOCK *pPerfData,
PERF_OBJECT_TYPE *pObjectDef,
PERF_INSTANCE_DEFINITION *pInstanceDef,
LPWSTR szInstanceName,
size_t cchInstanceName );
static BOOL QueryInstances(
CPerfObjectAccess *pPerfObj,
CClassMapInfo *pClassMap,
IWbemObjectSink *pSink
);
static BOOL RefreshInstances(
CNt5Refresher *pRef
);
static VOID UpdateTimers(
CClassMapInfo *pClassMap,
IWbemObjectAccess *pInst,
PPERF_DATA_BLOCK PerfData,
PPERF_OBJECT_TYPE PerfObj
);
};
__inline
LONG64
Assign64(
IN PLARGE_INTEGER Unaligned
)
{
PLARGE_INTEGER pAligned;
LONG64 llVal;
pAligned = (PLARGE_INTEGER) &llVal;
pAligned->LowPart = Unaligned->LowPart;
pAligned->HighPart = Unaligned->HighPart;
return llVal;
}
#endif