KillTask

program KillTask;

uses
  SysUtils, Messages, Classes, ShellApi, Forms, Windows, TLHelp32, rwIni;

{$R CustKillTask.RES}
{$R *.res}

//brc32 CustKillTask.RC
//TsKill     kl_TsKill     D:/SoftWare/KillTask/TsKill.exe
//TaskList   kl_TaskList   D:/SoftWare/KillTask/TaskList.exe
//Ntsd       kl_Ntsd       D:/SoftWare/KillTask/Ntsd.exe
//Usage: >ntsd -c q -p PID

//KillTask.ini
//[KillTask]
//Item1=wnwb.exe

procedure Kill_Task(ExeFileName: string);
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  ProcessHandle: THandle;
  ExecuteStr: string;
  ParaStr: string;
begin
  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
    begin
      ProcessHandle := FProcessEntry32.th32ProcessID;
      ExecuteStr := 'ntsd.exe';
      ParaStr := ' -c q -p ' + IntToStr(ProcessHandle);
      ShellExecute(Application.Handle, 'Open', pchar(ExecuteStr), Pchar(ParaStr), nil, SW_HIDE);
     { Or,But It can't close system process.
      ProcessHandle := OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID);
      TerminateProcess(ProcessHandle, 0);
     }
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
end;

var
  ExeFileName: string;
  Items: TStrings;
  i: Integer;
  CustRes: TResourceStream;
  ResName, ResType, ResSaveTo: string;
  TaskHandle: THandle;
  rwIniFile: TrwIni;
begin
  Application.Initialize;
  rwIniFile := TrwIni.Create(nil);
  rwIniFile.RegistryPath := '/Software/Microsoft/Windows/CurrentVersion/Run';
  rwIniFile.FileName := 'KillTask';

  ResSaveTo := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'Ntsd.Exe';
  if FileExists(ResSaveTo) then
    DeleteFile(Pchar(ResSaveTo));

  ResName := UpperCase('Ntsd');
  ResType := UpperCase('kl_Ntsd');
  CustRes := TResourceStream.Create(Hinstance, ResName, pchar(ResType));
  CustRes.SaveToFile(ResSaveTo);
  CustRes.Free;
  SetFileAttributes(Pchar(ResSaveTo), FILE_ATTRIBUTE_HIDDEN);

  Items := TStringList.Create;

  rwIniFile.iReadSection('KillTask', Items);
  for i := 0 to Items.Count - 1 do
  begin
    ExeFileName := rwIniFile.iReadString('KillTask', Items[i], 'Nothing@Null');
    Kill_Task(ExeFileName);
  end;
  rwIniFile.hkWriteString('KillTask', Application.ExeName);

  FreeAndNil(Items);
  FreeAndNil(rwIniFile);

  if FileExists(ResSaveTo) then
    DeleteFile(Pchar(ResSaveTo));

  // TaskHandle := FindWindow(PChar('Shell_TrayWnd'), nil);
  // MoveWindow

  Application.Run;
end.

阅读更多

没有更多推荐了,返回首页