Завершение выбранного процессаДля завершения процесса используется функция 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;
|