Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

PID -> ExeName   Найти похожие ветки 

 
Чапаев ©   (2006-05-22 10:44) [0]

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

Пользуюсь такой функцией (почти перевод 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() в таком случае выдаёт что-то вроде "Память может быть прочитана только частично" (дословно сообщение не помню).

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


 
begin...end ©   (2006-05-22 11:01) [1]

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


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

SeDebugPrivilege установи


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


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

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


> SeDebugPrivilege установи

Попробую.


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


 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);


 
uncle_lenia ©   (2006-05-24 14:24) [5]

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;



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
1-1155211730
Igor_thief
2006-08-10 16:08
2006.09.24
Работа с браузером


2-1157606833
WeeK
2006-09-07 09:27
2006.09.24
Нет курсора


15-1157100238
Nail
2006-09-01 12:43
2006.09.24
Как в Delphi....


1-1155282476
Zilog_
2006-08-11 11:47
2006.09.24
Ребята помогите разобраться с переводом с С++ в Делфи


15-1157493318
Palladin
2006-09-06 01:55
2006.09.24
Гэндальф