Что нового

[Процессы] неудачное завершение процесса iexplore.exe

Сообщения
35
Репутация
-1
Добрый день я вернулся к вам уважаемые гуру помогите решить задачу
выкладываю свой лог там все понятно что еще можно сделать с гребаным процессом чтобы не перезагружать комп

1) _KillProcessIE() массив процессов системы сформирован переменная $ArrProcess функция ProcessList() выход из цикла шаг 1 переход к следушему действию
2) _KillProcessIE() процесс добавлен в массив под номером 1 переменная $ArrProcessIE ИМЯ процесса iexplore.exe PID процесса 4740
3) _KillProcessIE() процесс PID 4740 не имеет дескрипторов требуется закрыть процесс функция _WinAPI_EnumProcessWindows()
4) _KillProcessIE() процесс PID 4740 цикл шаг 1 функция вернула значение 1 требуется проверка наличия процесса функция ProcessClose()
5) _KillProcessIE() процесс PID 4740 цикл шаг 1 процесс не закрыт переход к шагу 2 функция ProcessClose()
6) _KillProcessIE() процесс PID 4740 цикл шаг 2 функция вернула значение 1 требуется проверка наличия процесса функция ProcessClose()
7) _KillProcessIE() процесс PID 4740 цикл шаг 2 процесс не закрыт переход к шагу 3 функция ProcessClose()
8 ) _KillProcessIE() процесс PID 4740 цикл шаг 3 функция вернула значение 1 требуется проверка наличия процесса функция ProcessClose()
9) _KillProcessIE() процесс PID 4740 цикл шаг 3 процесс не закрыт функция ProcessClose() не смогла завершить процесс переход к завершению процесса командой taskkill
10) _KillProcessIE() завершение процесса PID 4740 цикл шаг 1 командой taskkill требуется проверка наличия процесса
11) _KillProcessIE() процесс PID 4740 цикл шаг 1 не завершён командой taskkill переход к шагу 2
12) _KillProcessIE() завершение процесса PID 4740 цикл шаг 2 командой taskkill требуется проверка наличия процесса
13) _KillProcessIE() процесс PID 4740 цикл шаг 2 не завершён командой taskkill переход к шагу 3
14) _KillProcessIE() завершение процесса PID 4740 цикл шаг 3 командой taskkill требуется проверка наличия процесса
15) _KillProcessIE() процесс PID 4740 цикл шаг 3 не завершён команда taskkill не смогла завершить процесс переход к завершению процесса по дескрипторам
16) _KillProcessIE() массив дескрипторов процесса 4740 сформирован количество дескрипторов в массиве 9
17) _KillProcessIE() дескриптор 0x00000000000606C6 процесса 4740 существует закрытие дескриптора функцией WinClose
18) _KillProcessIE() дескриптор 0x00000000000606C6 процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
19) _KillProcessIE() дескриптор 0x00000000000606C6 процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
20) _KillProcessIE() дескриптор 0x000000000014055E процесса 4740 существует закрытие дескриптора функцией WinClose
21) _KillProcessIE() дескриптор 0x000000000014055E процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
22) _KillProcessIE() дескриптор 0x000000000014055E процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
23) _KillProcessIE() дескриптор 0x00000000007205C0 процесса 4740 существует закрытие дескриптора функцией WinClose
24) _KillProcessIE() дескриптор 0x00000000007205C0 процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
25) _KillProcessIE() дескриптор 0x00000000007205C0 процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
26) _KillProcessIE() дескриптор 0x00000000003908CA процесса 4740 существует закрытие дескриптора функцией WinClose
27) _KillProcessIE() дескриптор 0x00000000003908CA процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
28) _KillProcessIE() дескриптор 0x00000000003908CA процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
29) _KillProcessIE() дескриптор 0x00000000009206B4 процесса 4740 существует закрытие дескриптора функцией WinClose
30) _KillProcessIE() дескриптор 0x00000000009206B4 процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
31) _KillProcessIE() дескриптор 0x00000000009206B4 процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
32) _KillProcessIE() дескриптор 0x0000000000FE07EE процесса 4740 существует закрытие дескриптора функцией WinClose
33) _KillProcessIE() дескриптор 0x0000000000FE07EE процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
34) _KillProcessIE() дескриптор 0x0000000000FE07EE процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
35) _KillProcessIE() дескриптор 0x00000000001E08C8 процесса 4740 существует закрытие дескриптора функцией WinClose
36) _KillProcessIE() дескриптор 0x00000000001E08C8 процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
37) _KillProcessIE() дескриптор 0x00000000001E08C8 процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
38) _KillProcessIE() дескриптор 0x00000000001D0726 процесса 4740 существует закрытие дескриптора функцией WinClose
39) _KillProcessIE() дескриптор 0x00000000001D0726 процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
40) _KillProcessIE() дескриптор 0x00000000001D0726 процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
41) _KillProcessIE() дескриптор 0x0000000000570864 процесса 4740 существует закрытие дескриптора функцией WinClose
42) _KillProcessIE() дескриптор 0x0000000000570864 процесса 4740 не закрыт функцией WinClose переход к закрытию дескриптора функцией WinKill
43) _KillProcessIE() дескриптор 0x0000000000570864 процесса 4740 не закрыт функцией WinKill запись дескриптора в массив переменная $FeilDis
44) _KillProcessIE() есть незакрытые дескрипторы процесса 4740 в массиве $FeilDis количество дескрипторов 9 требуется доработка функции
45) _KillProcessIE() условие $STAT_3 = 5 процесс PID 4740 с ошибкой 11 функции _WinAPI_EnumProcessWindows() остались не закрытые дескрипторы процесса командами WinClose или WinKill требуется дополнительная проверка закрыт ли процесс незакрытые дескрипторы находятся в массиве $FeilDis требуется доработка функции или проверка не завершился ли процесс процесс добавляется в массив $FeilProcess
46) _KillProcessIE() очистка памяти процесса PID 4740 с помощью функции _MemGlobalFree() удаление дескрипторов процесса

