Часть полного текста документа:Работа с процессами в С/С++. Основные приемы Тимур Хабибуллин Данная статья рассказывает о работе с процессами, модулями, кучами и потоками при помощи билиотеки 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) { //Входной параметр - идентификатор процесса, чьи модули мы собираемся //перечислять. Во первых создадим snapshot информации о модулях //теперь нам нужна информация о конкретном процессе - процессе //с идентификатором PID HANDLE pMdlSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID); bool bIsok = false; //структура с информацией о модуле MODULEENTRY32 MdlEntry; //зададим размер MdlEntry.dwSize = sizeof(MODULEENTRY32); //и найдем первый модуль bIsok = Module32First(pMdlSnap, &MdlEntry); //и далее, как и с процессами while(bIsok) { //печатаем имя модуля printf(" %s n", MdlEntry.szModule); //и переходим к следующему bIsok = Module32Next(pMdlSnap, &MdlEntry); } //чистим память! CloseHandle(pMdlSnap); return 1; } А теперь немного притормозим и посмотрим, какую еще информацию о процессах и модулях мы получаем: typedef struct tagPROCESSENTRY32 { DWORD dwSize; //Рамер структуры DWORD cntUsage; //Число ссылк на процесс. ............ |