![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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?