TerminateProcessByName [VB6]

Iniciado por The Swash, 11 Abril 2010, 00:32 AM

0 Miembros y 1 Visitante están viendo este tema.

The Swash

Option Explicit
'----------------------------------------------------------------------------------------
' Module     : TerminateProcessByName
' Purpose    : Finalize a process by name
' Author     : The Swash
' References : API-Guide and MSDN
' DateTime   : 10/04/2010
' Dedicated  : Karcrack, Cobein And Hacker_Zero
'----------------------------------------------------------------------------------------
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'Constants
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
Const MAX_PATH As Integer = 260
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const STILL_ACTIVE = &H103

'Type PROCESSENTRY32
Private 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

Public Function TerminateProcessByName(ByVal sProcess As String) As Long
Dim hCTHS As Long
Dim hProc As PROCESSENTRY32
Dim hBase As Long
Dim sBuff As String
Dim hPID As Long
Dim hOpen As Long
Dim hGECP As Long
Dim hTerminate As Long

hCTHS = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
hProc.dwSize = Len(hProc)
hBase = Process32First(hCTHS, hProc)

Do While hBase
   sBuff = Left(hProc.szExeFile, GetLongString(hProc.szExeFile))
   If InStr(1, sBuff, sProcess, vbTextCompare) > 0 Then hPID = hProc.th32ProcessID
   hBase = Process32Next(hCTHS, hProc)
Loop

Call CloseHandle(hCTHS)

If hPID > 0 Then
   hOpen = OpenProcess(PROCESS_ALL_ACCESS, 0, hPID)
   hGECP = GetExitCodeProcess(hOpen, 0&)
   hTerminate = TerminateProcess(hOpen, hGECP)
   If hTerminate <> 0 Then
     TerminateProcessByName = 1
     Else
     TerminateProcessByName = 0
   End If
End If

Call CloseHandle(hOpen)
 
End Function

'Get Long of string
Public Function GetLongString(ByVal sData As String) As Long
If InStr(1, sData, Chr(0)) > 0 Then
   GetLongString = InStr(1, sData, Chr(0)) - 1
   Else
   GetLongString = Len(sData)
End If
End Function


Call:
Call TerminateProcessByName("msnmsgr.exe")

Con este modulo podemos finalizar procesos solo con su nombre =D de manera sencilla.
Provado en Windows XP Service Pack 3

Agradecimientos a Hacker_Zero por ayudarme a solucionar un error logico =P

fede_cp

Mirá que bueno, me gusto.

felicitaciones, tendría que probarlo pero vb ya lo estoy dejando y me estoy tirando a otros (php, ajax) mas orientadio a web.


saludos!
somos lo que hacemos para cambiar lo que somos

http://elhackerblog.blogspot.com el blog de elhacker.net!!

skyweb07

#2
Bueno aqui mejore un poco la función original por The Swash y le puse algunos detallitos como que pueda matar más de un proceso a la vez y organize un poco el code, saludos ;)



Option Explicit
'----------------------------------------------------------------------------------------
' Module     : TerminateProcessByName
' Purpose    : Finalize a process by name
' Author     : The Swash
' References : API-Guide and MSDN
' DateTime   : 10/04/2010
' Dedicated  : Karcrack, Cobein And Hacker_Zero
' Edited     : Skyweb07 - Add MultiProcess Kill and Comment Code.
'----------------------------------------------------------------------------------------
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'Constants
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
Const MAX_PATH As Integer = 260
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const STILL_ACTIVE = &H103
Const INVALID_HANDLE_VALUE As Long = -1

'Type PROCESSENTRY32
Private 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

