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.