![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как "прибить" процесс? [D6]
}|{yk © (2004-07-23 20:54:00)Ткой вот код не проходит
GetExitCodeProcess(Application.Handle, lpExitCode);
TerminateProcess(Application.Handle, lpExitCode);
Piter (2004-07-25 01:03:00) [1]Как получить список процессов
вопрос N10
Будем пользоваться функцией CreateToolhelp32Snapshot, она реализована как в NT системах, так и в 9x. В NT она использует пресловутую NtQuerySystemInformation, которая недокументированна.
Заголовок CreateToolhelp32Snapshot и остальные типы описаны в модуле TlHelp32.
CreateToolhelp32Snapshot может делать снимок процессов и куч, модулей, потоков, используемых процессом. Она заносит требуемые данные в некоторую структуру (снимок) и возвращает ее описатель. После использования нужно закрыть описатель.
Работать со снимком можно с помощью функций Process32First, Process32Next, Thread32First , Thread32Next и так далее (описаны в Win32 SDK в разделе 'Tool Help Functions'). Эти функции заносят информацию о конкретном процессе, потоке и т.д. из снимка в структуры типа TProcessEntry32, TThreadEntry32.
Итак, будем получать список процессов и заносить их названия в ListBox1, который лежит у нас на форме:
procedure TForm1.Button1Click(Sender: TObject);
var
HSnapShot: THandle;
pe: TProcessEntry32;
begin
listbox1.Clear; //очишаем наш ListBox1
HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //нам нужен снимок процессов
pe.dwSize := sizeof(ProcessEntry32); //перед использованием TProcessEntry32 нужно заполнить поле dwSize
if Process32First(HSnapShot, pe) then // если первая запись о процессах получена - продолжаем
repeat
listbox1.Items.Add(pe.szExeFile); // добавляем в ListBox
until ( not Process32Next(HSnapShot,pe) ); // получаем запись о следующем процессе, если не получаем - выходим из цикла
closehandle(HSnapShot); // закрываем описатель снимка
end;
Как убить процесс?
Объяснять не буду - вот вырезка из программы:
var
PH:THandle;
begin
PH:=OpenProcess(PROCESS_ALL_ACCESS,false,pe.th32ProcessID);
if PH=0 then
showmessage('Ошибка OpenProcess');
if TerminateProcess(PH,0)=false then
showmessage('Ошибка TerminateProcess);
end;
где pe - структура TProcessEntry32 для терминируемого процесса. Или просто надо в OpenProcess подставлять Id процесса, полученное каким-либо способом ранее (например, как в первом примере).
P.S. Чтобы убить системные процессы нужно получить Debug привелегии:
var
hToken:THandle;
sedebugnameValue:Int64;
tkp:TTokenPrivileges;
ReturnLength:Cardinal;
begin
//Получаем SeDebugPrivilege
// Получаем дескриптор нашего процесса
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken )
then exit;
// Получаем 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;
// Добавляем привилегию к нашему процессу
if not AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength)
then showmessage('Ошибка при получении Debug-привилегиии');
CloseHandle( hToken );
if (GetLastError<>ERROR_success) then
showmessage('Ошибка получения привелегий');
Получить Debug привелегии может только администратор (программы, запущенные из под администратора)
Fagot (2004-07-24 10:14:00) [2]Установи Дебаг приоритет
Кириешки (2004-07-24 09:02:00) [3]Может быть так ...
procedure Snapshoot(ClassName: PChar; WindowTitle: PChar);
const
PROCESS_TERMINATE = $0001;
var
ProcessHandle : THandle;
ProcessID: Integer;
TheWindow : HWND;
begin
TheWindow := FindWindow(PChar(ClassName), PChar(WindowTitle));
GetWindowThreadProcessID(TheWindow, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Snapshoot(nil, pchar(Edit1.text);
end;
}|{yk (2004-07-23 21:39:00) [4]Сработало так...
hp := OpenProcess(PROCESS_ALL_ACCESS, false, GetPidFromProcessName(Application.ExeName));
GetExitCodeProcess(hp, lpExitCode);
TerminateProcess(hp, lpExitCode);
CloseHandle(hp);
из JCL