Obtener ruta y nombre de archivo por el PID

Iniciado por Distorsion, 12 Enero 2011, 15:26 PM

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

Distorsion

Buenas,

estoy obteniendo unos PIDs de proceso y me gustaría obtener la ruta y el nombre del archivo en modo usuario. He estado buscando pero no he visto una API que lo haga directo, alguien conoce alguna? O tendré que recorrer la lista de procesos buscando el proceso que coincida con el PID y buscarme la vida?


Gracias ;-)

Littlehorse

Código (cpp) [Seleccionar]
  ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
  if (ProcessHandle)
    if (GetModuleFileNameEx(ProcessHandle, NULL, FileName, sizeof FileName))
         cout << FileName << endl;
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Distorsion

#include <windows.h>
#include <psapi.h>
#include <tchar.h>

#include <stdio.h>


int main()
{
  HANDLE processHandle = NULL;
  TCHAR filename[MAX_PATH];

  processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3468);
  if (processHandle) {
    if (GetModuleFileName(processHandle, filename, sizeof(filename))) {
printf("Ruta: %s\n", filename);
    }
    CloseHandle(processHandle);
  } else {
    printf("error\n");
  }
  getchar();
  return 0;
}


Ya lo intente con este código, pero no me devuelve una ruta ni nada, me falla la función :(

Igualmente de esta manera hay que hacer un openproces con lo que no podre abrir cualquier proceso, por ejemplo el lsa.exe y no podre obtener su ruta.

Para solucionar esto ultimo estoy pensando en lanzar la aplicación en modo system, que nos e como, o directamente sacar la ruta desde el driver, ya que el pid lo saco desde el driver y lo comunico a una aplicación en modo usuario.

Gracias por la ayuda.

Littlehorse

Claro que va a fallar. Tenes que usar GetModuleFileNameEx, no GetModuleFileName. De hecho ni siquiera son los mismos parámetros, lee la documentación de la MSDN.

Código (cpp) [Seleccionar]

DWORD WINAPI GetModuleFileNameEx(
  __in      HANDLE hProcess,
  __in_opt  HMODULE hModule,
  __out     LPTSTR lpFilename,
  __in      DWORD nSize
);



CitarTo locate the file for a module that was loaded by another process, use the GetModuleFileNameEx function.

hModule [in, optional]

    A handle to the module. If this parameter is NULL, GetModuleFileNameEx returns the path of the executable file of the process specified in hProcess.




Citar
Igualmente de esta manera hay que hacer un openproces con lo que no podre abrir cualquier proceso, por ejemplo el lsa.exe y no podre obtener su ruta.

En el ejemplo yo puse PROCESS_ALL_ACCESS para escribir menos pero lo correcto es utilizar solo lo necesario, lo cual en el caso de GetModuleFileNameEx es PROCESS_QUERY_INFORMATION y PROCESS_VM_READ por lo que no debería haber demasiado problema con la mayoría de los procesos y en caso de haberlo te basta con ajustar los privilegios correctamente.

Por otro lado, obviamente existe una limitación al querer hacerlo desde modo usuario, pero eso es un tema aparte. La limitación la instalas vos desde un principio al querer hacerlo desde modo usuario.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Distorsion

Es verdad :-[ No era la misma función :-[ Ya lo he solucionado, aunque los procesos en modo system no puedo listar su ubicación, no puedo usar openproces correctamente y nose como ajustar los privilegios de mi aplicación a system :-[

Lo he querido hacer en modo usuario por que no he encontrado la manera de hacerlo en el driver, tengo un el major de un driver hookeado y no he sido capaz de sacar el path de las aplicaciones que lo usan, solo sacar el PID con PsGetCurrentProcessId().

Gracias por la ayuda ;-)

Distorsion

Solucionado! Ya se ponerle privilegios de depuración, el problema es que tengo que darle al botón derecho y ejecutar como administrador, alguna solución a eso? Sino es un engorro si quiero automatizar la ejecución.

Gracias ;-)