Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Закрытие процесса в VB по имени файла Добавлено: 29.03.06 19:19  

Автор вопроса:  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?

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #1
Добавлено: 30.03.06 00:56
То ли у тя операционка какая-то странная, то ли процесс особенный. У меня всё всегда работало. Приведи код, чтобы конктретно судить о том, что у тебя не так.

Ответить

Номер ответа: 2
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #2
Добавлено: 30.03.06 03:13
ясное дело странный: убивают то обычно антивирусов

Ответить

Номер ответа: 3
Автор ответа:
 D!@mo



ICQ: 99022096 

Вопросов: 2
Ответов: 8
 Web-сайт: system.front.ru
 Профиль | | #3
Добавлено: 30.03.06 07:53
вообще то для этого процедуру эту тоже можно будет использовать. Вот, например, вчера буквально с такой проблемкой столкнулся. Кто то поставил AVP Prof без лиценз. ключа и както его поставил, что "установкой удалением программ" не находит какойто файл в Temp'е и не удаляется (соответсвенно не устанавливается новый другой версии с лицензией). И еще поставил Pand'у, при удалении которого его библиотеки остаются (соответсвенно не удалются из системы, т.к. заняты). Антивирусы конфликтуют и виндХР глючит. Я как программитст использовал бы процедуру из моего вопроса. А так с помощью разных сторонних программ и защищенного режима парился.
Кстати, эту же процедуру можно будет использовать при снятии уже зараженных системных процессов и процессов-вирусов.
Эту процедуру собираюсь включать в программу автоматического решения часто встречающихся проблем. Базы проблем будут обновляться.
Спасибо за участие.

Ответить

Номер ответа: 4
Автор ответа:
 D!@mo



ICQ: 99022096 

Вопросов: 2
Ответов: 8
 Web-сайт: system.front.ru
 Профиль | | #4
Добавлено: 30.03.06 08:21
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

Sub Main()
prExit "explorer.exe"
End Sub

Ответить

Номер ответа: 5
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 30.03.06 11:32
Убивать чужой процесс через ExitProcess? Гыыыы...
А почему не через FatalAppExit? :))

VOID ExitProcess(
  UINT uExitCode
);

Покажи мне тут хендл процесса :)))
Убить чужой процесс можно через TerminateProcess, ну а если он поднимается снова - значит не тот процесс убиваешь. Небось explorer.exe, угадал?

Ответить

Номер ответа: 6
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 31.03.06 01:37
Пример ExitProcess
'Суперпупермагаультра End :))))
ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)


Пример убивания (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 Const TH32CS_SNAPPROCESS = &H2, TH32CS_SNAPheaplist = &H1, TH32CS_SNAPthread = &H4, TH32CS_SNAPmodule = &H8, TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule, MAX_PATH As Integer = 260

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%

End Sub

Ответить

Номер ответа: 7
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #7 Добавлено: 31.03.06 11:06
Ну, в целом, и над этим примером немало поработать надо... :)

Ответить

Номер ответа: 8
Автор ответа:
 D!@mo



ICQ: 99022096 

Вопросов: 2
Ответов: 8
 Web-сайт: system.front.ru
 Профиль | | #8
Добавлено: 31.03.06 14:39
HACKER!
А ты испробовал свой код на експлорер.ехе в ХР,например?

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 31.03.06 16:06
2 LOL, пример рабочий, но не является примеров хорошего тона программирования.

2 дЛамо
Убить чужой процесс можно через TerminateProcess, ну а если он поднимается снова - значит не тот процесс убиваешь. Небось explorer.exe, угадал?


Тупим или флеймим?

Ответить

Номер ответа: 10
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #10 Добавлено: 31.03.06 17:34
и ио и другое. Кстати код действительно косячный.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам