Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PID -> ExeName


Чапаев ©   (2006-05-22 10:44:00) 

Собственно, нужно по идентификатору процесса получить имя исполняемого файла.

Пользуюсь такой функцией (почти перевод MSDN'a на Делфи):

var
 Proc:THandle;
 Modules:array [0..$3FFF] of THandle;
 Count:Cardinal;
 FileName:array [Byte] of Char;
begin
 Result:='';
 Proc:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID);
 if Proc=0 then
   Exit;
 EnumProcessModules(Proc,@Modules,$4000*SizeOf(THandle),Count);
     Count:=GetModuleFileNameEx(Proc,Modules[0],FileName,SizeOf(FileName));
 if Count>0 then begin
   Result:=FileName;
 end;
end;

Или такой:

var
 Snapshot:THandle;
 ME:MODULEENTRY32;
begin
 Snapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
 ME.dwSize:=SizeOf(ME);
 if Module32First(Snapshot,ME)
   then Result:=ME.szExePath
   else Result:='';
 CloseHandle(Snapshot);
end;


Функция вызывается по таймеру для вновь созданных процессов в цикле repeat ... until ExeName<>''. Для большинства процессов несколько первых вызовов функции неуспешны, для некоторых (mspaint) -- неуспешны все вызовы. SysErrorMessage(GetLastError) после EnumProcessModules() в таком случае выдаёт что-то вроде "Память может быть прочитана только частично" (дословно сообщение не помню).

Люди добрые, мы сами не местные, поможите, кто чем может!


uncle_lenia   (2006-05-24 14:24:00) [1]

function GetModuleNameInVerPlatformWin32NT(dwProcessId: DWORD): String;
var
 hProcHand: THandle;
 cbNeeded: DWORD;
 Module: HMODULE;
 ModuleName: array[0..MAX_PATH] of Char;
begin
 hProcHand := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
   False, dwProcessId);
 EnumProcessModules(hProcHand, @Module, 4, cbNeeded);
 SetString(Result, ModuleName,
   GetModuleFileNameEx(hProcHand, Module, ModuleName, SizeOf(ModuleName)));
 if hProcHand <> 0 then
   CloseHandle(hProcHand);
end;


Чапаев   (2006-05-24 13:26:00) [2]


 Proc:=OpenProcess(PROCESS_ALL_ACCESS{PROCESS_QUERY_INFORMATION or PROCESS_VM_READ},False,PID);
 if Proc=0 then
   Exit;
//взято из FAQ DelphiWorld    
 if OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS, Token) then
//пробовал так же первым параметром передавать Proc
//права доступа ALL_ACCESS выставил только пробы ради
begin
   tp.PrivilegeCount := 1;
   LookupPrivilegeValue(nil,'SeDebugPrivilege', tp.Privileges[0].Luid)ж
   tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(Token, False, TP, SizeOf(TP), nil, Count);
 end;
//Lookup и Adjust выполняются успешно

 //Вот тут находится одна из приведенных в исходном сообщении функций
 //Всё равно получаю ту самую ошибку.

 CloseHandle(Token);
 CloseHandle(Proc);


Чапаев   (2006-05-22 12:40:00) [3]


> если в GetModuleFileNameEx вторым параметром можно передать
> 0

Попробую, но, помнится, были с этой функцией проблемы... Какие именно -- забыто за давностью лет.


> SeDebugPrivilege установи

Попробую.


Игорь Шевченко   (2006-05-22 11:03:00) [4]

SeDebugPrivilege установи


begin...end   (2006-05-22 11:01:00) [5]

В чём смысл вызова EnumProcessModules, если в GetModuleFileNameEx вторым параметром можно передать 0?


Наверх

Титульная страница Поиск, карта сайта Написать письмо