функция ProcessClose() возвращает значение что процесс удачно закрыт код 1

команда taskkill возвращает процесс удачно завершён (проверял ручками в консоли)
(подскажите как из консольного окна вернуть ответ команды taskkill в переменную )

функции WinClose WinKill не смогли закрыть дескрипторы данного процесса

нарыл функцию _MemGlobalFree() вроде как удаляет дескрипторы из памяти на этом код
отвалился на первом дескрипторе с таким сообщением

!>04:01:30 AutoIt3.exe ended.rc:-1073740940
+>04:01:30 AutoIt3Wrapper Finished.
>Exit code: 3221226356 Time: 15.23

ХЕЛП , ХЕЛП МИ ПЛИЗ :(

комп не выключаю второй день ;D
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Gen345,
Может, вместо лога, Вы покажите код функции _KillProcessIE()?
 
Автор
G
Сообщения
35
Репутация
-1
ну а смысл там все работает правильно ниже лога я написал
функция ProcessClose(PID) возвращает 1 три попытки процесс остается проверяется функцией ProcessExists() возвращает PID процесса значит он есть и в диспетчере остается
из справки
Возвращаемое значение
Успех: Возвращает 1.
Ошибка: Возвращает 0 и устанавливает значение @error равным:
1 = не удалось выполнить функцию WinApi OpenProcess
2 = не удалось выполнить функцию WinApi AdjustTokenPrivileges
3 = не удалось выполнить функцию WinApi TerminateProcess
4 = не удалось проверить существование процесса
Значение @extended устанавливается равным WinAPI GetLastError

в консоли ручками писал taskkill флаг /f ответ в консоли был такой (процесс успешно завершён ) проверял на других процессах команду закрывает их написал значит правильно
ProcessExists(PID) возвращает PID процесса значит он есть и в диспетчере остается

закрывал указывая PID процесса

функция WinClose(дескриптор) возвращает 1 проверка дескриптора WinExists() возвращает 1
Успех: Возвращает 1.
Ошибка: Возвращает 0, если указанное окно не найдено

WinKill (дескриптор ) проверка дескриптора WinExists() возвращает 1
Возвращаемое значение
Всегда возвращает 1, независимо от результата операции.

ошибок в коде нет просто процесс остается а все функции сообщают об успешном выполнении операции

могу код вывалить но там портянка с описанием каждого шага и записью в лог

я же не просил ошибку в коде найти я так и написал что функции не завершают процесс не смотря что отвечают об успешном выполнении


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

могу скрины выложить процесса из диспетчера и из монитора ресурсов
также могу выложить проверку любой функции процесса либо дескриптора если надо

вопрос такой как закрыть процесс который не закрыли стандартные функции объем памяти процесса не меняется то есть перезапуска процесса точно нет


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

косячный процесс определяю функцией
при всех вариантах проверки возвращает @error = 11
_WinAPI_EnumProcessWindows(PID)
_WinAPI_EnumProcessWindows(PID,1)
_WinAPI_EnumProcessWindows(PID,0)
_WinAPI_EnumProcessWindows(PID,true)
_WinAPI_EnumProcessWindows(PID,False)
описание функции нашел только на английском к сожалению не сильно дружу с ним :smile:



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

ну вот урезанная версия функции процесс не закрывается тоже самое и с попыткой закрытия дескрипторов процесса
ответы из консоли добавлены в код
Код:
Func _KillProcess()
	Local $ArrProcess = ProcessList() ; массив всех процессов в системе
    If @error = 1 Then
		Exit ; выход если ошибка массив не сформирован
    EndIf
	;_ArrayDisplay($ArrProcess)

	Dim $ArrProcessIE[1][2] = [[0]] ; массив процессов браузера IE
	Local $process = 'iexplore.exe'
	Local $i_1 = 1
	Local $Stat = 0
	For $i = 1 To $ArrProcess[0][0]
		If StringCompare($ArrProcess[$i][0],$process) = 0  Then
			$ArrProcessIE[0][0] = $i_1
			ReDim $ArrProcessIE[$i_1 + 1][2]
            $ArrProcessIE[$i_1][0] = $ArrProcess[$i][0]
			$ArrProcessIE[$i_1][1] = $ArrProcess[$i][1]
			$i_1 += 1
	        $Stat = 1
		EndIf
	Next

    If $Stat = 0 Then
       ; процессов iexplore.exe нет в системе дальнейшая проверка не требуется
    ElseIf $Stat = 1 Then
	ConsoleWrite('Имя процесса = '&$ArrProcessIE[1][0]&' PID процесса = '&$ArrProcessIE[1][1]&@CRLF)
    ; консоль  Имя процесса = iexplore.exe PID процесса = 4740

		For $i = 1 To $ArrProcessIE[0][0]
			_WinAPI_EnumProcessWindows($ArrProcessIE[$i][1])
	        If @error = 11 Then
				ConsoleWrite("требуется закрыть процесс PID "&$ArrProcessIE[$i][1]&" error = "&@error&@CRLF)
                ; консоль требуется закрыть процесс PID 4740 error = 11
			    Local $Var = ProcessClose($ArrProcessIE[$i][1])
			    ConsoleWrite("ответ функции ProcessClose() = "&$Var&@CRLF)
                ; консоль ответ функции ProcessClose() = 1

				Sleep(500)
				If $Var = 1 Then
					If ProcessExists($ArrProcessIE[$i][1]) <>  0 Then
						ConsoleWrite("процесс PID "&$ArrProcessIE[$i][1]&" не закрыт функцией ProcessClose()"&@CRLF)
                        ; консоль процесс PID 4740 не закрыт функцией ProcessClose()
					    runwait( @comspec & " /c taskkill /pid "&$ArrProcessIE[$i][1]&" /f","",@SW_HIDE)
					    Sleep(500)
						If ProcessExists($ArrProcessIE[$i][1]) <>  0 Then
							ConsoleWrite("процесс PID "&$ArrProcessIE[$i][1]&" не закрыт командой taskkill"&@CRLF)
                            ; консоль процесс PID 4740 не закрыт командой taskkill
						ElseIf ProcessExists($ArrProcessIE[$i][1]) =  0 Then
							ConsoleWrite("процесс PID "&$ArrProcessIE[$i][1]&" закрыт командой taskkill"&@CRLF)
						EndIf
					ElseIf ProcessExists($ArrProcessIE[$i][1]) =  0 Then
						ConsoleWrite("процесс PID "&$ArrProcessIE[$i][1]&" закрыт функцией ProcessClose()"&@CRLF)
					EndIf
				EndIf
			Else
				ConsoleWrite("проверка процесса PID "&$ArrProcessIE[$i][1]&" не требуется error = "&@error&@CRLF)
			EndIf
		Next
	EndIf
EndFunc

ПОМОГИТЕ убить гребаный процесс ;D
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
Func _IE_CloseAll()
	Local $oShellWindows, $has_ie = True
	While $has_ie
		$has_ie = False
		$oShellWindows = ObjCreate('Shell.Application').Windows()
		If Not IsObj($oShellWindows) Then ExitLoop
		For $oWindow In $oShellWindows
			If String($oWindow.name) = 'Internet Explorer' Then
				$has_ie = True
				WinClose(HWnd($oWindow.hwnd))
			EndIf
		Next
	WEnd
EndFunc
 
Автор
G
Сообщения
35
Репутация
-1
погоди немного не уходи твой вариант полностью закрывает все процессы браузера правильно ?
если да то не подходит мне надо завершить определенный процесс браузера не трогая остальные его процессы

есть такой вариант?



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

или я могу добавить в твой вариант фильтр закрытия по дескриптору или pid процесса?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Gen345 [?]
закрывает все процессы браузера правильно
да, закрывает все окна

мне надо завершить определенный процесс браузера не трогая остальные его процессы
если есть объект IE то можно закрыть окно командой _IEQuit($oIe). Если нет, и знаешь только PID то ProcessClose должен закрывать. Может не хватает прав?



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

Gen345 [?]
или я могу добавить в твой вариант фильтр закрытия по дескриптору или pid процесса?
Если знаешь дескриптор окна то тогда закрывай его обычным WinClose
 
Автор
G
Сообщения
35
Репутация
-1
да там непонятно инклуд #RequireAdmin
если не хватало прав то по идеи функции должны вернуть отрицательный ответ а они успех возвращают процесс косячный просто походу сейчас попробую разобраться с объектами может смогу фильтр повесить на функцию



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

ProcessClose()
taskkill
WinClose
WinKill
все возвращают положительный ответ типо операция завершена успешно но на самом деле все фейлятся :smile:
процесс и его дескрипторы остаются :mad:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ну а диспетчер задач может его завершить? Еще у меня был случай, когда глючил файервол, процесс пытался выйти в сеть, файервол не пускал, но окно с вопросом о праве доступа не выдавал, и процесс нельзя было закрыть или кикнуть, только перезагрузка помогала.
 
Автор
G
Сообщения
35
Репутация
-1
inververs сказал(а):
Ну а диспетчер задач может его завершить? Еще у меня был случай, когда глючил файервол, процесс пытался выйти в сеть, файервол не пускал, но окно с вопросом о праве доступа не выдавал, и процесс нельзя было закрыть или кикнуть, только перезагрузка помогала.
нет естественно диспетчер тоже отдыхает но мне бы решить эту проблему без перезагрузки если с перезагрузкой то мне придется очень сложную функцию написать
кстати твоя функция создает общий объект но цикл фор ин не пашет
такие процессы вызывают ошибки потом в работе и мне бы отлавливать и убивать их отдельно не трогая другие
у меня из за такого процеса уже вставал колом цикл фор ин просто завис код в цикле
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ну значит отложите аутоит в сторонку и решайте проблему. У вас нету доступа к процессу ищите почему.
 
Автор
G
Сообщения
35
Репутация
-1
inververs сказал(а):
Ну значит отложите AutoIt в сторонку и решайте проблему. У вас нету доступа к процессу ищите почему.
не погоди если нет доступа по крайне мере taskkill вроде должен об этом сообщить хотя я уже не в чем не уверен уверен в одном данный процесс с косяками и серьезными
и если уж функции не могут его убить может память процесса очистить или там хук процедуры есть какие то но я не шарю :( как память вырезать или хуки заюзать ;D
 
Верх