nsresult WinProcMon::QuerySystemLoad(float* load_percent) { *load_percent = 0; if (mQuery == 0) { return NS_ERROR_FAILURE; } // Update all counters associated with this query object. PDH_STATUS status = PdhCollectQueryData(mQuery); if (status != ERROR_SUCCESS) { LOG(("PdhCollectQueryData error = %X", status)); return NS_ERROR_FAILURE; } PDH_FMT_COUNTERVALUE counter; // maximum is 100% regardless of CPU core count. status = PdhGetFormattedCounterValue( mCounter, PDH_FMT_DOUBLE, (LPDWORD)NULL, &counter); if (ERROR_SUCCESS != status || // There are multiple success return values. !IsSuccessSeverity(counter.CStatus)) { LOG(("PdhGetFormattedCounterValue error")); return NS_ERROR_FAILURE; } // The result is a percent value, reduce to match expected scale. *load_percent = (float)(counter.doubleValue / 100.0f); return NS_OK; }
double PdhiCalcAverage ( PPDH_RAW_COUNTER pThisValue, PPDH_RAW_COUNTER pLastValue, LONGLONG *pllTimeBase, LPDWORD pdwStatus ) { LONGLONG llNumDiff; LONGLONG llDenDiff; double dNum; double dDen; double dReturn = 0.0f; DWORD dwStatus = PDH_CSTATUS_VALID_DATA; // test access to the required second parameter (lastValue) __try { if (IsSuccessSeverity(pLastValue->CStatus)) { llDenDiff = pThisValue->SecondValue - pLastValue->SecondValue; } else { dwStatus = pLastValue->CStatus; } } __except (EXCEPTION_EXECUTE_HANDLER) { dwStatus = PDH_INVALID_ARGUMENT; } if (dwStatus == PDH_CSTATUS_VALID_DATA) { if ((llDenDiff > 0) && (*pllTimeBase > 0)) { llNumDiff = pThisValue->FirstValue - pLastValue->FirstValue; dNum = (double)llNumDiff / (double)*pllTimeBase; dDen = (double)llDenDiff; dReturn = (dNum / dDen); } else { if (llDenDiff < 0) { dwStatus = PDH_CALC_NEGATIVE_DENOMINATOR; } else if (*pllTimeBase < 0) { dwStatus = PDH_CALC_NEGATIVE_TIMEBASE; } } } if (pdwStatus != NULL) { *pdwStatus = dwStatus; } return dReturn; }
double PdhiCalcInverseTimer ( PPDH_RAW_COUNTER pThisValue, PPDH_RAW_COUNTER pLastValue, LONGLONG *pllTimeBase, LPDWORD pdwStatus ) { LONGLONG llNumDiff; LONGLONG llDenDiff; double dReturn; DWORD dwStatus = PDH_CSTATUS_VALID_DATA; // test access to the required second parameter (lastValue) __try { if (IsSuccessSeverity(pLastValue->CStatus)) { llDenDiff = pThisValue->SecondValue - pLastValue->SecondValue; } else { dwStatus = pLastValue->CStatus; } } __except (EXCEPTION_EXECUTE_HANDLER) { dwStatus = PDH_INVALID_ARGUMENT; } if (dwStatus == PDH_CSTATUS_VALID_DATA) { if (llDenDiff > 0) { llNumDiff = pThisValue->FirstValue - pLastValue->FirstValue; dReturn = (double)pThisValue->MultiCount - ((double)llNumDiff / (double)llDenDiff); } else { if (llDenDiff < 0) { dwStatus = PDH_CALC_NEGATIVE_DENOMINATOR; } dReturn = (double)0.0; } } if (pdwStatus != NULL) { *pdwStatus = dwStatus; } return dReturn; }