C/C++: Пишем процесс-менеджер

Николай "G" Андреев

Xakep, номер #056, стр. 056-076-1


(gorlum@real.xakep.ru)

Процесс... Как много в этом звуке... Я еще помню времена, когда у меня стоял Windows 95, и на компьютере творился сплошной хаос. Стоило зависнуть одной программе, как сразу вылетали все форточки. Стандартный таскменеджер не просто не справлялся с работой, он сам порой являлся причиной сбоя. Тогда-то я и задумался о том, как бы получить над системой больше власти. Облазив кучу ресурсов в инете и не найдя ничего путного, я понял, что надо писать свой менеджер, имеющий больше возможностей, чем обычный, и самое главное – стабильно работающий. И я его написал, причем пользуюсь им по сей день. А вот как он был создан - этим я поделюсь с тобой в этой статье.

Мы научимся не только перечислять и выводить на экран все запущенные на данный момент процессы, но и по-разному манипулировать ими. Научимся "завершать задачу", менять приоритет процесса, его свойства и получать о нем любую информацию. Все эти навыки могут очень пригодиться при написании программ под windows.

Кодим

Сразу к делу. Сначала создадим форму и кинем на нее объект ListBox и объект Button. В листбокс запишем все текущие процессы, а кнопочка Button даст нам возможность убивать эти процессы. В коде мы создадим соответствующую оконную процедуру для обработки сообщений (например, сообщения о нажатии клавиши). Как это сделать, я не буду здесь описывать, просто загляни в майский выпуск твоего любимого журнала :).

Способов перечислить процессы много. В Windows NT 4.0, например, доступен только один - воспользоваться функцией EnumProcesses из набора Process Status Application Programming Interface (в простонародье PSAPI). Он также доступен и в старших НТях, а в 9x - нет, так что, хотя этот способ и очень удобен, он, увы, отпадает. Есть способ порыться в реестре, в скрытом разделе HKEY_PERFOMANCE_DATA, но он также отпадает из-за сложности реализации. На наше счастье, яйцеголовые из Microsoft придумали универсальный способ и дали ему название ToolHelp API.

Для использования этого способа подключим заголовочный файл tlhelp32.h к нашей программе. Он находится в стандартной поставке Platform SDK (прилагающейся к студии), но если вдруг компилятор его не найдет, посмотри на нашем диске - я его приложил к программе. Для перечисления процессов мы будем использовать три функции:

CreateToolhelp32Snapshot - для получения "снимка" процессов;

Process32First - для получения первого процесса из снимка;

Process32Next - для получения оставшихся процессов.

Получаем процессы

При перечислении мы должны добавить имя процесса в листбокс на форме и идентификатор этого процесса в массив. Это необходимо для того, чтобы, связав значение в массиве со значением в списке, мы могли манипулировать процессом. Например, выделить определенный процесс в списке и нажать на кнопку "завершить", что, по идее, должно привести к завершению выбранного процесса.

Итак, определим переменные: массив типа DWORD из, допустим, 1024 элементов и переменную типа PROCESSENTRY32, в которую у нас будут заноситься значения свойств и характеристик процесса.

Содержание  Вперед на стр. 056-076-2