Форум: "WinAPI";
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];
ВнизЗакрыть процесс? Найти похожие ветки
← →
igorok (2002-01-20 17:05) [0]Уважаемые мастаки... Я читаю список процессов...
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Теперь список у меня есть... имена ЕХЕ файлов... ну а как мне закрыть/убить (желательно безглючно и 100%-но) заданый процесс из этого списка?
Большое пасибо.
← →
gluka (2002-01-21 04:18) [1]1)GetExitCodeProcess;
2)TerminateProcess;
А вообще желательно получить Дебаг привилегию и можно килить даже системные процесы!!!
← →
Fellomena (2002-01-21 12:06) [2]Для уничтожения других процессов тебе нужно не название файла, а идентификатор процесса, который ты хочешь прекратить, который ты получил с помощью CreateToolhelp32Snapshot.
А потом используй Terminate и всё. Правда, таким образом небезопасно прекращать работу - данные, связынные с данным процессом могут быть утеряны, а в памяти может остаться мусор...
gluka:
Что значит debug-привелегию: ring1 что ли ?
Ну не знаю, я kernell.dll и Explorer выгружала успешно и так 8)
Последствия этого вандализма, думаю, ясны :)
← →
MrAngel (2002-01-21 12:15) [3]igorok © есть совет -- используй EndTask/ если не ошибаюсь то она прописана в USER32.DLL .
← →
VuDZ (2002-01-22 00:42) [4]100% гарантия сметри:
1. получаем PID
2. получаем привилегии на запись в этот процесс и OpenProcess()
3. void * v = WriteProcessMemory()
4. CreateRemoteThread()
и данный процесс вырубается мгновенно, но при этом появляется стандартная мессага, что типа недопустимая ошибка :)
← →
Raptor (2002-01-22 11:45) [5]2igorok
Юзай TerminateProcess. Он требует hProcess. Это хендл процесса. Его можна получить с помощьо функции OpenProcess. Эта функция требует ProcessId. Его получаешь из структуры PROCESSENTRY32, указатель на которую дает функция Process32Firs или Process32Next.
2Fellomena
>>Ну не знаю, я kernell.dll и Explorer выгружала успешно и так 8)
Под какими это виндами? Попробуй под WinNT/2k/XP. Интересно узнать, что у тебя получится. :-))
← →
Fellomena (2002-01-22 11:58) [6]2 Raptor: под 98, это приводит к останову работы (но без "Завершение работы Windows" ;)
← →
Raptor (2002-01-22 23:16) [7]2 Fellomena
под 98, это приводит к останову работы (но без "Завершение работы Windows" ;)
Дык, ясен перец. Ты же ядро убиваешь. :-))
Но это я к тому, что с помощью TerminateProcess без соответствующих прав ядро (Kernel32.dll) можна убить только в Win9x. А в таких системах как WinNT/2k/XP ничего у тебя не выйдет. Здесь на это надо иметь соответствующие права.
← →
gluka (2002-01-23 01:32) [8]> Raptor
>А в таких системах как WinNT/2k/XP ничего у тебя не выйдет. >Здесь на это надо иметь соответствующие права.
procedure TerminateProcess;
var
hToken:THandle;
sedebugnameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hProcess:THandle;
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 );
// Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем завершить и системный процесс
// Получаем дескриптор процесса для его завершения
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, StrToInt(Edit1.Text));
if hProcess =0
then showmessage("Wrong Handle")
else
// Завершаем процесс
if not TerminateProcess(hProcess, DWORD(-1))
then showmessage("Couldn""t terminate process")
else showmessage("Process was terminated successfully");
CloseHandle( hProcess );
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c