Torna al Thread
[DllImport("kernel32.dll")]
static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags, StringBuilder lpExeName, ref int lpdwSize);
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessRights dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[Flags]
enum ProcessAccessRights
{
PROCESS_QUERY_INFORMATION = 0x0400,
PROCESS_QUERY_LIMITED_INFORMATION = 0x1000,
PROCESS_CREATE_THREAD = 0x0002,
PROCESS_VM_OPERATION = 0x0008,
PROCESS_VM_WRITE = 0x0020,
PROCESS_VM_READ = 0x0010
}
[DllImport("kernel32.dll")]
static extern bool CloseHandle(IntPtr hObject);
private string[] GetProcessesPaths(string processName)
{
//Ottiene i processi in base al nome
Process[] processes = Process.GetProcessesByName(processName);
//Crea l'array del risultato
string[] result = new string[processes.Length];
//Itera fra i processi trovati
for (int i = 0; i < processes.Length; i++)
{
//Ottiene l'handle di sistema per il processo
IntPtr handle = OpenProcess(ProcessAccessRights.PROCESS_QUERY_INFORMATION, false, processes[i].Id);
//la dimensione massima del percorso
int sz = 512;
//Crea uno stringBuilder che riceverà il nome del processo
StringBuilder sb = new StringBuilder(sz);
//Ottiene il percorso completo processo
QueryFullProcessImageName(handle, 0, sb, ref sz);
//imposta il percorso
result[i] = sb.ToString();
//Rilascia l'handle del processo
CloseHandle(handle);
}
//Ritorna il risultato
return result;
}