Что нового

Убить процесс

DanSaratov

Новичок
Сообщения
112
Репутация
1
Есть процесс такого autoit скрипта, который через диспетчер задач не вырубается, нужно его вырубить средствами autoit
Код:
Local $sProcessHandle , $sSignedvalue , $ProcessIoPriority , $sProcessInformationLength , $sStruct
$sProcessHandle = DllCall("kernel32.dll", "handle", "GetCurrentProcess")
$sSignedvalue = 0x8000F129 ;0xFFFFFFFF (BSOD not work on Win7 x86 )
$ProcessIoPriority = 0x00
$sProcessInformationLength = 0x4
$sStruct = DLLStructCreate("Byte[4]")
DllStructSetData($sStruct, 1, $sSignedvalue)
$sRet = DllCall ("ntdll.dll" , "none" , "ZwSetInformationProcess" , "int" , $sProcessHandle[0] , "int" , _
$ProcessIoPriority , "int" , DllStructGetPtr($sStruct) , "int" , $sProcessInformationLength)


Пробовал так:
Код:
#include <WinAPIProc.au3>
 $b = ProcessExists('114422.exe')
 $t = _WinAPI_EnumProcessThreads($b)
for $i=1 to $t[0]
	ProcessClose($t[$i])
	next
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
DanSaratov [?]
Есть процесс такого autoit скрипта, который через диспетчер задач не вырубается
Почему нет?
ProcessClose('114422.exe') не помагает?
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
На Win7 x86 вырубается. И ProcessClose() работает. Может вы чего-то не дописали?
Предполагаю,что на вин 7 x86 такой процесс создаётся по-другому.
Я тестировал на x64
Попробуйте так:
Код:
Local $sProcessHandle , $sSignedvalue , $ProcessIoPriority , $sProcessInformationLength , $sStruct
$sProcessHandle = DllCall("kernel32.dll", "handle", "GetCurrentProcess")
$sSignedvalue = 0xFFFFFFFF;
$ProcessIoPriority = 0x00
$sProcessInformationLength = 0x4
$sStruct = DLLStructCreate("Byte[4]")
DllStructSetData($sStruct, 1, $sSignedvalue)
$sRet = DllCall ("ntdll.dll" , "none" , "ZwSetInformationProcess" , "int" , $sProcessHandle[0] , "int" , _
$ProcessIoPriority , "int" , DllStructGetPtr($sStruct) , "int" , $sProcessInformationLength)
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
"всё работает" т.е получается остановить процесс?
 

InnI

AutoIT Гуру
Сообщения
4,923
Репутация
1,432
DanSaratov [?]
получается остановить процесс?
Да. И диспетчер задач и ProcessClose() этот процесс завершают. Я только добавил бесконечный цикл в ваш пример... и всё.
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
Да. И диспетчер задач и ProcessClose() этот процесс завершают. Я только добавил бесконечный цикл в ваш пример... и всё.
А у меня диспетчер задач не срабатывает, а ProcessClose() срабатывает только в том случае, если скрипт активен, т.е поток файла не завершён. А если цикл не добавлять, то поток файла завершается, а процесс остаётся висеть.

При наличии бесконечного цикла:
2015-02-26_160409.jpg

Когда его нет, или выполнена команда exit:
2015-02-26_160541.jpg
 

InnI

AutoIT Гуру
Сообщения
4,923
Репутация
1,432
Ну, не знаю. Если запускать скрипт так, как он у вас оформлен, то я его в диспетчере задач увидеть не успеваю, т.к. он завершается через 0.044 секунды.
А что это у вас за программа, скриншот которой вы привели? Может это из-за неё? ;)
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
А что это у вас за программа, скриншот которой вы привели? Может это из-за неё? ;)
Вряд ли это из за неё. Это Processhacker. Она просто мониторит.



Добавлено:
Сообщение автоматически объединено:

Мб есть способ завершить тот поток, который остаётся висеть?
 
Автор
DanSaratov

DanSaratov

Новичок
Сообщения
112
Репутация
1
Нашёл способ закрывать поток, всё работает.
Код:
Func _ThreadTerminate($hThread,$iExitCode=0)
	If Not IsPtr($hThread) Then Return SetError(1,0,False)
	Local $aRet=DllCall('kernel32.dll',"bool","TerminateThread","handle",$hThread,"int",$iExitCode)
	If @error Then Return SetError(2,@error,False)
	If Not $aRet[0] Then Return SetError(3,0,False)	; False (failure) return
;~ 	ConsoleWrite("Thread terminated successfully"&@CRLF)
	Return True
EndFunc
 
Верх