LONGLONG CCpuUsage::CPerfCounters::GetCounterValue(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex, DWORD dwCounterIndex, LPCTSTR pInstanceName) { QueryPerformanceData(pPerfData, dwObjectIndex, dwCounterIndex); PPERF_OBJECT_TYPE pPerfObj = NULL; LONGLONG lnValue = {0}; // Get the first object type. pPerfObj = FirstObject( *pPerfData ); // Look for the given object index for( DWORD i=0; i < (*pPerfData)->NumObjectTypes; i++ ) { if (pPerfObj->ObjectNameTitleIndex == dwObjectIndex) { lnValue = GetCounterValue(pPerfObj, dwCounterIndex, pInstanceName); break; } pPerfObj = NextObject( pPerfObj ); } return lnValue; }
HRESULT KProcessPerfMgr::Update() { DWORD nBufSize = m_nPerfDataSize; while( RegQueryValueEx( HKEY_PERFORMANCE_DATA, L"232", NULL, NULL, (LPBYTE) m_PerfData, &nBufSize ) == ERROR_MORE_DATA ) { // Get a buffer that is big enough. m_nPerfDataSize += BYTEINCREMENT; if (m_PerfData) { delete [] m_PerfData; m_PerfData = 0; } m_PerfData = (PPERF_DATA_BLOCK) new BYTE[ m_nPerfDataSize ]; if (!m_PerfData) break; } if (m_PerfData) { // Get the first object type. PPERF_OBJECT_TYPE PerfObj = FirstObject( m_PerfData ); UpdatePerfData(PerfObj); } return S_OK; }
TInt CWsObjectIx::Count() const { const TWsObject* ptr=FirstObject(); const TWsObject* end=ptr+iObjectArray.Count(); WS_ASSERT_DEBUG(ptr->iObject==NULL, EWsPanicObjectIndexError); TInt count=0; while(++ptr<end) { if (ptr->iObject && ptr->iObject->Type()!=WS_HANDLE_CLIENT) count++; } return(count); }
TInt CWsObjectIx::At(const CWsObject* anObj) { const TWsObject* base=FirstObject(); const TWsObject* ptr=base; const TWsObject* end=base+iObjectArray.Count(); WS_ASSERT_DEBUG(ptr->iObject==NULL, EWsPanicObjectIndexError); while(++ptr<end) { if (ptr->iObject==anObj && (ptr->iHandle&TWsObject::ETypeMask)==(TUint)anObj->Type()) return(ptr-base); } return(KErrNotFound); }
void CWsObjectIx::Remove(CWsObject* anObj) { const TWsObject* ptr=FirstObject(); const TWsObject* end=ptr+iObjectArray.Count(); WS_ASSERT_DEBUG(ptr->iObject==NULL, EWsPanicObjectIndexError); while(++ptr<end) { if (ptr->iObject==anObj) { Remove(ptr); Tidy(); return; } } }
//********************************************************************* // // FindObject // // Returns pointer to object with TitleIndex. If not found, NULL // is returned. // PPERF_OBJECT FindObject (PPERF_DATA pData, DWORD TitleIndex) { PPERF_OBJECT pObject; DWORD i = 0; if (pObject = FirstObject (pData)) while (i < pData->NumObjectTypes) { if (pObject->ObjectNameTitleIndex == TitleIndex) return pObject; pObject = NextObject (pObject); i++; } return NULL; }
static int HostStatsFetchData(void) { DWORD o; PPERF_OBJECT_TYPE objPtr = NULL; DWORD res; DWORD oldBufferSize = BufferSize; const char * qstr; qstr = LEVEL1_QUERY_STRING; while ((res = RegQueryValueEx(HKEY_PERFORMANCE_DATA, qstr, NULL, NULL, (LPBYTE)PerfData, &BufferSize)) == ERROR_MORE_DATA) { oldBufferSize += 4096; BufferSize = oldBufferSize; PerfData = (PPERF_DATA_BLOCK)realloc(PerfData, BufferSize); } if (res != ERROR_SUCCESS) { fprintf(stderr, "Can't get Windows performance data. RegQueryValueEx returned %ld, errorno \"%d\"\n", GetLastError(), res); return -1; } #ifdef NTDBG fprintf(stderr, "buffersize is %ld\n", BufferSize); fflush(stderr); #endif ProcessObj = NULL; ProcessorObj = NULL; MemoryObj = NULL; SystemObj = NULL; ObjectsObj = NULL; objPtr = FirstObject(PerfData); for (o=0; o < PerfData->NumObjectTypes; o++) { #ifdef NTDBG fprintf(stderr, "Object %ld\n", objPtr->ObjectNameTitleIndex); fflush(stderr); #endif switch (objPtr->ObjectNameTitleIndex) { case PROCESS_OBJ_ID: ProcessObj = objPtr; break; case PROCESSOR_OBJ_ID: ProcessorObj = objPtr; break; case MEMORY_OBJ_ID: MemoryObj = objPtr; break; case SYSTEM_OBJ_ID: SystemObj = objPtr; break; case OBJECTS_OBJ_ID: ObjectsObj = objPtr; break; case NETWORK_OBJ_ID: NetworkObj = objPtr; break; case UDP_OBJ_ID: UdpObj = objPtr; break; } objPtr = NextObject(objPtr); } if ( ProcessObj == NULL || ProcessorObj == NULL || MemoryObj == NULL || SystemObj == NULL || ObjectsObj == NULL || NetworkObj == NULL || UdpObj == NULL ) { return -1; } loadProcessData(); loadProcessorData(); loadSystemData(); loadMemoryData(); loadObjectData(); loadUdpData(); loadCpuData(); loadNetworkData(); return 0; }
void GetProcessID(LPCTSTR pProcessName, std::vector<DWORD>& SetOfPID) { PPERF_DATA_BLOCK pPerfData = NULL; PPERF_OBJECT_TYPE pPerfObj; PPERF_INSTANCE_DEFINITION pPerfInst; PPERF_COUNTER_DEFINITION pPerfCntr, pCurCntr; PPERF_COUNTER_BLOCK PtrToCntr; DWORD BufferSize = TOTALBYTES; DWORD i, j; LONG k; // Allocate the buffer for the performance data. pPerfData = (PPERF_DATA_BLOCK)malloc(BufferSize); wchar_t szKey[32]; swprintf_s(szKey, L"%d %d", PROCESS_OBJECT_INDEX, PROC_ID_COUNTER); LONG lRes; while ((lRes = RegQueryValueEx(HKEY_PERFORMANCE_DATA, szKey, NULL, NULL, (LPBYTE)pPerfData, &BufferSize)) == ERROR_MORE_DATA) { // Get a buffer that is big enough. BufferSize += BYTEINCREMENT; pPerfData = (PPERF_DATA_BLOCK)realloc(pPerfData, BufferSize); } // Get the first object type. pPerfObj = FirstObject(pPerfData); // Process all objects. for (i = 0; i < pPerfData->NumObjectTypes; i++) { if (pPerfObj->ObjectNameTitleIndex != PROCESS_OBJECT_INDEX) { pPerfObj = NextObject(pPerfObj); continue; } SetOfPID.clear(); // Get the first counter. pPerfCntr = FirstCounter(pPerfObj); // Get the first instance. pPerfInst = FirstInstance(pPerfObj); _bstr_t bstrProcessName, bstrInput; // Retrieve all instances. for (k = 0; k < pPerfObj->NumInstances; k++) { pCurCntr = pPerfCntr; bstrInput = pProcessName; bstrProcessName = (wchar_t *)((PBYTE)pPerfInst + pPerfInst->NameOffset); if (!_wcsicmp((LPCTSTR)bstrProcessName, (LPCTSTR)bstrInput)) { // Retrieve all counters. for (j = 0; j < pPerfObj->NumCounters; j++) { if (pCurCntr->CounterNameTitleIndex == PROC_ID_COUNTER) { PtrToCntr = CounterBlock(pPerfInst); DWORD *pdwValue = (DWORD*)((LPBYTE)PtrToCntr + pCurCntr->CounterOffset); SetOfPID.push_back(*pdwValue); break; } // Get the next counter. pCurCntr = NextCounter(pCurCntr); } } // Get the next instance. pPerfInst = NextInstance(pPerfInst); } } free(pPerfData); RegCloseKey(HKEY_PERFORMANCE_DATA); }