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