Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Монитор процессов и потоков С++.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.4 Mб
Скачать
    1. Завершение выбранного процесса

Для завершения процесса используется функция TerminateProcess ( HandleProc, ExitCode). Первый аргумент функции – описатель или хэндл процесса типа THandle – возвращается функцией, создавшей процесс, второй аргумент – код возврата типа DWord.

Значение описателя необходимо получить по идентификатору процесса с помощью функции

OpenProcess (unsigned long dwDesiredAcccess , // флаг доступа – например PROCESS_TERMINATE

int bInheritHandle, // handle inheritance flag

unsigned long dwProcessId ); // идентификатор процесса

Некоторые значения первого параметра функции OpenProcess() приведены в таблице 2

Таблица 2

Вид доступа

Оисание

PROCESS_ALL_ACCESS

Specifies all possible access flags for the process object.

PROCESS_QUERY_INFORMATION

Enables using the process handle in the GetExitCodeProcess and GetPriorityClass functions to read information from the process object.

PROCESS_SET_INFORMATION

Enables using the process handle in the SetPriorityClass function to set the priority class of the process.

PROCESS_TERMINATE

Enables using the process handle in the TerminateProcess function to terminate the process.

Алгоритм завершения процесса включает следующие шаги:

  1. Создать список процессов, используя описанную в п.1.1.1 методику. Кроме имен процессов, сохраняемых в массиве Pr_Names, необходимо сохранять в дополнительном массиве идентификаторы процессов.

  2. Получить номер (индекс) выделенного мышью имени завершаемого процесса, используя метод ListBox1.ItemIndex и соответствующий ему идентификатор процесса.

  3. По идентификатору процесса получить его описатель, используя функцию OpenProcess().

  4. Если описатель получен, завершить процесс, используя полученный описатель.

Для процессов с небольшими значениями ProcID – системных процессов – функция OpenProcess () не возвращает описатель, так как обычное приложения не должно иметь возможности останавливать системные процессы (службы). В то же время иногда необходимо иметь под рукой средство для удаления из системы зависшей службы.

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

  1. Прежде всего, необходимо с помощью функции OpenProcessToken() из библиотеки advapi32.dll открыть токен доступа процесса.

  2. Подготовить структуру TOKEN_PRIVILEGES, в которой разместить информацию о требуемом уровне привилегий.

  3. Обратиться к функции AdjustTokenPrivilages().

1.3 Мониторинг процессов

Мониторинг выполняющихся в системе процессов – основа всех приложений для наблюдения за работой информационных систем и их пользователей. Для отслеживания появления в системе новых приложений или завершения выполнявшихся можно использовать два способа:

  1. периодическое выполнение снимка состояния системы и его анализ, для чего приложение, рассмотренное в п.1.1.1, подключается к обработчику прерываний таймера. Это просто, но неэффективно – приложения не запускаются и не завершаются то и дело.

  2. подключение к процедуре запуска и завершения процессов с помощью функции ядра PsSetCreateProcessNotifyRoutine(), описанной в Windows 2000 DDK, путем регистрации функции обратного вызова. Это не так просто, как хотелось бы, но более эффективно.