Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Убить системный процесс


Автор: Михалыч 7.2.2025, 21:32
Подскажите, как убить системный процесс? Раньше на XP было так:
А теперь на windows 10 64 bit как?
Код

function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot
  (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
  FProcessEntry32);
  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(
      PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;


Автор: ZBugz 9.2.2025, 09:30
Китайский AI говорит так:
Код

program TerminateProcessExample;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Winapi.Windows;

function TerminateSystemProcess(const ProcessName: AnsiString): Boolean;
var
  SnapHandle: THandle;
  ProcEntry: TProcessEntry32;
  ProcessHandle: THandle;
begin
  Result := False;

  // Создаем снимок всех процессов
  SnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if SnapHandle = INVALID_HANDLE_VALUE then
  begin
    Writeln('Не удалось создать снимок процессов.');
    Exit;
  end;

  try
    ProcEntry.dwSize := SizeOf(TProcessEntry32);

    // Перебираем все процессы
    if Process32First(SnapHandle, ProcEntry) then
      repeat
        // Сравниваем имя процесса (без учета регистра)
        if AnsiSameText(ExtractFileName(ProcEntry.szExeFile), ProcessName) then
        begin
          Writeln(Format('Найден процесс: %s (PID: %d)', [ProcEntry.szExeFile, ProcEntry.th32ProcessID]));

          // Открываем процесс с правами TERMINATE
          ProcessHandle := OpenProcess(PROCESS_TERMINATE, False, ProcEntry.th32ProcessID);
          if ProcessHandle = 0 then
          begin
            Writeln(Format('Не удалось открыть процесс %s. Код ошибки: %d', [ProcEntry.szExeFile, GetLastError]));
            Continue;
          end;

          try
            // Принудительно завершаем процесс
            if TerminateProcess(ProcessHandle, 0) then
            begin
              Writeln(Format('Процесс %s успешно завершен.', [ProcEntry.szExeFile]));
              Result := True;
            end
            else
            begin
              Writeln(Format('Не удалось завершить процесс %s. Код ошибки: %d', [ProcEntry.szExeFile, GetLastError]));
            end;
          finally
            CloseHandle(ProcessHandle);
          end;
        end;
      until not Process32Next(SnapHandle, ProcEntry);
  finally
    CloseHandle(SnapHandle);
  end;
end;

begin
  try
    // Завершаем процесс по имени (например, notepad.exe)
    if ParamCount > 0 then
    begin
      if TerminateSystemProcess(AnsiString(ParamStr(1))) then
        Writeln('Операция завершена успешно.')
      else
        Writeln('Процесс не найден или не удалось его завершить.');
    end
    else
      Writeln('Использование: TerminateProcessExample <имя_процесса>');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  Readln; // Ожидание, чтобы консоль не закрылась
end.

Автор: Hiori 7.5.2025, 09:34
Я, конечно, гробокопатель... Но

Можно уточнить вопрос, вернее два smile

Первый - убийство системного процесса скорее определяется правами пользователя. То есть ваш процесс, который убьёт системный, должен быть запущен от имени администратора системы. Таким образом, это скорее вопрос администрирования системы, а не программирования.
Второй - зачем нужно убивать системный процесс? Для подобной задачи нужны причины, может быть стоит разобраться в причинах вопроса? Это бывает гораздо разумнее, чем ломать на ходу систему

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)