Ver Mensaje Individual
  #9  
Antiguo 31-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Reputación: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ese código devuelve el Path completo con nombre del ejecutable buscado por su ID, sin necesidad de ejecutar como administrador.

Si lo ejecutas como SYSTEM no tendrás problemas pero si no es así, puedes no tener permisos para abrir procesos. Es bueno tener en mente ambos sistemas que por otra parte hacen lo mismo.

Tu código puede tener un desbordamiento de buffer fácil al no pasar el tamaño del mismo y usar strcpy. Puedes pasar el tamaño y usar strncpy o resumirlo de esta otra forma pero siempre teniendo en cuenta ese importante detalle:

Código PHP:
typedef bool (__stdcall * PGETMODULEFILENAMEEX)(void*, void*, char*, unsigned long);

bool GetPathFromPID(int PID, char *FullPath, int Size)
{
   
HANDLE hProcess;
   
bool retval = false;
   
HINSTANCE hLib;
   
PGETMODULEFILENAMEEX pGetModuleFileNameEx;

   
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, PID);
   if(
hProcess){
      try{
         
hLib = LoadLibrary("psapi.dll");
         if(
hLib){
            
pGetModuleFileNameEx = (PGETMODULEFILENAMEEX)GetProcAddress(hLib,"GetModuleFileNameExA");
            if(
pGetModuleFileNameEx)
              
retval = pGetModuleFileNameEx(hProcess, 0, FullPath, Size);
         }
      }catch(...){}
      
CloseHandle(hProcess);
   }else{
      
//raise Exception.Create('El Programa No Se Encuentra Activo en Memoria');
   
}
   return 
retval;
} 
Otro detalle importante. Si usas WinXP tu código corriendo como SYSTEM va bien. En Win7 o Win8 no verás la ventana, tienen protegido el modo.

Saludos.
Responder Con Cita