Windows processes can be terminated from a delphi application using Win32 API calls. To terminate processes not owned by the current user the SE_DEBUG_NAME privilege must be set for the current process.
All sample code must include unit TlHelp32.
Sample code for activating SE_DEBUG_NAME privilege
function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;
var
hToken: THandle;
TokenPriv: TOKEN_PRIVILEGES;
PrevTokenPriv: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
begin
Result := True;
// Only for Windows NT/2000/XP and later.
if not (Win32Platform = VER_PLATFORM_WIN32_NT) then
Exit;
Result := False;
// obtain the processes token
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
try
// Get the locally unique identifier (LUID) .
if LookupPrivilegeValue(nil, PChar(sPrivilege),TokenPriv.Privileges[0].Luid) then
begin
TokenPriv.PrivilegeCount := 1; // one privilege to set
case bEnabled of
True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
False: TokenPriv.Privileges[0].Attributes := 0;
end;
ReturnLength := 0; // replaces a var parameter
PrevTokenPriv := TokenPriv;
// enable or disable the privilege
AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv),PrevTokenPriv, ReturnLength);
end;
finally
CloseHandle(hToken);
end;
end;
// test the return value of AdjustTokenPrivileges.
Result := GetLastError = ERROR_SUCCESS;
if not Result then
raise Exception.Create(SysErrorMessage(GetLastError));
end;
<span style="text-decoration: underline;">Sample code for terminating processes by name of executable file</span>
<pre lang="delphi">procedure Killprocess(Name:String);
var
PEHandle,hproc: cardinal;
PE: ProcessEntry32;
begin
NTSetPrivilege(SE_DEBUG_NAME,True);
PEHandle := CreateTOOLHelp32Snapshot(TH32cs_Snapprocess,0);
if PEHandle <> Invalid_Handle_Value then
begin
PE.dwSize := Sizeof(ProcessEntry32);
Process32first(PEHandle,PE);
repeat
if Lowercase(PE.szExeFile) = Lowercase(Pchar(Name)) then
begin
hproc := openprocess(Process_Terminate,false,pe.th32ProcessID);
TerminateProcess(hproc,0);
closehandle(hproc);
end;
until Process32next(PEHandle,PE)=false;
end;
closehandle(PEHandle);
end;