#include #include #include #include #include #include #include "pdhidef.h" #include "log_bin.h" #include "log_wmi.h" #include "log_text.h" #include "log_sql.h" #include "strings.h" #include "pdhmsg.h" BOOL __stdcall IsValidLogHandle ( IN HLOG hLog ); PDH_FUNCTION PdhiWriteRelogRecord( IN PPDHI_LOG pLog, IN SYSTEMTIME *st ) { PDH_STATUS pdhStatus = ERROR_SUCCESS; LPWSTR szUserString = NULL; pdhStatus = WAIT_FOR_AND_LOCK_MUTEX (pLog->hLogMutex); if (pdhStatus == ERROR_SUCCESS) { switch (LOWORD(pLog->dwLogFormat)) { case PDH_LOG_TYPE_CSV: case PDH_LOG_TYPE_TSV: pdhStatus =PdhiWriteTextLogRecord ( pLog, st, (LPCWSTR)szUserString); break; case PDH_LOG_TYPE_RETIRED_BIN: pdhStatus =PdhiWriteBinaryLogRecord ( pLog, st, (LPCWSTR)szUserString); break; case PDH_LOG_TYPE_BINARY: pdhStatus = PdhiWriteWmiLogRecord( pLog, st, (LPCWSTR) szUserString); break; case PDH_LOG_TYPE_SQL: pdhStatus =PdhiWriteSQLLogRecord ( pLog, st, (LPCWSTR)szUserString); break; case PDH_LOG_TYPE_PERFMON: default: pdhStatus = PDH_UNKNOWN_LOG_FORMAT; break; } RELEASE_MUTEX (pLog->hLogMutex); } return pdhStatus; } PDH_FUNCTION PdhRelogA( HLOG hLogIn, PPDH_RELOG_INFO_A pRelogInfo ) { HRESULT hr; PDH_RELOG_INFO_W RelogInfo; memcpy( &RelogInfo, pRelogInfo, sizeof(PDH_RELOG_INFO_A) ); RelogInfo.strLog = NULL; if( NULL != pRelogInfo->strLog ){ RelogInfo.strLog = (LPWSTR)G_ALLOC( (strlen(pRelogInfo->strLog)+1) * sizeof(WCHAR) ); if( RelogInfo.strLog ){ mbstowcs( RelogInfo.strLog, pRelogInfo->strLog, (strlen(pRelogInfo->strLog)+1) ); } } hr = PdhRelogW( hLogIn, &RelogInfo ); G_FREE( RelogInfo.strLog ); return hr; } PDH_FUNCTION PdhRelogW( HLOG hLogIn, PPDH_RELOG_INFO_W pRelogInfo ) { PDH_STATUS pdhStatus = ERROR_SUCCESS; HLOG hLogOut; PPDHI_LOG pLogIn; PPDHI_LOG pLogOut; SYSTEMTIME ut; FILETIME lt; ULONG nSampleCount = 0; ULONG nSamplesWritten = 0; if( IsValidLogHandle(hLogIn) ){ HCOUNTER hCounter; HQUERY hQuery; ULONG nRecordSkip; pLogIn = (PPDHI_LOG)hLogIn; pdhStatus = PdhOpenLogW( pRelogInfo->strLog, pRelogInfo->dwFlags, &pRelogInfo->dwFileFormat, (HQUERY)pLogIn->pQuery, 0, NULL, &hLogOut ); if( pdhStatus == ERROR_SUCCESS ){ DWORD dwNumEntries = 1; DWORD dwBufferSize = sizeof(PDH_TIME_INFO); PDH_TIME_INFO TimeInfo; ZeroMemory( &TimeInfo, sizeof( PDH_TIME_INFO ) ); pLogOut= (PPDHI_LOG)hLogOut; hQuery = (HQUERY)(pLogIn->pQuery); pdhStatus = PdhGetDataSourceTimeRangeH ( hLogIn, &dwNumEntries, &TimeInfo, &dwBufferSize ); if( pRelogInfo->TimeInfo.StartTime == 0 || pRelogInfo->TimeInfo.StartTime < TimeInfo.StartTime ){ pLogIn->pQuery->TimeRange.StartTime = TimeInfo.StartTime; pRelogInfo->TimeInfo.StartTime = TimeInfo.StartTime; }else{ pLogIn->pQuery->TimeRange.StartTime = pRelogInfo->TimeInfo.StartTime; } if( pRelogInfo->TimeInfo.EndTime == 0 || pRelogInfo->TimeInfo.EndTime > TimeInfo.EndTime ){ pLogIn->pQuery->TimeRange.EndTime = TimeInfo.EndTime; pRelogInfo->TimeInfo.EndTime = TimeInfo.EndTime; }else{ pLogIn->pQuery->TimeRange.EndTime = pRelogInfo->TimeInfo.EndTime; } nRecordSkip = pRelogInfo->TimeInfo.SampleCount >= 1 ? pRelogInfo->TimeInfo.SampleCount : 1; while( ERROR_SUCCESS == pdhStatus ){ pdhStatus = PdhiCollectQueryData( (PPDHI_QUERY)hQuery, (LONGLONG *)<); FileTimeToSystemTime (<, &ut); if( nSampleCount++ % nRecordSkip ){ continue; } if( ERROR_SUCCESS == pdhStatus ){ pdhStatus = PdhiWriteRelogRecord( pLogOut, &ut ); nSamplesWritten++; } else if (PDH_NO_DATA == pdhStatus) { // Reset pdhStatus. PDH_NO_DATA means that there are no new counter data // for collected counters. Skip current record and continue. // pdhStatus = ERROR_SUCCESS; } } // // Check for valid exit status codes // if( PDH_NO_MORE_DATA == pdhStatus ){ pdhStatus = ERROR_SUCCESS; } if( ERROR_SUCCESS == pdhStatus ){ pdhStatus = PdhCloseLog( hLogOut, 0 ); }else{ PdhCloseLog( hLogOut, 0 ); } ((PPDHI_QUERY)hQuery)->hOutLog = NULL; } }else{ pdhStatus = PDH_INVALID_HANDLE; } pRelogInfo->TimeInfo.SampleCount = nSamplesWritten; return pdhStatus; }