Averiguar proceso de un archivo.

Iniciado por Freeze., 25 Octubre 2007, 00:14 AM

0 Miembros y 2 Visitantes están viendo este tema.

Eternal Idol

En ese caso podes recurrir a Module32First (el primer modulo siempre es el ejecutable) y el campo szExePath de la estructura MODULEENTRY32. Sino tambien GetModuleFileNameEx ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Freeze.

Disculpame, podrias aclararme bien como hacelo...?

Espero que no sea una molestia :(

Eternal Idol

Cita de: ►Freeze en 27 Octubre 2007, 00:04 AM
Disculpame, podrias aclararme bien como hacelo...?

Espero que no sea una molestia :(

La primera forma es exactamente igual que Process* solo que mas simple, no necesitas enumerar todos los modulos, el que te interesa es el primero.

Para la segunda necesitas abrir un HANDLE al proceso (OpenProcess) y despues pasarle a GetModuleFileNameEx ese handle como primer parametro, cero como segundo, un puntero a cadena como tercero y el tamaño de la misma como cuarto y ultimo.

Hace muchos años que no programo en VB asi que te doy una descripcion teorica, para la primera forma te podes guiar con el codigo que esta arriba, sigue la misma logica.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Freeze.

De este tipo de Apis no se mucho, no entiendo como obtener el Handle. :( :( :(

Eternal Idol

Cita de: ►Freeze en 27 Octubre 2007, 00:15 AM
De este tipo de Apis no se mucho, no entiendo como obtener el Handle. :( :( :(

Si usas Module32First no necesitas ningun HANDLE.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Freeze.

Encontre este codigo, pero no me da la ruta completa:

Private Type MODULEENTRY32
  dwSize As Long
  th32ModuleID As Long
  th32ProcessID As Long
  GlblcntUsage As Long
  ProccntUsage As Long
  modBaseAddr As Long
  modBaseSize As Long
  hModule As Long
  szModule As String * 256
  szExePath As String * 260
End Type
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, uProcess As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapshot As Long, uProcess As MODULEENTRY32) As Long
Private Sub Form_Load()
Dim uProcess As MODULEENTRY32
Form1.AutoRedraw = True
lProcessID = GetCurrentProcessId
hSnapshot = CreateToolhelp32Snapshot(8, 0)
uProcess.dwSize = Len(uProcess)
n = Module32First(hSnapshot, uProcess)
Do While n
Form1.Print Left(uProcess.szModule, InStr(uProcess.szModule, Chr(0)) - 1)
n = Module32Next(hSnapshot, uProcess)
Loop
End Sub

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Freeze.


HaDeS, -

#18
Editado: Este es mi Código::
Código (vb) [Seleccionar]

Private Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) 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 GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal Handle As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

Private Sub Command1_Click()
Dim Procesos() As Long, cb&, cb2&, cbNeeded&, Ret&, Proceso&, Modulos(1 To 200) As Long, Elementos&, NombrePath$

cb = 16
cbNeeded = 96
Do While cb <= cbNeeded
    cb = cb * 2
    ReDim Procesos(cb / 4)
    EnumProcesses Procesos(1), cb, cbNeeded
Loop
Elementos = cbNeeded / 4
For i = 1 To Elementos
Proceso = OpenProcess(1024 Or 16, 0, Procesos(i))
If Proceso <> 0 Then
    Ret = EnumProcessModules(Proceso, Modulos(1), 200, cb2)
    If Ret <> 0 Then
        NombrePath = Space(260)
        GetModuleFileNameExA Proceso, Modulos(1), NombrePath, 500
        If Procesos(i) <> GetCurrentProcessId Then
            NombrePath = Replace(Replace(NombrePath, "\systemroot\", "c:\windows\", , , vbTextCompare), "\??\", "")
            Text1.Text = Text1.Text & vbCrLf & NombrePath
            Text1.Text = Text1.Text & " - " & Procesos(i)
        End If
    End If
End If
CloseHandle Proceso
Next
End Sub


Saludos!

Editado: Para que el código te quede bien funcional, minimamente tenes que usar las apis, EnumProcess, OpenProcess, EnumProcessModules y GetModuleFileNameExA, porque si quitas por ejemplo EnumProcessModules, en el text1.text algunas lineas quedarían vacias y el resultado sería pésimo.

Eternal Idol

#19
De nada ►Freeze, para la segunda forma no necesitas usar mas que OpenProcess y GetModuleFileNameEx con 0 como el segundo parametro, ya que como indica la documentacion:

hModule
[in] Handle to the module. If this parameter is NULL, GetModuleFileNameEx returns the path of the executable file of the process specified in hProcess.

Por cierto si necesitas trabajar con servicios habilita el privilegio SE_DEBUG_NAME primero.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón