Problemas con un mataprocesos

Iniciado por Pseudoroot, 20 Enero 2006, 16:33 PM

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

Pseudoroot

Resulta. que estoy haciendo un mataprocesos en VB.
pero la cosa es que, como recien empiezo a codear en este lenguaje...xD ..me cuesta un poco familiarizarme con las funciones, por eso, he decidido postear el code..para que alguien me ayude y me diga como puedo quitar el proceso seleccionado, mi problema esta ,en como le paso el Id. del proceso ...para que lo termine..
gracias...

el code es este.


' Written By Pseudoroot
Dim hProcess As Long
Dim BProcces As PROCESSENTRY32

Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long
Const RSP_SIMPLE_SERVICE = 1
Const RSP_UNREGISTER_SERVICE = 0
Const WM_CLOSE = &H10

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID 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
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As Any) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As Any) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlgas As Long, ByVal lProcessID As Long) As Long
Const TH32CS_SNAPPROCESS As Long = 2&: Const MAX_PATH As Long = 260
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




Private Sub Command1_Click()
Call Listar
List1.RemoveItem 0
List1.RemoveItem 3
End Sub

Private Sub Command2_Click()
acerca.Show
End Sub
Sub Listar()

Dim tt
Dim a As Integer
Dim Num As Integer
BResult1 = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
a = 0
BProcces.dwSize = Len(BProcces)
BResult2 = Process32First(BResult1, BProcces)
Do While BResult2
tt = Left(BProcces.szexeFile, InStr(LCase(BProcces.szexeFile), ".exe") + 3)
List1.List(a) = tt
BResult2 = Process32Next(BResult1, BProcces)
a = a + 1
Loop
CProcces = CloseHandle(BResult1)
End Sub


Private Sub Command3_Click()
End
End Sub

Private Sub Command4_Click()
MsgBox BProcces.th32ProcessID
'BProcces.th32ProcessID = Num
OProcess = OpenProcess(0, False, BProcces.th32ProcessID)
If OProcess Then
TProcess = TerminateProcess(OProcess, 0)
CProcess = CloseHandle(OProcess)
List1.RemoveItem Num
List1.Clear
Call Listar
List1.RemoveItem 0
List1.RemoveItem 3
Else
MsgBox "No se pudo cerrar", vbCritical
End If
End Sub

Private Sub Form_Load()

List1.List(0) = ""
Call Listar
List1.RemoveItem 0
List1.RemoveItem 3

End Sub

Private Sub List1_Click()
Dim n As Integer
n = List1.ListCount
Num = List1.ListIndex
End Sub
www.g e d z a c.com

www.espavirus.com/foro

sch3m4

aquí te pongo una funcion que acabo de hacer para cerrar el proceso a partir de su pid

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId 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
Const PROCESS_TERMINATE As Long = &HFFF

Private Function MataProceso(PID As Long) As Boolean
Dim Abre As Long
'abre el proceso
Abre = OpenProcess(PROCESS_TERMINATE, 0, PID)
'lo mata
If TerminateProcess(Abre, 0) Then
    MataProceso = True
Else
    MataProceso = False
End If
'cierra el handle
CloseHandle (Abre)
End Function
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Pseudoroot

gracias. pero .el problema es como obtener justamente ese pid.que  representa el proceso  que el usuario a seleccionado, para cerrar.
www.g e d z a c.com

www.espavirus.com/foro

sch3m4

sorry, aqui te pongo una ampliacion que he hecho

'para buscar el pid
Private Declare Function CreateToolhelp32Snapshot Lib "KERNEL32.DLL" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long
Const TH32CS_SNAPPROCESS As Long = &H2
Const MAX_PATH As Integer = 260
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
'para matar el proceso
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId 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
Const PROCESS_TERMINATE As Long = &HFFF
'para dar un retorno erróneo
Const ERROR As Long = -1

'MATA UN PROCESO A PARTIR DE SU PID
Private Function MataProceso(PID As Long) As Boolean
Dim Abre As Long
'abre el proceso
Abre = OpenProcess(PROCESS_TERMINATE, 0, PID)
'lo mata
If TerminateProcess(Abre, 0) Then
    MataProceso = True
Else
    MataProceso = False
End If
'cierra el handle
CloseHandle (Abre)
End Function

'DEVUELVE EL PID DE UN PROCESO A PARTIR DE SU NOMBRE
Private Function BuscaPid(Nombre As String) As Long
Dim Uno As Long
Uno = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
Dim Info As PROCESSENTRY32
Info.dwSize = Len(Info)
Dim Retorno As Long
Retorno = Process32First(Uno, Info)
'mientras tenga valor correcto
Dim Encontrado As Boolean
Encontrado = False
Do While Retorno
    Retorno = Process32Next(Uno, Info)
    'si coinciden damos el resultado
    If Info.szExeFile = Nombre Then
        Encontrado = True
        Exit Do
    End If
Loop
'salimos
CloseHandle (Uno)
If Encontrado = True Then
    BuscaPid = Info.th32ProcessID
Else
    BuscaPid = ERROR
End If
End Function

