- •Монитор процессов и потоков
- •Введение
- •1. Базовые функции
- •Краткие теоретические сведения
- •1.1. Получение списка процессов, выполняющихся в системе
- •1.1.1 Использование функций CreateToolHelp32Snapshot () и Process32xxxx()
- •1.1.2 Использование функций CreateToolHelp32Snapshot () и Thread32xxxx()
- •1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx()
- •1.2 Завершение выбранного процесса
- •1.1.4 Использование функций CreateToolHelp32Snapshot () и Heap32Listxxxx()
- •1.3 Мониторинг процессов
- •2. Дополнительные функции
- •Краткие теоретические сведения
- •2.1 Получение дополнительной информации о процессах и потоках
- •Получение информации о времени выполнения процессов и потоков
- •Получение информации счетчиков ввода-вывода
- •Получение информации об используемой процессом памяти
- •Получение информации о загруженных драйверах
- •Методика выполнения
- •3. Отчет о выполненной контрольной работе
- •4. Контрольные вопросы
- •Библиографический список
1.1.4 Использование функций CreateToolHelp32Snapshot () и Heap32Listxxxx()
для получения списка куч
Для получения сведений о кучах необходимо извлечь из снимка состояния системы с помощью функций Heap32ListFirst() и Heap32ListNext () значения соответствующих полей.
Обращение к функциям имеет вид:
Heap32ListFirst (hSnapshot, LPHEAPLIST32);
Heap32ListNext (hSnapshot, LPHEAPLIST32).
Первый аргумент – хэндл созданного снимка (возвращает функция CreateToolHelp32Snapshot).
Второй аргумент – структура, содержащая 4 поля:
dwSize : DWORD – размер кучи;
th32ProcessID : DWORD – идентификатор процесса, владеющего кучей;
th32HeapID : DWORD – идентификатор кучи;
dwFlags: DWORD – тип кучи.
1.2 Завершение выбранного процесса
Для завершения процесса используется функция TerminateProcess (HandleProc, ExitCode). Первый аргумент функции – описатель или хэндл процесса типа THandle – возвращается функцией, создавшей процесс, второй аргумент – код возврата типа DWord.
Значение описателя необходимо получить по идентификатору процесса с помощью функции
OpenProcess ( PROCESS_TERMINATE, // флаг доступа
false, // handle inheritance flag
procid ); // идентификатор процесса
Алгоритм завершения процесса включает следующие шаги:
Создать список процессов, используя описанную в п.1.1.1 методику. Кроме имен процессов, сохраняемых в массиве Pr_Names, необходимо сохранять в дополнительном массиве идентификаторы процессов.
Получить номер (индекс) выделенного мышью имени завершаемого процесса, используя метод ListBox1.ItemIndex и соответствующий ему идентификатор процесса.
По идентификатору процесса получить его описатель, используя функцию OpenProcess().
Если описатель получен, завершить процесс, используя полученный описатель.
Для процессов с небольшими значениями ProcID – системных процессов – функция OpenProcess() не возвращает описатель, так как обычное приложение не должно иметь возможности останавливать системные процессы (службы). В то же время иногда необходимо иметь под рукой средство для удаления из системы зависшей службы.
Уровень привилегий приложения можно повысить. В частности, отладчик для выполнения своих функций должен обладать самыми широкими полномочиями в отношении всех процессов системы. Изменение уровня привилегий процесса выполняется при помощи следующих действий:
Прежде всего, необходимо с помощью функции OpenProcessToken() из библиотеки advapi32.dll открыть токен доступа процесса.
Подготовить структуру TOKEN_PRIVILEGES, в которой разместить информацию о требуемом уровне привилегий.
Обратиться к функции AdjustTokenPrivilages().
Пример 3. Процедура получения привилегий отладчика. Для выполнения примера необходимо иметь права администратора.
procedure EnableDebugPriv;
var
hToken: THandle;
DebugValue: Int64;
tkp, oldtkp: TTokenPrivileges;
Return: DWORD;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
then
LookupPrivilegeValue('', 'SeDebugPrivilege', DebugValue)
else
begin
ShowMessage ('Ошибка OpenProcessToken');
ExitCode:=1;
Exit;
end;
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Luid:= DebugValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges (hToken, False, tkp, sizeof(TTokenPrivileges), OldTkp, Return)
then ExitCode:=0
else ExitCode:=2;
end;
