Главная страница
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.029 c
3-1153372920
solenko
2006-07-20 09:22
2006.09.24
Поиогите составить запрос


15-1157435937
sanilo
2006-09-05 09:58
2006.09.24
Программы для рассылки факсов


15-1157135123
Nic
2006-09-01 22:25
2006.09.24
ИБП?


15-1157266346
Ketmar
2006-09-03 10:52
2006.09.24
Gero, ты клиента чинить будешь?


6-1146630038
unlink
2006-05-03 08:20
2006.09.24
idhttp косяк с прокси