Форум: "WinAPI";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизКак "прибить" процесс? Найти похожие ветки
← →
}|{yk © (2004-07-23 20:54) [0]Ткой вот код не проходит
GetExitCodeProcess(Application.Handle, lpExitCode);
TerminateProcess(Application.Handle, lpExitCode);
← →
}|{yk © (2004-07-23 21:39) [1]Сработало так...
hp := OpenProcess(PROCESS_ALL_ACCESS, false, GetPidFromProcessName(Application.ExeName));
GetExitCodeProcess(hp, lpExitCode);
TerminateProcess(hp, lpExitCode);
CloseHandle(hp);
из JCL
← →
Кириешки © (2004-07-24 09:02) [2]Может быть так ...
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;
← →
Fagot (2004-07-24 10:14) [3]Установи Дебаг приоритет
← →
Piter © (2004-07-25 01:03) [4]Как получить список процессов
вопрос 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 привелегии может только администратор (программы, запущенные из под администратора)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c