fcamuso

Corso Sistemi Operativi: leggere PCB, programma che legge il PCB (x Windows)

Aug 23rd, 2026
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <tchar.h>
  4. #include <psapi.h>
  5. #include <thread>
  6. #include <chrono>
  7.  
  8.  
  9. using namespace std;
  10.  
  11. void PrintMemoryInfo(DWORD processID)
  12. {
  13.     HANDLE hProcess;
  14.     PROCESS_MEMORY_COUNTERS pmc;
  15.  
  16.     //descrizione completa dei campi della struttura a questo link:
  17.     //https://learn.microsoft.com/en-us/windows/win32/api/psapi/ns-psapi-process_memory_counters
  18.  
  19.     cout << "\nID Processo: " << processID << endl;
  20.  
  21.     //agganciamo con un handle il processo
  22.     hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
  23.         PROCESS_VM_READ,
  24.         FALSE, processID);
  25.  
  26.     if (hProcess == NULL)
  27.         return;
  28.  
  29.     //inseriamo tutti i contatori nella struct pmc
  30.     //e stampiamone alcuni
  31.     if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)))
  32.     {
  33.         cout << "Contatore di Page Fault: " << pmc.PageFaultCount << endl;
  34.         cout << "Dimensione del Working Set: " << pmc.WorkingSetSize << endl;
  35.         cout << "Picco dimensione del Working Set: " << pmc.PeakWorkingSetSize << endl;
  36.         cout << "Picco di utilizzo per Paged Pool: " << pmc.QuotaPeakPagedPoolUsage << endl;
  37.     }
  38.  
  39.     CloseHandle(hProcess);
  40. }
  41.  
  42. int PrintModules(DWORD processID)
  43. {
  44.     HMODULE hMods[1024];
  45.     HANDLE hProcess;
  46.     DWORD cbNeeded;
  47.  
  48.  
  49.     cout << "\n\n\nELENCO MODULI\n";
  50.     hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
  51.         PROCESS_VM_READ,
  52.         FALSE, processID);
  53.     if (NULL == hProcess)
  54.         return 1;
  55.  
  56.     // Richiediamo una lista di tutti i moduli (exe, dll) usati dal processo.
  57.     if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
  58.     {
  59.         //per ogni modulo hMods[i]
  60.         for (int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
  61.         {
  62.             TCHAR szModName[MAX_PATH];
  63.  
  64.             //full path del modulo
  65.             if (GetModuleFileNameEx(hProcess, hMods[i], szModName,
  66.                 sizeof(szModName) / sizeof(TCHAR)))
  67.             {
  68.                 // nome e handle di questo modulo
  69.                 wcout << szModName << " " << hMods[i] << endl;
  70.             }
  71.         }
  72.     }
  73.     else
  74.         cout << "trovato nulla!\n";
  75.  
  76.     CloseHandle(hProcess);
  77.  
  78.     return 0;
  79. }
  80.  
  81. int main()
  82. {
  83.  
  84.     STARTUPINFO si;
  85.     PROCESS_INFORMATION pi;
  86.  
  87.     ZeroMemory(&si, sizeof(si));
  88.     si.cb = sizeof(si);
  89.     ZeroMemory(&pi, sizeof(pi));
  90.  
  91.  
  92.     wchar_t command_line[] = L"due_thread.exe";
  93.  
  94.  
  95.     //descrizione che apparirà nella finestra del titolo
  96.     si.lpTitle = const_cast<LPWSTR>(L"test pcb info");
  97.     if (!CreateProcess(
  98.         NULL,         //lpApplicationName
  99.         command_line, //lpCommandLine
  100.         NULL,         //lpProcessAttributes
  101.         NULL,         //lpThreadAttributes
  102.         FALSE,        //bInheritHandles
  103.         CREATE_NEW_CONSOLE,            //dwCreationFlags
  104.         NULL,         //lpEnvironment
  105.         NULL,         //lpCurrentDirectory
  106.         &si,          //lpStartupInfo
  107.         &pi)         //lpProcessInformation
  108.         )
  109.     {
  110.         cout << "CreateProcess ha fallito. errore: " << GetLastError() << endl;
  111.         return 2;
  112.     }
  113.  
  114.     this_thread::sleep_for(chrono::milliseconds(50));
  115.     PrintMemoryInfo(pi.dwProcessId);
  116.     PrintModules(pi.dwProcessId);
  117.  
  118.     // Metti in attesa il processo di esecuzione di questo programma
  119.     // fino al completamento di quello creato
  120.     WaitForSingleObject(pi.hProcess, INFINITE);
  121.  
  122.     // Rilasciamo le risorse attivate per la creazione
  123.     CloseHandle(pi.hProcess);
  124.     CloseHandle(pi.hThread);
  125.  
  126.     cout << "\n\nIl controllo e` tornato al processo principale!" << endl;
  127.     return 0;
  128. }
  129.  
Advertisement
Add Comment
Please, Sign In to add comment