Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Монитор процессов и потоков СП_правленный.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
197 Кб
Скачать
☆

1.1.4 Использование функций CreateToolHelp32Snapshot () и Heap32Listxxxx()

для получения списка куч

Для получения сведений о кучах необходимо извлечь из снимка состояния системы с помощью функций Heap32ListFirst() и Heap32ListNext () значения соответствующих полей.

Обращение к функциям имеет вид:

Heap32ListFirst (hSnapshot, LPHEAPLIST32);

Heap32ListNext (hSnapshot, LPHEAPLIST32).

Первый аргумент – хэндл созданного снимка (возвращает функция CreateToolHelp32Snapshot).

Второй аргумент – структура, содержащая 4 поля:

  1. dwSize : DWORD – размер кучи;

  2. th32ProcessID : DWORD – идентификатор процесса, владеющего кучей;

  3. th32HeapID : DWORD – идентификатор кучи;

  4. dwFlags: DWORD – тип кучи.

1.2 Завершение выбранного процесса

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

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

OpenProcess ( PROCESS_TERMINATE, // флаг доступа

false, // handle inheritance flag

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

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

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

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

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

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

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

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

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

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

  3. Обратиться к функции 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;