Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <iostream>
- #include <tchar.h>
- #include <psapi.h>
- #include <thread>
- #include <chrono>
- using namespace std;
- void PrintMemoryInfo(DWORD processID)
- {
- HANDLE hProcess;
- PROCESS_MEMORY_COUNTERS pmc;
- //descrizione completa dei campi della struttura a questo link:
- //https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-process_memory_counters
- cout << "\nID Processo: " << processID << endl;
- //agganciamo con un handle il processo
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
- PROCESS_VM_READ,
- FALSE, processID);
- if (hProcess == NULL)
- return;
- //inseriamo tutti i contatori nella struct pmc
- //e stampiamone alcuni
- if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)))
- {
- cout << "Contatore di Page Fault: " << pmc.PageFaultCount << endl;
- cout << "Dimensione del Working Set: " << pmc.WorkingSetSize << endl;
- cout << "Picco dimensione del Working Set: " << pmc.PeakWorkingSetSize << endl;
- cout << "Picco di utilizzo per Paged Pool: " << pmc.QuotaPeakPagedPoolUsage << endl;
- }
- CloseHandle(hProcess);
- }
- int PrintModules(DWORD processID)
- {
- HMODULE hMods[1024];
- HANDLE hProcess;
- DWORD cbNeeded;
- cout << "\n\n\nELENCO MODULI\n";
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
- PROCESS_VM_READ,
- FALSE, processID);
- if (NULL == hProcess)
- return 1;
- // Richiediamo una lista di tutti i moduli (exe, dll) usati dal processo.
- if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
- {
- //per ogni modulo hMods[i]
- for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
- {
- TCHAR szModName[MAX_PATH];
- //full path del modulo
- if (GetModuleFileNameEx(hProcess, hMods[i], szModName,
- sizeof(szModName) / sizeof(TCHAR)))
- {
- // nome e handle di questo modulo
- wcout << szModName << " " << hMods[i] << endl;
- }
- }
- }
- else
- cout << "trovato nulla!\n";
- CloseHandle(hProcess);
- return 0;
- }
- int main()
- {
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
- ZeroMemory(&pi, sizeof(pi));
- wchar_t command_line[] = L"due_thread.exe";
- //descrizione che apparirà nella finestra del titolo
- si.lpTitle = const_cast<LPWSTR>(L"test pcb info");
- if (!CreateProcess(
- NULL, //lpApplicationName
- command_line, //lpCommandLine
- NULL, //lpProcessAttributes
- NULL, //lpThreadAttributes
- FALSE, //bInheritHandles
- CREATE_NEW_CONSOLE, //dwCreationFlags
- NULL, //lpEnvironment
- NULL, //lpCurrentDirectory
- &si, //lpStartupInfo
- &pi) //lpProcessInformation
- )
- {
- cout << "CreateProcess ha fallito. errore: " << GetLastError() << endl;
- return 2;
- }
- this_thread::sleep_for(chrono::milliseconds(50));
- PrintMemoryInfo(pi.dwProcessId);
- PrintModules(pi.dwProcessId);
- // Metti in attesa il processo di esecuzione di questo programma
- // fino al completamento di quello creato
- WaitForSingleObject(pi.hProcess, INFINITE);
- // Rilasciamo le risorse attivate per la creazione
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- cout << "\n\nIl controllo e` tornato al processo principale!" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment