Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.043 c
2-1157624743
VitV
2006-09-07 14:25
2006.09.24
Построение диаграммы


1-1154450022
Tanya
2006-08-01 20:33
2006.09.24
Вытащить текст из дочернего окна


11-1131206189
MTsv DN
2005-11-05 18:56
2006.09.24
Ручная прорисовка TreeView


15-1157116694
ArtemESC
2006-09-01 17:18
2006.09.24
Я - чайник...


2-1157286193
цунами
2006-09-03 16:23
2006.09.24
LongWord + DWord





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский