Delphi завершить процесс по имени

Имена

Delphi завершить процесс по имени

Hello! Какая функция и какие её параметры используется для убиения процесса (запущенной программы)? Спасибо.


vic_774N ( 2002-11-06 06:24 ) [1]

.
function TForm1.CloseProgram(ClassName: string; WindowText: string; Command: Word): Integer;
var
WindowHandle : HWND;
ErrorResult: Boolean;
Error: Integer;
begin
WindowHandle := FindWindow(PChar(ClassName), PChar(WindowText));
if ClassName = «» then WindowHandle := FindWindow(nil, PChar(WindowText));
if WindowText = «» then WindowHandle := FindWindow(PChar(ClassName), nil);

ErrorResult := PostMessage(WindowHandle, Command, 0, 0);
if ErrorResult then Error := GetLastError else Error := 0 ;
Result:= Error;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Label1.Caption := IntToStr(CloseProgram(EClassName.Text,EWindowText.Text, WM_QUIT));
end;


SCHMaster ( 2002-11-11 03:31 ) [2]

procedure TKiller.ProgList;
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin

ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
IF (Wnd <> Application.Handle) AND <-Собственное окно>
IsWindowVisible(Wnd) AND <-Hевидимые окна>
(GetWindow(Wnd, gw_Owner) = 0) AND <-Дочернии окна>
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end;

Интересные блин способы для убиения процесса :))
А если у проги нет окна.


SCHMaster ( 2002-11-12 03:28 ) [4]

А как можно догадаться, что TerminateProcess(ProcessHandle,4); и есть тот самый конкретный отвечает, а не GetWindowThreadProcessID(TheWindow, @ProcessID); или еще чего.

А по вопросу отсутствия окна и PID есть отдельные ветви форума.
Чего есть??

ЗЫ. Кстати, для какой цели передана 4-ка 2ым параметром.


AngeL B. ( 2002-11-12 18:11 ) [6]


> ZZ ©

Слушая, иди почитай MSDN.

BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode);


vidiv ( 2002-11-13 03:09 ) [8]

потому что 4 это не 5 и не 786!


AngeL B. ( 2002-11-13 09:44 ) [9]

AngeL B.
И вообще, почем мне знать почему автор написал 4.
Ну ты же вылез с советами 🙂

Так что обозначает 4ка? (ну не просто же так он это написал)


SCHMaster ( 2002-11-14 02:42 ) [11]

Читайте также:  Назовите имя автора знаменитых древнегреческих поэм троя и илиада

The TerminateProcess function terminates the specified process and all of its threads.

HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);

Identifies the process to terminate.
Windows NT: The handle must have PROCESS_TERMINATE access. For more information, see Process Objects.

И без обид, ОК?
_______________________


rasen ( 2002-11-28 12:11 ) [12]

Источник

Delphi завершить процесс по имени

********

Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Yaroslavl

Репутация: нет
Всего: 5

Как программно пребить приложение в TaskManager’е?

M
Girder
Вот здесь точно есть: http://forum.vingrad.ru/topic-129445/0.html#look
Если вариантов мало, то здесь еще больше: http://forum.vingrad.ru/act-Search/f-2.html

********

Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Yaroslavl

Репутация: нет
Всего: 5

Код
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;

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76

Цитата(WERITAS @ 27.12.2006, 23:32 )
Вот-с наковырял ф-цию, которая вроде как завершает приложение. Но она почему-то не работает.

даже проверять не хочу.

********

Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Yaroslavl

Репутация: нет
Всего: 5

Во всех, найденных мной примерах, функция завершения реализуется через имя приложения. С помощью этого имени вычисляется ProcessID. А как мне определить имя приложения (допустим с помощью хендла окна или заголовка окна)?

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76

function KillProcess(const AProcessName: string): Boolean; overload;
function KillProcessByWindow(AWindow: Cardinal): Boolean;

function GetProcessID(const AProcessName: string): DWord;
var
lSnapHandle: THandle;
lProcStruct: PROCESSENTRY32;
lProcessName, lSnapProcessName: string;
lOSVerInfo: TOSVersionInfo;
begin
Result := INVALID_HANDLE_VALUE;
lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if lSnapHandle = INVALID_HANDLE_VALUE then
Exit;

lOSVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(lOSVerInfo);
case lOSVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS: lProcessName := AProcessName;
VER_PLATFORM_WIN32_NT: lProcessName := ExtractFileName(AProcessName);
end;

if Process32First(lSnapHandle, lProcStruct) then
begin
try
repeat
lSnapProcessName := lProcStruct.szExeFile;
if AnsiUpperCase(lSnapProcessName) = AnsiUpperCase(lProcessName) then
begin
Result := lProcStruct.th32ProcessID;
Break;
end;
until not Process32Next(lSnapHandle, lProcStruct);
finally
CloseHandle(lSnapHandle);
end;
end;
end;

