
- •Монитор процессов и потоков
- •Краткие теоретические сведения
- •Получение списка процессов, выполняющихся в системе
- •1.1.1 Использование функций CreateToolHelp32Snapshot () и Process32xxxx() для получения списка имен процессов
- •1.1.2 Использование функций CreateToolhelp32Snapshot () и Thread32xxxx() для получения сведений о приоритетах потоков процессов
- •1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx()
- •Завершение выбранного процесса
- •1.3 Мониторинг процессов
- •2. Методика выполнения
- •2.2. Выполнить индивидуальное задание для бригады согласно таблице 3
- •Отчет о работе
- •4. Контрольные вопросы
Завершение выбранного процесса
Для завершения процесса используется функция 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 методику. Кроме имен процессов, сохраняемых в массиве Pr_Names, необходимо сохранять в дополнительном массиве идентификаторы процессов.
Получить номер (индекс) выделенного мышью имени завершаемого процесса, используя метод ListBox1.ItemIndex и соответствующий ему идентификатор процесса.
По идентификатору процесса получить его описатель, используя функцию OpenProcess().
Если описатель получен, завершить процесс, используя полученный описатель.
Для процессов с небольшими значениями ProcID – системных процессов – функция OpenProcess () не возвращает описатель, так как обычное приложения не должно иметь возможности останавливать системные процессы (службы). В то же время иногда необходимо иметь под рукой средство для удаления из системы зависшей службы.
Уровень привилегий приложения можно повысить (но для этого необходимо иметь привилегии администратора. В связи с этим обстоятельством данная часть работы не выполняется). В частности, отладчик для выполнения своих функций должен обладать самыми широкими полномочиями в отношении всех процессов системы. Изменение уровня привилегий процесса выполняется при помощи следующих действий:
Прежде всего, необходимо с помощью функции OpenProcessToken() из библиотеки advapi32.dll открыть токен доступа процесса.
Подготовить структуру TOKEN_PRIVILEGES, в которой разместить информацию о требуемом уровне привилегий.
Обратиться к функции AdjustTokenPrivilages().
1.3 Мониторинг процессов
Мониторинг выполняющихся в системе процессов – основа всех приложений для наблюдения за работой информационных систем и их пользователей. Для отслеживания появления в системе новых приложений или завершения выполнявшихся можно использовать два способа:
периодическое выполнение снимка состояния системы и его анализ, для чего приложение, рассмотренное в п.1.1.1, подключается к обработчику прерываний таймера. Это просто, но неэффективно – приложения не запускаются и не завершаются то и дело.
подключение к процедуре запуска и завершения процессов с помощью функции ядра PsSetCreateProcessNotifyRoutine(), описанной в Windows 2000 DDK, путем регистрации функции обратного вызова. Это не так просто, как хотелось бы, но более эффективно.