Как завершить любой процесс, в том числе и системный
Материал из DRKB
Как завершить любой процесс, в том числе и системный[править | править код]
// Включение, применение и отключения привилегии.
// Для примера возьмем привилегию отладки приложений 'SeDebugPrivilege'
// необходимую для завершения ЛЮБЫХ процессов в системе (завершение процессов
// созданных текущим пользователем привилегия не нужна.
function ProcessTerminate(dwPID: Cardinal): Boolean;
var
hToken: THandle;
SeDebugNameValue: Int64;
tkp: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
hProcess: THandle;
begin
Result := False;
// Добавляем привилегию SeDebugPrivilege
// Для начала получаем токен нашего процесса
if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
exit;
// Получаем LUID привилегии
if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', SeDebugNameValue) then
begin
CloseHandle(hToken);
exit;
end;
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Luid := SeDebugNameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
// Добавляем привилегию к нашему процессу
AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() <> ERROR_SUCCESS then exit;
// Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем
// завершить и системный процесс
// Получаем дескриптор процесса для его завершения
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if hProcess = 0 then exit;
// Завершаем процесс
if not TerminateProcess(hProcess, DWORD(-1)) then exit;
CloseHandle(hProcess);
// Удаляем привилегию
tkp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() <> ERROR_SUCCESS then exit;
Result := True;
end;
// Название добавление/удаление привилегии немного неправильные. Привилегия или
// есть в токене процесса или ее нет. Если привилегия есть, то она может быть в
// двух состояниях - или включена или отключена. И в этом примере мы только
// включаем или выключаем необходимую привилегию, а не добавляем ее.
Source: Взято с http://delphiworld.narod.ru
ID: 02148