PLUGIN_EXPORT double Update(void* data) { MeasureData* measure = (MeasureData*)data; double value = 0; ULONGLONG longValue = GetPerfData( measure->objectName.c_str(), measure->instanceName.c_str(), measure->counterName.c_str()); if (measure->difference) { // Compare with the old value if (!measure->firstTime) { value = (double)(longValue - measure->oldValue); } measure->oldValue = longValue; measure->firstTime = false; } else { value = (double)longValue; } return value; }
//********************************************************************* // // RefreshPerfData // // Get a new set of performance data. pData should be NULL initially. // PPERF_DATA RefreshPerfData (HKEY hPerfKey, LPTSTR szObjectIndex, PPERF_DATA pData, DWORD *pDataSize) { if (GetPerfData (hPerfKey, szObjectIndex, &pData, pDataSize) == ERROR_SUCCESS) return pData; else return NULL; }
/******************************************************************************\ * * This is a part of the Microsoft Source Code Samples. * * Copyright (C) 1993-1997 Microsoft Corporation. * * All rights reserved. \******************************************************************************/ BOOL _FindAndKillProcessNT4(LPSTR aProcessName, BOOL aKillProcess) { BOOL bRv; HKEY hKey; DWORD dwType; DWORD dwSize; DWORD dwTemp; DWORD dwTitleLastIdx; DWORD dwIndex; DWORD dwLen; DWORD pDataSize = 50 * 1024; LPSTR szCounterValueName; LPSTR szTitle; LPSTR *szTitleSz; LPSTR szTitleBuffer; PPERF_DATA pData; PPERF_OBJECT pProcessObject; bRv = FALSE; hKey = NULL; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\perflib"), 0, KEY_READ, &hKey) != ERROR_SUCCESS) return(bRv); dwSize = sizeof(dwTitleLastIdx); if(RegQueryValueEx(hKey, TEXT("Last Counter"), 0, &dwType, (LPBYTE)&dwTitleLastIdx, &dwSize) != ERROR_SUCCESS) { RegCloseKey(hKey); return(bRv); } dwSize = sizeof(dwTemp); if(RegQueryValueEx(hKey, TEXT("Version"), 0, &dwType, (LPBYTE)&dwTemp, &dwSize) != ERROR_SUCCESS) { RegCloseKey(hKey); szCounterValueName = TEXT("Counters"); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\009"), 0, KEY_READ, &hKey) != ERROR_SUCCESS) return(bRv); } else { RegCloseKey(hKey); szCounterValueName = TEXT("Counter 009"); hKey = HKEY_PERFORMANCE_DATA; } // Find out the size of the data. // dwSize = 0; if(RegQueryValueEx(hKey, szCounterValueName, 0, &dwType, 0, &dwSize) != ERROR_SUCCESS) return(bRv); // Allocate memory // szTitleBuffer = (LPTSTR)LocalAlloc(LMEM_FIXED, dwSize); if(!szTitleBuffer) { RegCloseKey(hKey); return(bRv); } szTitleSz = (LPTSTR *)LocalAlloc(LPTR, (dwTitleLastIdx + 1) * sizeof(LPTSTR)); if(!szTitleSz) { if(szTitleBuffer != NULL) { LocalFree(szTitleBuffer); szTitleBuffer = NULL; } RegCloseKey(hKey); return(bRv); } // Query the data // if(RegQueryValueEx(hKey, szCounterValueName, 0, &dwType, (BYTE *)szTitleBuffer, &dwSize) != ERROR_SUCCESS) { RegCloseKey(hKey); if(szTitleSz) LocalFree(szTitleSz); if(szTitleBuffer) LocalFree(szTitleBuffer); return(bRv); } // Setup the TitleSz array of pointers to point to beginning of each title string. // TitleBuffer is type REG_MULTI_SZ. // szTitle = szTitleBuffer; while(dwLen = lstrlen(szTitle)) { dwIndex = atoi(szTitle); szTitle = szTitle + dwLen + 1; if(dwIndex <= dwTitleLastIdx) szTitleSz[dwIndex] = szTitle; szTitle = szTitle + lstrlen(szTitle) + 1; } PX_PROCESS = GetTitleIdx (NULL, szTitleSz, dwTitleLastIdx, PN_PROCESS); PX_PROCESS_ID = GetTitleIdx (NULL, szTitleSz, dwTitleLastIdx, PN_PROCESS_ID); PX_THREAD = GetTitleIdx (NULL, szTitleSz, dwTitleLastIdx, PN_THREAD); wsprintf(INDEX_PROCTHRD_OBJ, TEXT("%ld %ld"), PX_PROCESS, PX_THREAD); pData = NULL; if(GetPerfData(HKEY_PERFORMANCE_DATA, INDEX_PROCTHRD_OBJ, &pData, &pDataSize) == ERROR_SUCCESS) { PPERF_INSTANCE pInst; DWORD i = 0; pProcessObject = FindObject(pData, PX_PROCESS); if(pProcessObject) { LPSTR szPtrStr; int iLen; char szProcessNamePruned[MAX_BUF]; char szNewProcessName[MAX_BUF]; if(sizeof(szProcessNamePruned) < (lstrlen(aProcessName) + 1)) { if(hKey) RegCloseKey(hKey); if(szTitleSz) LocalFree(szTitleSz); if(szTitleBuffer) LocalFree(szTitleBuffer); return(bRv); } /* look for .exe and remove from end of string because the Process names * under NT are returned without the extension */ lstrcpy(szProcessNamePruned, aProcessName); iLen = lstrlen(szProcessNamePruned); szPtrStr = &szProcessNamePruned[iLen - 4]; if((lstrcmpi(szPtrStr, ".exe") == 0) || (lstrcmpi(szPtrStr, ".dll") == 0)) *szPtrStr = '\0'; pInst = FirstInstance(pProcessObject); for(i = 0; i < (DWORD)(pProcessObject->NumInstances); i++) { *szNewProcessName = '\0'; if(WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)((PCHAR)pInst + pInst->NameOffset), -1, szNewProcessName, MAX_BUF, NULL, NULL) != 0) { if(lstrcmpi(szNewProcessName, szProcessNamePruned) == 0) { if(aKillProcess) KillProcess(aProcessName, NULL, PX_PROCESS_ID); bRv = TRUE; break; } } pInst = NextInstance(pInst); } } } if(hKey) RegCloseKey(hKey); if(szTitleSz) LocalFree(szTitleSz); if(szTitleBuffer) LocalFree(szTitleBuffer); return(bRv); }