1003 lines
25 KiB
C
1003 lines
25 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (C) 1996-1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
pdhidef.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
function definitions used internally by the performance data helper
|
||
|
functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _PDHI_DEFS_H_
|
||
|
#define _PDHI_DEFS_H_
|
||
|
|
||
|
#pragma warning ( disable : 4115 )
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#ifndef _DEBUG_MUTEXES
|
||
|
#define _DEBUG_MUTEXES 0 // for debugging
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#include <locale.h>
|
||
|
#include "pdhitype.h"
|
||
|
|
||
|
#if DBG
|
||
|
VOID
|
||
|
__cdecl
|
||
|
PdhDebugPrint(
|
||
|
ULONG DebugPrintLevel,
|
||
|
char * DebugMessage,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
#define DebugPrint(x) PdhDebugPrint x
|
||
|
#else
|
||
|
#define DebugPrint(x)
|
||
|
#endif
|
||
|
|
||
|
#define STATIC_PDH_FUNCTION PDH_STATUS __stdcall
|
||
|
#define STATIC_BOOL BOOL __stdcall
|
||
|
#define STATIC_DWORD DWORD __stdcall
|
||
|
#define PDH_PLA_MUTEX L"__PDH_PLA_MUTEX__"
|
||
|
|
||
|
// global variable declarations
|
||
|
extern HANDLE ThisDLLHandle;
|
||
|
extern WCHAR szStaticLocalMachineName[];
|
||
|
extern HANDLE hPdhDataMutex;
|
||
|
extern HANDLE hPdhContextMutex;
|
||
|
extern HANDLE hPdhPlaMutex;
|
||
|
extern HANDLE hPdhHeap;
|
||
|
extern HANDLE hEventLog;
|
||
|
|
||
|
extern LONGLONG llRemoteRetryTime;
|
||
|
extern BOOL bEnableRemotePdhAccess;
|
||
|
extern DWORD dwPdhiLocalDefaultDataSource;
|
||
|
extern LONG dwCurrentRealTimeDataSource;
|
||
|
extern ULONGLONG ulPdhCollectTimeout;
|
||
|
extern BOOL bProcessIsDetaching;
|
||
|
|
||
|
// (assumes dword is 4 bytes)
|
||
|
#define ALIGN_ON_DWORD(x) ((VOID *) (((DWORD_PTR) (x) & 3) ? (((DWORD_PTR) (x) & ~3) + 4 ) : ((DWORD_PTR)(x))))
|
||
|
#define DWORD_MULTIPLE(x) ((((x) + sizeof(DWORD) - 1) / sizeof(DWORD)) * sizeof(DWORD))
|
||
|
#define CLEAR_FIRST_FOUR_BYTES(x) * (DWORD *)(x) = 0L
|
||
|
|
||
|
// (assumes QuadWORD is 8 bytes)
|
||
|
#define ALIGN_ON_QWORD(x) ((VOID *)(((DWORD_PTR)(x) & 7) ? (((DWORD_PTR)(x) & ~7) + 8) : ((DWORD_PTR)(x))))
|
||
|
#define QWORD_MULTIPLE(x) ((((x) + sizeof(LONGLONG) - 1) / sizeof(LONGLONG)) * sizeof(LONGLONG))
|
||
|
#define CLEAR_FIRST_EIGHT_BYTES(x) * (LONGLONG *)(x) = 0L
|
||
|
|
||
|
#if _DEBUG_MUTEXES
|
||
|
__inline
|
||
|
DWORD
|
||
|
PdhiLocalWaitForMutex(
|
||
|
LPCSTR szSourceFileName,
|
||
|
DWORD dwLineNo,
|
||
|
HANDLE hMutex
|
||
|
)
|
||
|
{
|
||
|
DWORD dwReturnValue = PDH_INVALID_PARAMETER;
|
||
|
if (hMutex != NULL) {
|
||
|
FILETIME ft;
|
||
|
GetSystemTimeAsFileTime(& ft);
|
||
|
dwReturnValue = WaitForSingleObject(hMutex, 60000);
|
||
|
DebugPrint((4, "\n[%8.8x] Mutex [%8.8x] %s by (%d) at: %s (%d)",
|
||
|
ft.dwLowDateTime,
|
||
|
(DWORD) hMutex,
|
||
|
(dwReturnValue == 0 ? "Locked" : "Lock Failed"),
|
||
|
GetCurrentThreadId(),
|
||
|
szSourceFileName,
|
||
|
dwLineNo));
|
||
|
}
|
||
|
else {
|
||
|
DebugPrint((4, "\nLock of NULL Mutex attmpted at: %s (%d)", szSourceFileName, dwLineNo));
|
||
|
dwReturnValue = PDH_INVALID_PARAMETER;
|
||
|
}
|
||
|
return dwReturnValue;
|
||
|
}
|
||
|
|
||
|
#define WAIT_FOR_AND_LOCK_MUTEX(h) PdhiLocalWaitForMutex (__FILE__, __LINE__, h);
|
||
|
|
||
|
__inline
|
||
|
void
|
||
|
PdhiLocalReleaseMutex(
|
||
|
LPCSTR szSourceFileName,
|
||
|
DWORD dwLineNo,
|
||
|
HANDLE hMutex
|
||
|
)
|
||
|
{
|
||
|
BOOL bSuccess;
|
||
|
LONG lPrevCount = 0;
|
||
|
FILETIME ft;
|
||
|
|
||
|
if (hMutex != NULL) {
|
||
|
GetSystemTimeAsFileTime(& ft);
|
||
|
bSuccess = ReleaseMutex(hMutex);
|
||
|
DebugPrint((4, "\n[%8.8x] Mutex [%8.8x] %s by (%d) at: %s (%d)",
|
||
|
ft.dwLowDateTime,
|
||
|
(DWORD) hMutex,
|
||
|
(bSuccess ? "Released" : "Release Failed"),
|
||
|
GetCurrentThreadId(),
|
||
|
szSourceFileName,
|
||
|
dwLineNo));
|
||
|
}
|
||
|
else {
|
||
|
DebugPrint((4, "\nRelease of NULL Mutex attempted at: %s (%d)", szSourceFileName, dwLineNo));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define RELEASE_MUTEX(h) PdhiLocalReleaseMutex (__FILE__, __LINE__, h);
|
||
|
#else
|
||
|
#define WAIT_FOR_AND_LOCK_MUTEX(h) (h != NULL ? WaitForSingleObject(h, 60000) : WAIT_TIMEOUT)
|
||
|
#define RELEASE_MUTEX(h) (h != NULL ? ReleaseMutex(h) : FALSE)
|
||
|
#endif
|
||
|
|
||
|
#define LODWORD(ll) ((DWORD)((LONGLONG)ll & 0x00000000FFFFFFFF))
|
||
|
#define HIDWORD(ll) ((DWORD)(((LONGLONG)ll >> 32) & 0x00000000FFFFFFFF))
|
||
|
#define MAKELONGLONG(low, high) \
|
||
|
((LONGLONG) (((DWORD) (low)) | ((LONGLONG) ((DWORD) (high))) << 32))
|
||
|
|
||
|
#define MAX_BTREE_DEPTH 40
|
||
|
#define PDH_SQL_STRING_SIZE 1024
|
||
|
#define SMALL_BUFFER_SIZE 4096
|
||
|
#define MEDIUM_BUFFER_SIZE 16384
|
||
|
#define LARGE_BUFFER_SIZE 65536
|
||
|
|
||
|
// set this to 1 to report code errors (i.e. debugging information)
|
||
|
// to the event log.
|
||
|
#define PDHI_REPORT_CODE_ERRORS 0
|
||
|
|
||
|
// set this to 1 to report user errors (i.e. things the normal user
|
||
|
// would care about) to the event log.
|
||
|
#define PDHI_REPORT_USER_ERRORS 1
|
||
|
|
||
|
// USER category errors are typically configuration, schema or access
|
||
|
// access errors, errors the user can usually do something about
|
||
|
#define PDH_EVENT_CATEGORY_USER 100
|
||
|
|
||
|
// COUNTER category errors are errors returned do to valid data returning
|
||
|
// invalid results. These are a special subset of USER Category errors.
|
||
|
#define PDH_EVENT_CATEGORY_COUNTER 110
|
||
|
|
||
|
// DEBUG category errors are of interest only to PDH developers as they
|
||
|
// indicate problems that can normally only be fixed by modifying the
|
||
|
// program code.
|
||
|
#define PDH_EVENT_CATEGORY_DEBUG 200
|
||
|
|
||
|
#define REPORT_EVENT(t,c,id) ReportEvent (hEventLog, t, c, id, NULL, 0, 0, NULL, NULL)
|
||
|
|
||
|
__inline
|
||
|
BOOL
|
||
|
CounterIsOkToUse(void * pCounterArg)
|
||
|
{
|
||
|
BOOL bReturn = FALSE;
|
||
|
PPDHI_COUNTER pCounter = (PPDHI_COUNTER) pCounterArg;
|
||
|
if (pCounter != NULL) {
|
||
|
if (! (pCounter->dwFlags & PDHIC_COUNTER_UNUSABLE)) {
|
||
|
bReturn = TRUE;
|
||
|
}
|
||
|
}
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
DataSourceTypeH(
|
||
|
PDH_HLOG hDataSource
|
||
|
);
|
||
|
|
||
|
DWORD
|
||
|
DataSourceTypeW(
|
||
|
LPCWSTR szDataSource
|
||
|
);
|
||
|
|
||
|
DWORD
|
||
|
DataSourceTypeA(
|
||
|
LPCSTR szDataSource
|
||
|
);
|
||
|
|
||
|
LPWSTR
|
||
|
GetStringResource(
|
||
|
DWORD dwResId
|
||
|
);
|
||
|
//
|
||
|
// Log file entries
|
||
|
//
|
||
|
extern LPCSTR szTsvLogFileHeader;
|
||
|
extern LPCSTR szCsvLogFileHeader;
|
||
|
extern LPCSTR szBinLogFileHeader;
|
||
|
extern LPCSTR szTsvType;
|
||
|
extern LPCSTR szCsvType;
|
||
|
extern LPCSTR szBinaryType;
|
||
|
extern const DWORD dwFileHeaderLength;
|
||
|
extern const DWORD dwTypeLoc;
|
||
|
extern const DWORD dwVersionLoc;
|
||
|
extern const DWORD dwFieldLength;
|
||
|
|
||
|
DWORD
|
||
|
UnmapReadonlyMappedFile(
|
||
|
LPVOID pMemoryBase,
|
||
|
BOOL * bNeedToCloseHandles
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiGetLogCounterInfo(
|
||
|
PDH_HLOG hLog,
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumLoggedMachines(
|
||
|
PDH_HLOG hDataSource,
|
||
|
LPVOID mszMachineList,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumLoggedObjects(
|
||
|
PDH_HLOG hDataSource,
|
||
|
LPCWSTR szMachineName,
|
||
|
LPVOID mszObjectList,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
DWORD dwDetailLevel,
|
||
|
BOOL bRefresh,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumLoggedObjectItems(
|
||
|
PDH_HLOG hDataSource,
|
||
|
LPCWSTR szMachineName,
|
||
|
LPCWSTR szObjectName,
|
||
|
LPVOID mszCounterList,
|
||
|
LPDWORD pdwCounterListLength,
|
||
|
LPVOID mszInstanceList,
|
||
|
LPDWORD pdwInstanceListLength,
|
||
|
DWORD dwDetailLevel,
|
||
|
DWORD dwFlags,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PdhiDataSourceHasDetailLevelsH(
|
||
|
PDH_HLOG hDataSource
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PdhiDataSourceHasDetailLevels(
|
||
|
LPWSTR szDataSource
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiGetMatchingLogRecord(
|
||
|
PDH_HLOG hLog,
|
||
|
LONGLONG * pStartTime,
|
||
|
LPDWORD pdwIndex
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiGetCounterValueFromLogFile(
|
||
|
PDH_HLOG hLog,
|
||
|
DWORD dwIndex,
|
||
|
PDHI_COUNTER * pCounter
|
||
|
);
|
||
|
|
||
|
STATIC_PDH_FUNCTION
|
||
|
PdhiGetCounterInfo(
|
||
|
HCOUNTER hCounter,
|
||
|
BOOLEAN bRetrieveExplainText,
|
||
|
LPDWORD pdwBufferSize,
|
||
|
PPDH_COUNTER_INFO_W lpBuffer,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
// log.c
|
||
|
BOOL
|
||
|
PdhiCloseAllLoggers();
|
||
|
|
||
|
ULONG HashCounter(
|
||
|
LPWSTR szCounterName
|
||
|
);
|
||
|
|
||
|
void
|
||
|
PdhiInitCounterHashTable(
|
||
|
PDHI_COUNTER_TABLE pTable
|
||
|
);
|
||
|
|
||
|
void
|
||
|
PdhiResetInstanceCount(
|
||
|
PDHI_COUNTER_TABLE pTable
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiFindCounterInstList(
|
||
|
PDHI_COUNTER_TABLE pHeadList,
|
||
|
LPWSTR szCounter,
|
||
|
PPDHI_INST_LIST * pInstList
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiFindInstance(
|
||
|
PLIST_ENTRY pHeadInst,
|
||
|
LPWSTR szInstance,
|
||
|
BOOLEAN bUpdateCount,
|
||
|
PPDHI_INSTANCE * pInstance
|
||
|
);
|
||
|
|
||
|
DWORD
|
||
|
AddStringToMultiSz(
|
||
|
LPVOID mszDest,
|
||
|
LPWSTR szSource,
|
||
|
BOOL bUnicodeDest
|
||
|
);
|
||
|
|
||
|
// query.c
|
||
|
PDH_FUNCTION
|
||
|
PdhiCollectQueryData(
|
||
|
PPDHI_QUERY pQuery,
|
||
|
LONGLONG *pllTimeStamp
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PdhiQueryCleanup(
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiConvertUnicodeToAnsi(
|
||
|
UINT uCodePage,
|
||
|
LPWSTR wszSrc,
|
||
|
LPSTR aszDest,
|
||
|
LPDWORD pdwSize
|
||
|
);
|
||
|
|
||
|
// qutils.c
|
||
|
|
||
|
DWORD
|
||
|
WINAPI
|
||
|
PdhiAsyncTimerThreadProc(
|
||
|
LPVOID pArg
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
IsValidQuery(
|
||
|
HQUERY hQuery
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
IsValidCounter(
|
||
|
HCOUNTER hCounter
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
InitCounter(
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
ParseFullPathNameW(
|
||
|
LPCWSTR szFullCounterPath,
|
||
|
PDWORD pdwBufferLength,
|
||
|
PPDHI_COUNTER_PATH pCounter,
|
||
|
BOOL bWbemSyntax
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
ParseInstanceName(
|
||
|
LPCWSTR szInstanceString,
|
||
|
LPWSTR szInstanceName,
|
||
|
LPWSTR szParentName,
|
||
|
DWORD dwName,
|
||
|
LPDWORD lpIndex
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
FreeCounter(
|
||
|
PPDHI_COUNTER pThisCounter
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
InitPerflibCounterInfo(
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
AddMachineToQueryLists(
|
||
|
PPERF_MACHINE pMachine,
|
||
|
PPDHI_COUNTER pNewCounter
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UpdateRealTimeCounterValue(
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UpdateRealTimeMultiInstanceCounterValue(
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UpdateCounterValue(
|
||
|
PPDHI_COUNTER pCounter,
|
||
|
PPERF_DATA_BLOCK pPerfData
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UpdateMultiInstanceCounterValue(
|
||
|
PPDHI_COUNTER pCounter,
|
||
|
PPERF_DATA_BLOCK pPerfData,
|
||
|
LONGLONG TimeStamp
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
UpdateCounterObject(
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
#define GPCDP_GET_BASE_DATA 0x00000001
|
||
|
PVOID
|
||
|
GetPerfCounterDataPtr(
|
||
|
PPERF_DATA_BLOCK pPerfData,
|
||
|
PPDHI_COUNTER_PATH pPath,
|
||
|
PPERFLIB_COUNTER pplCtr,
|
||
|
DWORD dwFlags,
|
||
|
PPERF_OBJECT_TYPE *pPerfObject,
|
||
|
PDWORD pStatus
|
||
|
);
|
||
|
|
||
|
LONG
|
||
|
GetQueryPerfData(
|
||
|
PPDHI_QUERY pQuery,
|
||
|
LONGLONG * pTimeStamp
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
GetInstanceByNameMatch(
|
||
|
PPERF_MACHINE pMachine,
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiResetLogBuffers(
|
||
|
PDH_HLOG hLog
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
AddUniqueWideStringToMultiSz(
|
||
|
LPVOID mszDest,
|
||
|
LPWSTR szSource,
|
||
|
DWORD dwSizeLeft,
|
||
|
LPDWORD pdwSize,
|
||
|
BOOL bUnicodeDest
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PdhiBrowseDataSource(
|
||
|
HWND hWndParent,
|
||
|
LPVOID szFileName,
|
||
|
LPDWORD pcchFileNameSize,
|
||
|
BOOL bUnicodeString
|
||
|
);
|
||
|
|
||
|
LPWSTR
|
||
|
PdhiGetExplainText(
|
||
|
LPCWSTR szMachineName,
|
||
|
LPCWSTR szObjectName,
|
||
|
LPCWSTR szCounterName
|
||
|
);
|
||
|
|
||
|
LONG
|
||
|
GetCurrentServiceState(
|
||
|
SC_HANDLE hService,
|
||
|
BOOL * bStopped,
|
||
|
BOOL * bPaused
|
||
|
);
|
||
|
|
||
|
// wbem.cpp
|
||
|
|
||
|
BOOL
|
||
|
IsWbemDataSource(
|
||
|
LPCWSTR szDataSource
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiFreeAllWbemServers(
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiGetWbemExplainText(
|
||
|
LPCWSTR szMachineName,
|
||
|
LPCWSTR szObjectName,
|
||
|
LPCWSTR szCounterName,
|
||
|
LPWSTR szExplain,
|
||
|
LPDWORD pdwExplain
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumWbemMachines(
|
||
|
LPVOID pMachineList,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumWbemObjects(
|
||
|
LPCWSTR szWideMachineName,
|
||
|
LPVOID mszObjectList,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
DWORD dwDetailLevel,
|
||
|
BOOL bRefresh,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiGetDefaultWbemObject(
|
||
|
LPCWSTR szMachineName,
|
||
|
LPVOID szDefaultObjectName,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumWbemObjectItems(
|
||
|
LPCWSTR szWideMachineName,
|
||
|
LPCWSTR szWideObjectName,
|
||
|
LPVOID mszCounterList,
|
||
|
LPDWORD pcchCounterListLength,
|
||
|
LPVOID mszInstanceList,
|
||
|
LPDWORD pcchInstanceListLength,
|
||
|
DWORD dwDetailLevel,
|
||
|
DWORD dwFlags,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiGetDefaultWbemProperty(
|
||
|
LPCWSTR szMachineName,
|
||
|
LPCWSTR szObjectName,
|
||
|
LPVOID szDefaultCounterName,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEncodeWbemPathW(
|
||
|
PPDH_COUNTER_PATH_ELEMENTS_W pCounterPathElements,
|
||
|
LPWSTR szFullPathBuffer,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
LANGID LangId,
|
||
|
DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiDecodeWbemPathA(
|
||
|
LPCSTR szFullPathBuffer,
|
||
|
PPDH_COUNTER_PATH_ELEMENTS_A pCounterPathElements,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
LANGID LangId,
|
||
|
DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiDecodeWbemPathW(
|
||
|
LPCWSTR szFullPathBuffer,
|
||
|
PPDH_COUNTER_PATH_ELEMENTS_W pCounterPathElements,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
LANGID LangId,
|
||
|
DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEncodeWbemPathA(
|
||
|
PPDH_COUNTER_PATH_ELEMENTS_A pCounterPathElements,
|
||
|
LPSTR szFullPathBuffer,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
LANGID LangId,
|
||
|
DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
WbemInitCounter(
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
LONG
|
||
|
GetQueryWbemData(
|
||
|
PPDHI_QUERY pQuery,
|
||
|
LONGLONG * pllTimeStamp
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiCloseWbemCounter(
|
||
|
PPDHI_COUNTER pCounter
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiFreeWbemQuery(
|
||
|
PPDHI_QUERY pThisQuery
|
||
|
);
|
||
|
|
||
|
// routinues for cached machine/Object/Counter/Instance structure for counter logs.
|
||
|
int
|
||
|
PdhiCompareLogCounterInstance(
|
||
|
PPDHI_LOG_COUNTER pCounter,
|
||
|
LPWSTR szCounter,
|
||
|
LPWSTR szInstance,
|
||
|
DWORD dwInstance,
|
||
|
LPWSTR szParent
|
||
|
);
|
||
|
|
||
|
void
|
||
|
PdhiFreeLogMachineTable(
|
||
|
PPDHI_LOG_MACHINE * MachineTable
|
||
|
);
|
||
|
|
||
|
PPDHI_LOG_MACHINE
|
||
|
PdhiFindLogMachine(
|
||
|
PPDHI_LOG_MACHINE * MachineTable,
|
||
|
LPWSTR szMachine,
|
||
|
BOOL bInsert
|
||
|
);
|
||
|
|
||
|
PPDHI_LOG_OBJECT
|
||
|
PdhiFindLogObject(
|
||
|
PPDHI_LOG_MACHINE pMachine,
|
||
|
PPDHI_LOG_OBJECT * ObjectTable,
|
||
|
LPWSTR szObject,
|
||
|
BOOL bInsert
|
||
|
);
|
||
|
|
||
|
PPDHI_LOG_COUNTER
|
||
|
PdhiFindLogCounter(
|
||
|
PPDHI_LOG pLog,
|
||
|
PPDHI_LOG_MACHINE * MachineTable,
|
||
|
LPWSTR szMachine,
|
||
|
LPWSTR szObject,
|
||
|
LPWSTR szCounter,
|
||
|
DWORD dwCounterType,
|
||
|
DWORD dwDefaultScale,
|
||
|
LPWSTR szInstance,
|
||
|
DWORD dwInstance,
|
||
|
LPWSTR szParent,
|
||
|
DWORD dwParent,
|
||
|
LPDWORD pdwIndex,
|
||
|
BOOL bInsert
|
||
|
);
|
||
|
|
||
|
PPDHI_LOG_COUNTER
|
||
|
PdhiFindObjectCounter(
|
||
|
PPDHI_LOG pLog,
|
||
|
PPDHI_LOG_OBJECT pObject,
|
||
|
LPWSTR szCounter,
|
||
|
DWORD dwCounterType,
|
||
|
DWORD dwDefaultScale,
|
||
|
LPWSTR szInstance,
|
||
|
DWORD dwInstance,
|
||
|
LPWSTR szParent,
|
||
|
DWORD dwParent,
|
||
|
LPDWORD pdwIndex,
|
||
|
BOOL bInsert
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumCachedMachines(
|
||
|
PPDHI_LOG_MACHINE MachineList,
|
||
|
LPVOID pBuffer,
|
||
|
LPDWORD lpdwBufferSize,
|
||
|
BOOL bUnicodeDest
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumCachedObjects(
|
||
|
PPDHI_LOG_MACHINE MachineList,
|
||
|
LPCWSTR szMachineName,
|
||
|
LPVOID pBuffer,
|
||
|
LPDWORD pcchBufferSize,
|
||
|
DWORD dwDetailLevel,
|
||
|
BOOL bUnicodeDest
|
||
|
);
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhiEnumCachedObjectItems(
|
||
|
PPDHI_LOG_MACHINE MachineList,
|
||
|
LPCWSTR szMachineName,
|
||
|
LPCWSTR szObjectName,
|
||
|
PDHI_COUNTER_TABLE CounterTable,
|
||
|
DWORD dwDetailLevel,
|
||
|
DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
// Debug event tracing facility
|
||
|
//
|
||
|
#define PDH_DBG_TRACE_NONE 0 // no trace
|
||
|
#define PDH_DBG_TRACE_FATAL 1 // Print fatal error traces only
|
||
|
#define PDH_DBG_TRACE_ERROR 2 // All errors
|
||
|
#define PDH_DBG_TRACE_WARNING 3 // Warnings as well
|
||
|
#define PDH_DBG_TRACE_INFO 4 // Informational traces as well
|
||
|
#define PDH_DBG_TRACE_ALL 255 // All traces
|
||
|
|
||
|
#define ARG_TYPE_ULONG 0
|
||
|
#define ARG_TYPE_WSTR 1
|
||
|
#define ARG_TYPE_STR 2
|
||
|
#define ARG_TYPE_ULONG64 3
|
||
|
#define ARG_TYPE_ULONGX 4
|
||
|
#define ARG_TYPE_ULONG64X 5
|
||
|
|
||
|
#ifdef _WIN64
|
||
|
#define ARG_TYPE_PTR ARG_TYPE_ULONG64X
|
||
|
#else
|
||
|
#define ARG_TYPE_PTR ARG_TYPE_ULONGX
|
||
|
#endif
|
||
|
|
||
|
#define PDH_CALCFUNS 10
|
||
|
#define PDH_STATFUNS 11
|
||
|
#define PDH_COUNTER 20
|
||
|
#define PDH_CUTILS 21
|
||
|
#define PDH_DLLINIT 22
|
||
|
#define PDH_PERFDATA 23
|
||
|
#define PDH_PERFNAME 24
|
||
|
#define PDH_PERFUTIL 25
|
||
|
#define PDH_QUERY 26
|
||
|
#define PDH_QUTILS 27
|
||
|
#define PDH_STRINGS 28
|
||
|
#define PDH_VBFUNCS 29
|
||
|
#define PDH_LOG 40
|
||
|
#define PDH_LOGBIN 41
|
||
|
#define PDH_LOGCTRL 42
|
||
|
#define PDH_LOGPM 43
|
||
|
#define PDH_LOGSQL 44
|
||
|
#define PDH_LOGTEXT 45
|
||
|
#define PDH_LOGWMI 46
|
||
|
#define PDH_RELOG 47
|
||
|
#define PDH_PLOGMAN 50
|
||
|
#define PDH_REGUTIL 51
|
||
|
#define PDH_WMIUTIL 52
|
||
|
#define PDH_BROWSDLG 60
|
||
|
#define PDH_BROWSER 61
|
||
|
#define PDH_DATASRC 62
|
||
|
#define PDH_EXPLDLG 63
|
||
|
#define PDH_WILDCARD 64
|
||
|
#define PDH_WBEM 70
|
||
|
#define PDH_GALLOC 80
|
||
|
#define PDH_GREALLOC 81
|
||
|
#define PDH_GFREE 82
|
||
|
|
||
|
// n must be 1 through 8. x is the one of above types
|
||
|
#define ARG_DEF(x, n) (x << ((n-1) * 4))
|
||
|
|
||
|
#define TRACE_WSTR(str) str, (sizeof(WCHAR) * (lstrlenW(str) + 1))
|
||
|
#define TRACE_STR(str) str, (sizeof(CHAR) * (lstrlenA(str) + 1))
|
||
|
#define TRACE_DWORD(dwValue) & dwValue, sizeof(LONG)
|
||
|
#define TRACE_LONG64(llValue) & llValue, sizeof(LONGLONG)
|
||
|
|
||
|
#ifdef _WIN64
|
||
|
#define TRACE_PTR(ptr) TRACE_LONG64(ptr)
|
||
|
#else
|
||
|
#define TRACE_PTR(ptr) TRACE_DWORD(ptr)
|
||
|
#endif
|
||
|
|
||
|
#ifdef _INIT_PDH_DEBUGTRACE
|
||
|
DWORD g_dwDebugTraceLevel = PDH_DBG_TRACE_NONE;
|
||
|
#else
|
||
|
extern DWORD g_dwDebugTraceLevel;
|
||
|
#endif
|
||
|
|
||
|
PDH_FUNCTION
|
||
|
PdhDebugStartTrace();
|
||
|
|
||
|
VOID
|
||
|
PdhDbgTrace(
|
||
|
ULONG LineNumber,
|
||
|
ULONG ModuleNumber,
|
||
|
ULONG OptArgs,
|
||
|
ULONG Status,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
#define TRACE(L, X) if (g_dwDebugTraceLevel >= L) PdhDbgTrace X
|
||
|
|
||
|
#define _SHOW_PDH_MEM_ALLOCS 1
|
||
|
//#define _VALIDATE_PDH_MEM_ALLOCS 1
|
||
|
|
||
|
#ifndef _SHOW_PDH_MEM_ALLOCS
|
||
|
#define G_ALLOC(s) HeapAlloc(hPdhHeap, (HEAP_ZERO_MEMORY), s)
|
||
|
#define G_REALLOC(h,s) HeapReAlloc(hPdhHeap, (HEAP_ZERO_MEMORY), h, s)
|
||
|
#define G_FREE(h) if (h != NULL) HeapFree(hPdhHeap, 0, h)
|
||
|
#define G_SIZE(h) (h != NULL ? HeapSize(hPdhHeap, 0, h) : 0)
|
||
|
#else
|
||
|
|
||
|
#ifdef _VALIDATE_PDH_MEM_ALLOCS
|
||
|
|
||
|
__inline
|
||
|
LPVOID
|
||
|
PdhiHeapAlloc(DWORD s)
|
||
|
{
|
||
|
LPVOID lpRetVal;
|
||
|
HeapValidate(hPdhHeap, 0, NULL);
|
||
|
lpRetVal = HeapAlloc (hPdhHeap, HEAP_ZERO_MEMORY, s);
|
||
|
return lpRetVal;
|
||
|
}
|
||
|
|
||
|
__inline
|
||
|
LPVOID
|
||
|
PdhiHeapReAlloc(LPVOID h, DWORD s)
|
||
|
{
|
||
|
LPVOID lpRetVal;
|
||
|
HeapValidate(hPdhHeap, 0, NULL);
|
||
|
lpRetVal = HeapReAlloc (hPdhHeap, HEAP_ZERO_MEMORY, h, s);
|
||
|
return lpRetVal;
|
||
|
}
|
||
|
|
||
|
__inline
|
||
|
BOOL
|
||
|
PdhiHeapFree(LPVOID h)
|
||
|
{
|
||
|
BOOL bRetVal;
|
||
|
if (h == NULL) return TRUE;
|
||
|
HeapValidate(hPdhHeap, 0, NULL);
|
||
|
bRetVal = HeapFree (hPdhHeap, 0, h);
|
||
|
return bRetVal;
|
||
|
}
|
||
|
|
||
|
#define G_ALLOC(s) PdhiHeapAlloc(s)
|
||
|
#define G_REALLOC(h,s) PdhiHeapReAlloc(h, s)
|
||
|
#define G_FREE(h) PdhiHeapFree(h)
|
||
|
#define G_SIZE(h) (h != NULL ? HeapSize(hPdhHeap, 0, h) : 0)
|
||
|
|
||
|
#else
|
||
|
|
||
|
__inline
|
||
|
LPVOID
|
||
|
PdhiHeapAlloc(LPSTR szSourceFileName, DWORD dwLineNo, SIZE_T s)
|
||
|
{
|
||
|
LPVOID lpRetVal = NULL;
|
||
|
LONGLONG dwSize = (LONGLONG) s;
|
||
|
|
||
|
if (hPdhHeap != NULL) {
|
||
|
lpRetVal = HeapAlloc(hPdhHeap, HEAP_ZERO_MEMORY, s);
|
||
|
TRACE((PDH_DBG_TRACE_INFO),
|
||
|
(dwLineNo,
|
||
|
PDH_GALLOC,
|
||
|
ARG_DEF(ARG_TYPE_PTR, 1) | ARG_DEF(ARG_TYPE_STR, 2) | ARG_DEF(ARG_TYPE_ULONG64, 3),
|
||
|
ERROR_SUCCESS,
|
||
|
TRACE_PTR(lpRetVal),
|
||
|
TRACE_STR(szSourceFileName),
|
||
|
TRACE_LONG64(dwSize),
|
||
|
NULL));
|
||
|
}
|
||
|
return lpRetVal;
|
||
|
}
|
||
|
|
||
|
__inline
|
||
|
LPVOID
|
||
|
PdhiHeapReAlloc(LPSTR szSourceFileName, DWORD dwLineNo, LPVOID h, SIZE_T s)
|
||
|
{
|
||
|
LPVOID lpRetVal = NULL;
|
||
|
SIZE_T dwBeforeSize;
|
||
|
LONGLONG lBeforeSize;
|
||
|
LONGLONG lAfterSize;
|
||
|
|
||
|
if (hPdhHeap != NULL) {
|
||
|
dwBeforeSize = HeapSize(hPdhHeap, 0, h);
|
||
|
lpRetVal = HeapReAlloc(hPdhHeap, HEAP_ZERO_MEMORY, h, s);
|
||
|
lBeforeSize = (LONGLONG) dwBeforeSize;
|
||
|
lAfterSize = (LONGLONG) s;
|
||
|
TRACE((PDH_DBG_TRACE_INFO),
|
||
|
(dwLineNo,
|
||
|
PDH_GREALLOC,
|
||
|
ARG_DEF(ARG_TYPE_PTR, 1) | ARG_DEF(ARG_TYPE_PTR, 2) | ARG_DEF(ARG_TYPE_STR, 3)
|
||
|
| ARG_DEF(ARG_TYPE_ULONG64, 4) | ARG_DEF(ARG_TYPE_ULONG64, 5),
|
||
|
ERROR_SUCCESS,
|
||
|
TRACE_PTR(lpRetVal),
|
||
|
TRACE_PTR(h),
|
||
|
TRACE_STR(szSourceFileName),
|
||
|
TRACE_LONG64(lAfterSize),
|
||
|
TRACE_LONG64(lBeforeSize),
|
||
|
NULL));
|
||
|
}
|
||
|
return lpRetVal;
|
||
|
}
|
||
|
|
||
|
__inline
|
||
|
BOOL
|
||
|
PdhiHeapFree(LPSTR szSourceFileName, DWORD dwLineNo, LPVOID h)
|
||
|
{
|
||
|
BOOL bRetVal = TRUE;
|
||
|
SIZE_T dwBlockSize;
|
||
|
LONGLONG lBlockSize;
|
||
|
|
||
|
if (h != NULL) {
|
||
|
dwBlockSize = HeapSize(hPdhHeap, 0, h);
|
||
|
lBlockSize = (LONGLONG) dwBlockSize;
|
||
|
TRACE((PDH_DBG_TRACE_INFO),
|
||
|
(dwLineNo,
|
||
|
PDH_GFREE,
|
||
|
ARG_DEF(ARG_TYPE_PTR, 1) | ARG_DEF(ARG_TYPE_STR, 2) | ARG_DEF(ARG_TYPE_ULONG64, 3),
|
||
|
ERROR_SUCCESS,
|
||
|
TRACE_PTR(h),
|
||
|
TRACE_STR(szSourceFileName),
|
||
|
TRACE_LONG64(lBlockSize),
|
||
|
NULL));
|
||
|
|
||
|
bRetVal = HeapFree(hPdhHeap, 0, h);
|
||
|
}
|
||
|
return bRetVal;
|
||
|
}
|
||
|
|
||
|
#define G_ALLOC(s) PdhiHeapAlloc(__FILE__, __LINE__, s)
|
||
|
#define G_REALLOC(h,s) PdhiHeapReAlloc(__FILE__, __LINE__, h, s)
|
||
|
#define G_FREE(h) PdhiHeapFree(__FILE__, __LINE__, h)
|
||
|
#define G_SIZE(h) (h != NULL ? HeapSize(hPdhHeap, 0, h) : 0)
|
||
|
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
LPSTR
|
||
|
PdhiWideCharToMultiByte(
|
||
|
UINT CodePage,
|
||
|
LPWSTR wszString
|
||
|
);
|
||
|
|
||
|
LPWSTR
|
||
|
PdhiMultiByteToWideChar(
|
||
|
UINT CodePage,
|
||
|
LPSTR aszString
|
||
|
);
|
||
|
|
||
|
// Doubly-linked list manipulation routines. Implemented as macros
|
||
|
// but logically these are procedures.
|
||
|
//
|
||
|
#define InitializeListHead(ListHead) ((ListHead)->Flink = (ListHead)->Blink = (ListHead))
|
||
|
#define IsListEmpty(ListHead) ((ListHead)->Flink == (ListHead))
|
||
|
#define RemoveHeadList(ListHead) (ListHead)->Flink; \
|
||
|
{ RemoveEntryList((ListHead)->Flink) }
|
||
|
#define RemoveTailList(ListHead) (ListHead)->Blink; \
|
||
|
{ RemoveEntryList((ListHead)->Blink) }
|
||
|
#define RemoveEntryList(Entry) { PLIST_ENTRY _EX_Blink; \
|
||
|
PLIST_ENTRY _EX_Flink; \
|
||
|
_EX_Flink = (Entry)->Flink; \
|
||
|
_EX_Blink = (Entry)->Blink; \
|
||
|
_EX_Blink->Flink = _EX_Flink; \
|
||
|
_EX_Flink->Blink = _EX_Blink; \
|
||
|
}
|
||
|
#define InsertTailList(ListHead,Entry) { PLIST_ENTRY _EX_Blink; \
|
||
|
PLIST_ENTRY _EX_ListHead; \
|
||
|
_EX_ListHead = (ListHead); \
|
||
|
_EX_Blink = _EX_ListHead->Blink; \
|
||
|
(Entry)->Flink = _EX_ListHead; \
|
||
|
(Entry)->Blink = _EX_Blink; \
|
||
|
_EX_Blink->Flink = (Entry); \
|
||
|
_EX_ListHead->Blink = (Entry); \
|
||
|
}
|
||
|
#define InsertHeadList(ListHead,Entry) { PLIST_ENTRY _EX_Flink; \
|
||
|
PLIST_ENTRY _EX_ListHead; \
|
||
|
_EX_ListHead = (ListHead); \
|
||
|
_EX_Flink = _EX_ListHead->Flink; \
|
||
|
(Entry)->Flink = _EX_Flink; \
|
||
|
(Entry)->Blink = _EX_ListHead; \
|
||
|
_EX_Flink->Blink = (Entry); \
|
||
|
_EX_ListHead->Flink = (Entry); \
|
||
|
}
|
||
|
#define PopEntryList(ListHead) (ListHead)->Next; \
|
||
|
{ PSINGLE_LIST_ENTRY FirstEntry; \
|
||
|
FirstEntry = (ListHead)->Next;\
|
||
|
if (FirstEntry != NULL) { \
|
||
|
(ListHead)->Next = FirstEntry->Next; \
|
||
|
} \
|
||
|
}
|
||
|
#define PushEntryList(ListHead,Entry) (Entry)->Next = (ListHead)->Next; \
|
||
|
(ListHead)->Next = (Entry)
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // _PDHI_DEFS_H_
|