+unsigned int getMemoryInfo(DWORD processID)\r
+{\r
+ unsigned int memInfo = 0;\r
+ HANDLE hProcess;\r
+ PROCESS_MEMORY_COUNTERS_EX pmc;\r
+\r
+ hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |\r
+ PROCESS_VM_READ,\r
+ FALSE, processID );\r
+ if (NULL == hProcess)\r
+ return 0;\r
+\r
+ if (GetProcessMemoryInfo( hProcess, (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc))) {\r
+ memInfo = (pmc.PrivateUsage);\r
+ }\r
+\r
+ CloseHandle( hProcess );\r
+ return memInfo;\r
+}\r
+\r
+void printProcessInfo(DWORD processID)\r
+{\r
+ TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");\r
+ \r
+ // Get a handle to the process.\r
+ HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |\r
+ PROCESS_VM_READ,\r
+ FALSE, processID );\r
+\r
+ // Get the process name.\r
+ if (NULL != hProcess) {\r
+ HMODULE hMod; // An array that receives the list of module handles.\r
+ DWORD cbNeeded; //The number of bytes required to store all module handles in the Module array\r
+\r
+ if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) {\r
+ GetModuleBaseName(hProcess, hMod, szProcessName, \r
+ sizeof(szProcessName)/sizeof(TCHAR));\r
+ }\r
+ }\r
+\r
+ // Print the process name and identifier of matching strings, ignoring case\r
+ _tprintf(TEXT("%s (PID: %u)\n"), szProcessName, processID);\r
+ \r
+ // Release the handle to the process.\r
+ CloseHandle( hProcess );\r
+}\r
+\r
+int evalProcesses(HANDLE hProcess)\r
+{\r
+ if (NULL == hProcess)\r
+ return 0;\r
+\r
+ unsigned int totalMemUsage = 0;\r
+ DWORD processID = GetProcessId(hProcess);\r
+ \r
+ HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\r
+\r
+ PROCESSENTRY32 processEntry = { 0 };\r
+ processEntry.dwSize = sizeof(PROCESSENTRY32);\r
+\r
+ // Retrieves information about the first process encountered in a system snapshot\r
+ if(Process32First(hProcessSnapshot, &processEntry)) {\r
+ do {\r
+ // if th32processID = processID, we are the parent process! \r
+ // if th32ParentProcessID = processID, we are a child process!\r
+ if ((processEntry.th32ProcessID == processID) || (processEntry.th32ParentProcessID == processID)) {\r
+ unsigned int procMemUsage = 0;\r
+ // Record parent process memory\r
+ procMemUsage = getMemoryInfo(processEntry.th32ProcessID);\r
+ totalMemUsage += procMemUsage;\r
+ }\r
+ // Retrieves information about the next process recorded in a system snapshot. \r
+ } while(Process32Next(hProcessSnapshot, &processEntry));\r
+ }\r
+\r
+ CloseHandle(hProcessSnapshot);\r
+ return totalMemUsage;\r
+}\r
+\r
+\r