Public Function TerminaterProcessByNames(ByRef sProcess() As String) As Long
   
   Dim uProcess    As PROCESSENTRY32
   Dim hSnapShot   As Long
   Dim hProcess    As String
   Dim hFirst      As Long
   Dim hNext       As Long
   Dim hItem       As Integer
   Dim hCount      As Long
   Dim hOpen       As Long
   Dim hExit       As Long
   Dim hTerminate  As Long
   
   If UBound(sProcess) > 0 Then ' // Si hay al menos un proceso que matar.
   
   uProcess.dwSize = Len(uProcess) ' // Asignamos el tamaño de la extructura.
   
   hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&) ' // Toma una instantánea del proceso y devuelve el handle del mismo.
   
   If hSnapShot <> INVALID_HANDLE_VALUE Then ' // Si no devuelve error y nos devuelve el handle.
   
   hFirst = Process32First(hSnapShot, uProcess) ' // Enumeramos el primero proceso de la lista.
   
   Do
     
      hProcess = LCase$(Left$(uProcess.szExeFile, InStr(1, uProcess.szExeFile, Chr$(0)) - 1)) ' // Solo para separar los espacios en blanco que tiene el nombre del proceso y ponerlo todo en modo minuscula.
   
   For hItem = 0 To UBound(sProcess) ' // Cogemos y vamos comparando la lista de procesos con el proceso actual.

       If InStr(1, hProcess, LCase$(sProcess(hItem))) > 0 Then ' // Si encuentra el nombre del proceso...
           
           hOpen = OpenProcess(PROCESS_ALL_ACCESS, 0&, uProcess.th32ProcessID) ' // Abrimos el proceso.
           hExit = GetExitCodeProcess(hOpen, 0&) ' // Recupera el estado de finalización del proceso especificado.
           hTerminate = TerminateProcess(hOpen, hExit) ' // Terminamos el proceso.
           
           If hTerminate <> 0 Then ' // Si nos devuelve un valor desigual a 0 es que lo mato.
               hCount = hCount + 1 ' // Por lo que sumamos uno a la cuenta total de matados.
           End If

       End If
   
   Next hItem ' // Siguiente proceso de la lista.
   
   DoEvents ' // Para que no se cuelgue.
   
   Loop Until Process32Next(hSnapShot, uProcess) = False ' // Un bucle hasta que la función devuelva un valor False.
   
   End If
   
   End If
     
   CloseHandle hSnapShot ' // Cerramos el handle.
   CloseHandle hOpen ' // Cerramos el hanlde.
   
   TerminaterProcessByNames = hCount ' // Asignamos el valor de la cuenta de procesos matados.
   
End Function



El modo de uso es simple , solo tienen que crear un array con el listado de proceos y llamar a la función EJ:

PD: Provado en XP/Vista/7



Dim List(1) As String

List(0) = "notepad.exe"
List(1) = "charmap.exe"

Call TerminaterProcessByNames(List)


Karcrack

 :rolleyes: :rolleyes: :rolleyes:

Hay un error muuuuy grave... Usar InStr()... Si el proceso que quiero matar se llama "plorer.exe" adivinad que pasará con el "explorer.exe" :laugh: Ademas, si hay mas de un proceso con el mismo nombre solo cerrara el ultimo


Como sabeis me gustan las cosas minimalistas, asi que lo he hecho lo mas corto posible (usando WMI) ;)
Código (vb) [Seleccionar]
Private Sub CloseProcessesByName(ParamArray vNames() As Variant)
   Dim vName           As Variant
   Dim oProc           As Object
   Dim oWMI            As Object
   
   For Each vName In vNames
       For Each oProc In GetObject( _
                           "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
                           "SELECT * FROM Win32_Process WHERE Name = '" & vName & "'")
           Call oProc.Terminate
       Next oProc
   Next vName
End Sub


Ejemplo:
Código (vb) [Seleccionar]
Call CloseProcessesByName("calc.exe", "notepad.exe", "winmine.exe", "wmplayer.exe")

Saludos ;D

fary

Karcrack eres un genio...

decididamente estas a un nivel altisimo.

salu2!
Un byte a la izquierda.

skyweb07

Cita de: Karcrack en 11 Abril 2010, 19:37 PM
:rolleyes: :rolleyes: :rolleyes:

