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.