Автор вопроса: D!@mo | Web-сайт:system.front.ru | ICQ: 99022096
Задача:
нужно закрыть процесс и все его потоки (ветки) по имени исполняемого файла с помощью ExitProcess.
Что сделано:
применяя Process32Next и т.п. найден .th32ProcessID (переменного типа PROCESSENTRY32) где .szExeFile совпадает со входным именем исполняемого файла процесса.
Получен hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_TERMINATE, False, .th32ProcessID)
Проблема:
При использовании TerminateProcess hProcess, 0 процесс выгружается, но запускается операционкой заново.
Для использования ExitProcess GetExitCodeProcess(hProcess, uExitCode) нужно задать uExitCode. Если uExitCode сделать 0, то выгружается не нужный процесс, а моя прога.
Вопрос:
Как по получить uExitCode для .th32ProcessID?
То ли у тя операционка какая-то странная, то ли процесс особенный. У меня всё всегда работало. Приведи код, чтобы конктретно судить о том, что у тебя не так.
вообще то для этого процедуру эту тоже можно будет использовать. Вот, например, вчера буквально с такой проблемкой столкнулся. Кто то поставил AVP Prof без лиценз. ключа и както его поставил, что "установкой удалением программ" не находит какойто файл в Temp'е и не удаляется (соответсвенно не устанавливается новый другой версии с лицензией). И еще поставил Pand'у, при удалении которого его библиотеки остаются (соответсвенно не удалются из системы, т.к. заняты). Антивирусы конфликтуют и виндХР глючит. Я как программитст использовал бы процедуру из моего вопроса. А так с помощью разных сторонних программ и защищенного режима парился.
Кстати, эту же процедуру можно будет использовать при снятии уже зараженных системных процессов и процессов-вирусов.
Эту процедуру собираюсь включать в программу автоматического решения часто встречающихся проблем. Базы проблем будут обновляться.
Спасибо за участие.
Neco: То ли у тя операционка какая-то странная, то ли процесс особенный. У меня всё всегда работало. Приведи код, чтобы конктретно судить о том, что у тебя не так.
Public Const PROCESS_QUERY_INFORMATION As Long = &H400
Public Const PROCESS_TERMINATE As Long = &H1
Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Boolean, ByVal dwProcessId As Long) As Long
'Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Boolean
Declare Function TerminateProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByVal uExitCode As Long) As Boolean
Declare Function GetExitCodeProcess Lib "kernel32" _
 ByVal hProcess As Long, lpExitCode As Long) As Long
Declare Sub ExitProcess Lib "kernel32" _
(ByVal uExitCode As Long)
'АПИ для создания SnapShot'а
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" _
(ByVal lFlags As Long, ByVal lProcessID As Long) As Long
'АПИ для нахождения первого процесса
Public Declare Function Process32First Lib "kernel32.dll" (ByVal _
hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
'АПИ для нахождения следующего процесса
Public Declare Function Process32Next Lib "kernel32.dll" (ByVal _
hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
'АПИ для закрытия указателья
Public Declare Sub CloseHandle Lib "kernel32.dll" (ByVal hPass As Long)
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 260
End Type
'Свойства процесса
Public ProcessProp As PROCESSENTRY32
Public Sub Process_Kill(P_ID As Long)
On Error Resume Next
Dim hProcess As Long
Dim lExitCode As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_TERMINATE, False, P_ID)
ExitProcess GetExitCodeProcess(hProcess, 0)
CloseHandle hProcess
End Sub
Private Sub prExit(ProcName as String)
On Error Resume Next
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
'Свойства процесса
Dim SnapShotHandle As Long
'Возвращаемое значение
Dim ProcRet As Long
'Определяем snapshot процессов, модулей, используемых процессами
SnapShotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&
ProcessProp.dwSize = Len(ProcessProp)
'Определяем 1й процесс
ProcRet = Process32First(SnapShotHandle, ProcessProp)
'Если определён процесс, то
Do While ProcRet <> 0
If Left(ProcessProp.szExeFile, InStr(ProcessProp.szExeFile, Chr(0)) - 1) = ProcName Then
Process_Kill ProcessProp.th32ProcessID
End If
ProcRet = Process32Next(SnapShotHandle, ProcessProp)
Loop
'Закрываем SnapShot
CloseHandle SnapShotHandle
End Sub
Убивать чужой процесс через ExitProcess? Гыыыы...
А почему не через FatalAppExit? )
VOID ExitProcess(
UINT uExitCode
);
Покажи мне тут хендл процесса ))
Убить чужой процесс можно через TerminateProcess, ну а если он поднимается снова - значит не тот процесс убиваешь. Небось explorer.exe, угадал?
Пример убивания (TerminateProcess) по имени процесса
Public proc As PROCESSENTRY32, Snap As Long
Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * MAX_PATH
End Type
Dim mass() As Long
Dim NP() As String
Public Sub KillProc(ArryProsess$())
'Убивает все процессы которые даны в массиве
ReDim mass(0)
ReDim NP(0)
On Error Resume Next
Snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
proc.dwSize = Len(proc)
TheLoop = ProcessFirst(Snap, proc)
Index = 0
While TheLoop <> 0
NP$(Index) = Replace(proc.szexeFile, Right(proc.szexeFile, 1), ""
mass(Index) = proc.th32ProcessID
Index = Index + 1
ReDim Preserve NP(Index)
ReDim Preserve mass(Index)
TheLoop = ProcessNext(Snap, proc)
Wend
CloseHandle Snap
For i% = 0 To UBound(ArryProsess$)
Kick$ = ArryProsess$(i
For q% = 0 To Index
If LCase(Left(Spliting(NP$(q, "\", Len(Kick$))) = LCase(Kick$) Then
openproc = OpenProcess(1, 0, mass(q)
term = TerminateProcess(openproc, -9)
End If
Next q%
Next i%