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.
 
 
 
 
 
 

1002 lines
25 KiB

/*++
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_