function KillProcess(const AProcessName: string): Boolean;
var
lPID, lCurrentProcPID: DWord;
lProcHandle: DWord;
begin
Result := False;
try
lCurrentProcPID := GetCurrentProcessId;
lPID := GetProcessID(AProcessName);
if (lPID <> INVALID_HANDLE_VALUE) and (lCurrentProcPID <> lPID) then
begin
lProcHandle := OpenProcess(PROCESS_TERMINATE, False, lPID);
Windows.TerminateProcess(lProcHandle, 0);
WaitForSingleObject(lProcHandle, Infinite);
CloseHandle(lProcHandle);
Result := True;
end;
except
raise EExternalException.Create(GetLastErrorString);
end;
end;

function KillProcessByWindow(AWindow: Cardinal): Boolean;
const
C_FILEPATH_SIZE: Integer = 255;
var
lFileName: PChar;
begin
Result := False;
lFileName := GetMemory(C_FILEPATH_SIZE);
try
if GetWindowModuleFileName(AWindow, lFileName, C_FILEPATH_SIZE) > 0 then
Result := KillProcess(lFileName)
finally
FreeMem(lFileName);
end;
end;

function GetLastErrorString: string;
var
lz: Cardinal;
lErr: array[0..512] of Char;
begin
lz := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @lErr, 512, nil);
Result := string(lErr);
end;

********

Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Yaroslavl

Репутация: нет
Всего: 5

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76

Брутальный буратина

Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115

Вот ещё один пример, для коллекционеров, не помню где нашёл

Function DbgUiDebugActiveProcess(pHandle: dword): NTStatus;stdcall;external ‘ntdll.dll’;
Function DbgUiConnectToDbg(): NTStatus;stdcall;external ‘ntdll.dll’;

После перевода процесса в режим отладки он будет завершен при уничтожении связанного с ним Debug объекта, например это произойдет при завершении процесса отладчика. Нам нужно прибить отлаживаемый процесс, и при этом продолжить выполнение текущего процесса, значит нужно получить информацию о открытых нашим процессом хэндлах, найти и закрыть Debug объект.
Все эти действия производит следующий код:
Код

После чего антивирус Касперского убивается одной строкой:
Код

Автор статьи неизвестен)

Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2011

Репутация: нет
Всего: нет

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,tlhelp32;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

SYSTEM_HANDLE_INFORMATION = packed record
ProcessId: dword;
ObjectTypeNumber: byte;
Handle: word;
end;

PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;
SYSTEM_HANDLE_INFORMATION_EX = packed record
NumberOfHandles: dword;
Information: array [0..0] of SYSTEM_HANDLE_INFORMATION;
end;

_PROCESS_BASIC_INFORMATION = packed record
UniqueProcessId: ULONG;
end;

Const
STATUS_SUCCESS = NTStatus($00000000);
STATUS_INFO_LENGTH_MISMATCH = NTStatus($C0000004);
SystemHandleInformation = 16;
ProcessBasicInformation = 0;

var
Form1: TForm1;
Function DbgUiDebugActiveProcess(pHandle: dword): NTStatus; stdcall; external ‘ntdll.dll’;
Function DbgUiConnectToDbg(): NTStatus; stdcall; external ‘ntdll.dll’;
Function ZwQuerySystemInformation(ASystemInformationClass: dword;
ASystemInformation: Pointer;
ASystemInformationLength: dword;
AReturnLength:PCardinal): NTStatus;
stdcall;external ‘ntdll.dll’;
Function ZwQueryInformationProcess(
ProcessHandle:THANDLE;
ProcessInformationClass:DWORD;
ProcessInformation:pointer;
ProcessInformationLength:ULONG;
ReturnLength:PULONG):NTStatus;stdcall;
external ‘ntdll.dll’;

function GetProcessId(pName: PChar): dword;
var
Snap: dword;
Process: TPROCESSENTRY32;
begin
Result := 0;
Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Snap <> INVALID_HANDLE_VALUE then
begin
Process.dwSize := SizeOf(TPROCESSENTRY32);
if Process32First(Snap, Process) then
repeat
if lstrcmpi(Process.szExeFile, pName) = 0 then
begin
Result := Process.th32ProcessID;
CloseHandle(Snap);
Exit;
end;
until not Process32Next(Snap, Process);
Result := 0;
CloseHandle(Snap);
end;
end;

begin
ZwQueryInformationProcess(tHandle, ProcessBasicInformation,
@ProcessInfo,
SizeOf(_PROCESS_BASIC_INFORMATION), nil);
if ProcessInfo.UniqueProcessId = dwProcessId then
begin
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
CloseHandle(hCSRSS);
Result := tHandle;
Exit;
end else CloseHandle(tHandle);
end;
end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
CloseHandle(hCSRSS);
end;

function EnableDebugPrivilege():Boolean;
var
hToken: dword;
SeDebugNameValue: Int64;
tkp: TOKEN_PRIVILEGES;
ReturnLength: dword;
begin
Result:=false;
//Добавляем привилегию SeDebugPrivilege
//Получаем токен нашего процесса
OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken);
//Получаем 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(TOKEN_PRIVILEGES),
tkp, ReturnLength);
if GetLastError() <> ERROR_SUCCESS then exit;
Result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DebugKillProcess(getprocessid(‘csrss.exe’));
end;

Yersinia pestis

Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Источник

Оцените статью
Имя, Названия, Аббревиатуры, Сокращения
Добавить комментарий

Adblock
detector