Название: | Работа с процессами в С/С++. Основные приемы |
Просмотров: | 61 |
Раздел: | Информатика, программирование |
Ссылка: | none(0 KB) |
Описание: | Работа с процессами. Основные приемы. Данная статья рассказывает о работе с процессами, модулями, кучами и потоками при помощи билиотеки TOOLHELP Процессы, потоки, модули, кучи, toolhelp, tlhelp. |
|
Часть полного текста документа:Работа с процессами в С/С++. Основные приемы Тимур Хабибуллин Данная статья рассказывает о работе с процессами, модулями, кучами и потоками при помощи билиотеки 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; } Вуаля, список всех процессов, аки в диспетчере задач. Теперь мы сделаем кое-что, чего в диспетчере нет! В адресном пространстве каждого процесса (в области памяти, выделенной ему системой) находятся различные библиотеки, которые, собственно, состовляют ПРИЛОЖЕНИЕ. Это и Kernel32 и GDI и еще множество различных. Наша задача - их все пересчитать и переписать! Для этого действа напишем небольшую функцию. //Перечисление модулей процесса int EnumerateModules(DWORD PID) { //Входной параметр - идентификатор процесса, чьи модули мы собираемся //перечислять. ............ |