Private Sub cmdMata_Click()
'buscamos el pid
Dim PID As Long
PID = BuscaPid(txtProceso.Text)

If Not PID = ERROR Then
    If MataProceso(PID) = True Then
        MsgBox "Proceso Matado!", vbInformation
    Else
        MsgBox "Error al matar el proceso", vbExclamation
    End If
Else
    MsgBox "Error al buscar el PID", vbExclamation
End If
End Sub
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Pseudoroot

Lympex.. sabs hay un problema con el code..

esque lo probe .pasandole el string del proceso con List1.Text
lo puse en una variable string

para que me devolviera el pid a partir de su nombre.
pero no paso absolutamente nada. y eso que lo probe de varias formas. incluso lo puse directamente..
pero tampoco..puede ser que en el code de esa funcion haya algun error, o talvez...yo no le paso el argumento de forma correcta .auque no creo
saludos.
www.g e d z a c.com

www.espavirus.com/foro

sch3m4

#5
no hay ningun problema en el code, esque para obtener cualquier item (linea) de un listbox tienes que hacerlo asi:

para uno en concreto
List1.List(c)

para el seleccionado
List1.List(List1.ListIndex)

cuando tengas algun problema, prueba a meter en un msgbox las variables que uses si crees que el problema es de la funcion, y ves si son las que tu esperabas o no, te lo digo por experiencia.
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Pseudoroot

no hay caso, no logro hacer que la funcion me devuelva el pid
probe como lo dices tu leo los valores con Msgbox. y veo que cuando le paso los datos a la funcion..efectivamente va el proceso.pero luego..cuando quiero obtener el pid.en todos los casos me devuelve 0,,que sera..
pero es que tu has probado el code,,,??
www.g e d z a c.com

www.espavirus.com/foro

sch3m4

yo si lo he probado, en WinXP, para wini9x creo que tienes que pasarle el tamaño de la estructura PROCESSENTRY32.
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

sch3m4

le retoque algunas cosas:

modulo
'para buscar el pid
Private Declare Function CreateToolhelp32Snapshot Lib "KERNEL32.DLL" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "KERNEL32.DLL" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long
Const TH32CS_SNAPPROCESS As Long = &H2
Const MAX_PATH As Integer = 260
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
'para matar el proceso
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId 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
Const PROCESS_TERMINATE As Long = &HFFF
'para no declararla dentro del timer
Public C As Long
Public Pid As Long

'MATA UN PROCESO A PARTIR DE SU PID
Public Function MataProceso(Pid As Long) As Boolean
Dim Abre As Long
'abre el proceso
Abre = OpenProcess(PROCESS_TERMINATE, 0, Pid)
'lo mata
If TerminateProcess(Abre, 0) Then
    MataProceso = True
Else
    MataProceso = False
End If
'cierra el handle
CloseHandle (Abre)
End Function

'DEVUELVE EL PID DE UN PROCESO A PARTIR DE SU NOMBRE
Public Function BuscaPid(Nombre As String) As Long
Dim Uno As Long
Dim Info As PROCESSENTRY32

Info.dwSize = Len(Info)
Uno = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
Call Process32First(Uno, Info)

'mientras tenga valor correcto
Do While Process32Next(Uno, Info)
    'si coinciden damos el resultado
    If lstrcmp(Nombre, Info.szExeFile) = 0 Then
        BuscaPid = Info.th32ProcessID
        Exit Do
    End If
Loop

CloseHandle (Uno)
End Function


timer
CitarPrivate Sub TmrProcesos_Timer()
For C = 0 To C = lstProcesos.ListCount
    'buscamos su pid
    Pid = BuscaPid(lstProcesos.List(C))
    'si existe, lo matamos
    If Pid > 0 Then
            If Check1.Value = Checked Then
                Open txtLogProcesos.Text For Append As #1
                Print #1, vbCrLf & vbCrLf & "[- " & Now & " -]"
                Print #1, "
  •   Matando proceso `" & lstProcesos.List(C) & "´ con PID=" & Pid & " ..."
                    If MataProceso(Pid) = True Then
                        Print #1, "
  • OK"
                    Else
                        Print #1, "
  • Error"
                    End If
                    Close #1
                Else
                    Call MataProceso(Pid)
                End If
        End If
    Next C
    End Sub
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Pseudoroot

Por fin puede hacer que mi programa me encontrara el PId y deteniera el proceso, pero funciona solo en windows 98, ya que en este sistema, la estructura Info.szExeFile devuelve el path completo del programa que origina el proceso, sin embargo en windows Xp esto no sucede, pues aqui solo me nombra el proceso por su nnombre EJ: Winword.exe
no con su path completo.
Es decir, al momento de pasarle la ruta asi List1.List(List1.ListIndex)  a una variable. y luego pasarsela a la funcion que devuelve el Pid , no podria ,puesto que lee solo el nombre del proceso y no el Path completo.
ahi esta el problema.
Por eso me extraña que digas que ati si te resulte en Win XP
puesto que en Win 98 si resulta sin problemas.
www.g e d z a c.com

www.espavirus.com/foro