Текущий архив: 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.45 MB
Время: 0.063 c