ua ru

IAPT

Головна » Програмне забезпечення » С++: Функція для підрахунку процесів

С++: Функція для підрахунку процесів

С++: Функція для підрахунку процесів

Дана стаття розповідає про роботу з процесами, модулями, компонентами і потоками за допомогою біліотеки TOOLHELP. Робота з процесами - основа, без якої займатися системним програмуванням так само безглуздо, як без знання структури PE-файлів або організації пам'яті. Тому я піднімаю цю тему знов і розповім про роботу з процесами за допомогою функцій TOOLHELP. Мова програмування: я вибрав C з багатьох причин і в першу чергу із-за його нізкоуровнего взаємодії з пам'яттю. Перерахувати запущені в системі процеси можна по-різному, я звик користуватися функціями TOOLHELP. Загальна послідовність дій при роботі з цією бібліотекою: робимо знімок (Snapshot) системної інформації, яка нам необхідна, потім бігаємо по процесах, а також модулям.

Тому почнемо з простого - перерахуємо всі процеси.    //Перерахування процесів    int EnumerateProcs(void){    //створюємо "знімок" інформації про процеси    //перший параметр функції - константа, що визначає    //яку інформацію нам потрібно "зняти", а другою -     //ідентифікатор процесу, до якого відноситься ця    //інформація. В даному випадку це 0 оскільки ми робимо    //знімок всіх процесів    HANDLE pSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    bool bIsok = false;    //Структура, в яку будуть записані дані процесу    PROCESSENTRY32 ProcEntry;    //встановимо її розмір, це необхідна дія    ProcEntry.dwSize = sizeof(ProcEntry);    //тепер визначимо перший процес    //перший параметр функції - хендл "знімка" інформації    //другою - адреса структури PROCESSENTRY32    //true - у разі успіху, false - у разі невдачі    bIsok = Process32First(pSnap &ProcEntry);        //тут можна було вставити розкішний цикл for(....)

Але це    //не зовсім легко для читання    //отже цикл while    while(bIsok)        //друкуємо ім'я процесу, його ідентифікатор    //тепер, коли у нас є структура ProcEntry    //То, яку інформацію ви з неї візьмете, залежить    //тільки від завдання ))    printf("%s  %un", ProcEntry.szExeFile, ProcEntry.th32ProcessID);    bIsok = Process32Next(pSnap &ProcEntry);        //чистимо пам'ять!    CloseHandle(pSnap);    return 1;} У адресному просторі кожного процесу (в області пам'яті, виділеною йому системою) знаходяться різні бібліотеки, які, власне, складають додаток.