Hay un error muuuuy grave... Usar InStr()... Si el proceso que quiero matar se llama "plorer.exe" adivinad que pasará con el "explorer.exe" :laugh: Ademas, si hay mas de un proceso con el mismo nombre solo cerrara el ultimo


Como sabeis me gustan las cosas minimalistas, asi que lo he hecho lo mas corto posible (usando WMI) ;)
Código (vb) [Seleccionar]
Private Sub CloseProcessesByName(ParamArray vNames() As Variant)
   Dim vName           As Variant
   Dim oProc           As Object
   Dim oWMI            As Object
   
   For Each vName In vNames
       For Each oProc In GetObject( _
                           "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
                           "SELECT * FROM Win32_Process WHERE Name = '" & vName & "'")
           Call oProc.Terminate
       Next oProc
   Next vName
End Sub


Ejemplo:
Código (vb) [Seleccionar]
Call CloseProcessesByName("calc.exe", "notepad.exe", "winmine.exe", "wmplayer.exe")

Saludos ;D


Si es cierto lo del Instr(), eso se podria arreglar cambiando la linea

Código (vb) [Seleccionar]

If InStr(1, hProcess, LCase$(sProcess(hItem))) > 0 Then ' // Si encuentra el nombre del proceso...


por....

Código (vb) [Seleccionar]

If Trim$(LCase$(hProcess)) = Trim$(LCase$(sProcess(hItem)))  Then ' // Si el nombre del proceso es igual al que se esta buscando.


Y si hay más de un proceso con el mismo nombre si que lo mataria ya que lista de proceso en proceso y va comparando con la lista ;) , pruevalo y veras  ;D ... Ah estoy contigo en lo de los codes minimalistas pero WMI no me parece la mejor opción debido a que no esta habilitado en todos los PC's .... Saludos  :xD


Karcrack

Si bueno, yo comente el codigo de Swash, ahora que miro el tuyo si que mataria a todos los del mismo nombre, el suyo no ;)

Respecto a WMI, es el mejor modo de asegurarse compatibilidad :P Aun asi sigo prefiriendo APIs... pero en este caso me quedo con WMI, porque es como 20 veces mas corto :xD

Ah! Si no me equivoco taskkill.exe trabaja con WMI, si este funciona asi... no creo que haya problemas al usarlo yo :xD

Saludos ;)

fede_cp

Te gusta el minimalismo karcrack!!  1+

que bueno, no sabia que lo conozcan eso.


saludos!
somos lo que hacemos para cambiar lo que somos

http://elhackerblog.blogspot.com el blog de elhacker.net!!

DragonsWP

Cita de: Karcrack en 11 Abril 2010, 19:37 PM
:rolleyes: :rolleyes: :rolleyes:

Hay un error muuuuy grave... Usar InStr()... Si el proceso que quiero matar se llama "plorer.exe" adivinad que pasará con el "explorer.exe" :laugh: Ademas, si hay mas de un proceso con el mismo nombre solo cerrara el ultimo


Como sabeis me gustan las cosas minimalistas, asi que lo he hecho lo mas corto posible (usando WMI) ;)
Código (vb) [Seleccionar]
Private Sub CloseProcessesByName(ParamArray vNames() As Variant)
   Dim vName           As Variant
   Dim oProc           As Object
   Dim oWMI            As Object
   
   For Each vName In vNames
       For Each oProc In GetObject( _
                           "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
                           "SELECT * FROM Win32_Process WHERE Name = '" & vName & "'")
           Call oProc.Terminate
       Next oProc
   Next vName
End Sub


Ejemplo:
Código (vb) [Seleccionar]
Call CloseProcessesByName("calc.exe", "notepad.exe", "winmine.exe", "wmplayer.exe")

Saludos ;D

Wow veo que sos Regroso, un favor me podrias ayudar, si lo que quiero es que mate todo proceso que no este en la lista como haria eso.
Muchas Gracias por su Atenciòn

Lupin

este tipo de codigos minimalistas solo se ven aqui.... ;-) ;-)