Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

GetModuleFileNameEx

22 views
Skip to first unread message

Ilya Fromsky

unread,
Apr 23, 2002, 3:11:22 PM4/23/02
to
Можно ли получить путь к исполняемому файлу чужого процесса не используя psapi?
Известен pid и имя процесса.

fro...@nm.ru

Alex Fedotov

unread,
Apr 23, 2002, 6:34:36 PM4/23/02
to
Wed Apr 24 2002 00:11, Ilya Fromsky wrote to All:

IF> Можно ли получить путь к исполняемому файлу чужого процесса не используя
IF> psapi? Известен pid и имя процесса.

Можно: http://www.rsdn.ru/?qna/?baseserv/enumproc.xml

-- Alex Fedotov

Ilya Fromsky

unread,
Apr 24, 2002, 5:31:11 AM4/24/02
to
Alex Fedotov wrote to Ilya Fromsky on tue, 23 apr 2002, 22:34:36:

IF>> Можно ли получить путь к исполняемому файлу чужого процесса не

IF>> используя psapi? Известен pid и имя процесса.

AF> Можно: http://www.rsdn.ru/?qna/?baseserv/enumproc.xml

Статья хорошая, но там этого нет.
Hужно на _голой_ NT4 путь к исполняемому файлу чужого процесса.


Известен pid и имя процесса.

fro...@nm.ru

Yury Haron

unread,
Apr 24, 2002, 6:00:00 AM4/24/02
to
Пpиветствyю Вас Ilya!

24 Апp 02 в 14:31, Ilya Fromsky сообщал Alex Fedotov:

IF> Статья хоpошая, но там этого нет.
IF> Hyжно на _голой_ NT4 пyть к исполняемомy файлy чyжого пpоцесса.
IF> Известен pid и имя пpоцесса.

Если пpав хватит, то, напpимеp, так:

DebugActiveProcess(pid);
WaitForDebugEvent(&dbge, INFINITE);
Ждёшь полyчения CREATE_PROCESS_DEBUG_INFO
и беpёшь оттyда lpImageName

Только потом сам пpидyмывай как от него отцепиться :)

Hа чем и пpощаюсь,
Юpа.

Alex Fedotov

unread,
Apr 24, 2002, 12:58:04 PM4/24/02
to
Ilya Fromsky wrote:

AF>> Можно: http://www.rsdn.ru/?qna/?baseserv/enumproc.xml

IF> Статья хорошая, но там этого нет.
IF> Hужно на _голой_ NT4 путь к исполняемому файлу чужого процесса.
IF> Известен pid и имя процесса.

Да, виноват, пути там действительно нет. Придется PEB напрямую читать.

Во всех процессах PEB находится по адресу 0x7FFDF000, так что можно смело
использовать ReadProcessMemory, чтобы прочитать его содержимое в другом
процессе (для пущей верности можно воспользоваться ZwQueryInformationProcess,
чтобы получить этот адрес). В PEB есть указатель на структуру
PROCESS_PARAMETERS, а в ней хранится путь к исполняемому файлу в поле
ApplicationName.

Похожий пример можно найти на http://www.codepile.com/tric14.shtml, там
определяется командная строка процесса, которая лежит по соседству.

-- Alex Fedotov

Leonid Troyanovsky

unread,
Apr 24, 2002, 3:26:11 PM4/24/02
to
Приветствую, Alex.

Alex Fedotov wrote:

> процессе (для пущей верности можно воспользоваться ZwQueryInformationProcess,
> чтобы получить этот адрес).

Можно спросить и у самого процесса

program getcommandline;

{$APPTYPE CONSOLE}

uses
windows, sysutils;

var
hProcess : THandle;
Pid : DWord ;
BytesRead: DWord ;
hThread : THandle;
dwThreadId : DWord;
ThreadExitCode: DWord;
buffer: array [0..MAX_PATH] of char;

begin
hProcess := 0;

pid := StrToInt(ParamStr(1));

try
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, Pid);
if (hProcess = 0) then
RaiseLastWin32Error;

hThread := CreateRemoteThread( hProcess,
nil,
0,
GetProcAddress( GetModuleHandle('KERNEL32.DLL'),
'GetCommandLineA'),
nil,
0,
dwThreadId);

if (hThread = 0) then
RaiseLastWin32Error;

WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, ThreadExitCode);
CloseHandle(hThread);

if not (ReadProcessMemory( hProcess,
Pointer(ThreadExitCode),
@buffer ,
SizeOf(Buffer),
BytesRead)) then
RaiseLastWin32Error;

finally
if ( hProcess <> 0) then
CloseHandle(hProcess);
end;

writeln(buffer);
readln;
end.

И есть ли на rsdn ссылка на http://www.mvps.org/win32/main.html ?

--
С уважением, LVT.

Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Alex Fedotov

unread,
Apr 24, 2002, 6:36:30 PM4/24/02
to
Leonid Troyanovsky wrote:

>> процессе (для пущей верности можно воспользоваться
>> ZwQueryInformationProcess, чтобы получить этот адрес).

LT> Можно спросить и у самого процесса

Это не совсем то. Этот код возвращает командную строку, которая, вообще
говоря, не обязана содержать в себе полный путь к exe-файлу.

LT> И есть ли на rsdn ссылка на http://www.mvps.org/win32/main.html ?

Есть: http://www.rsdn.ru/res/?links.xml?page=winapi

-- Alex Fedotov

Leonid Troyanovsky

unread,
Apr 25, 2002, 12:08:16 AM4/25/02
to
Приветствую, Alex.

Thu Apr 25 2002 03:36, Alex Fedotov wrote to Leonid Troyanovsky:

LT> Можно спросить и у самого процесса

> Это не совсем то. Этот код возвращает командную строку, которая, вообще
> говоря, не обязана содержать в себе полный путь к exe-файлу.

FindExecutable ?

Вообще, мне просто не хотелось приводить большой кусок кода.
Hу, а в модификации Prasad Dubak описанной Д.Рихтером техники,
это выглядит приблизительно так (на примере установки переменных
окружения в чужом процессе)

http://groups.google.com/groups?selm=516800117%40p2.f175.n5020.z2.ftn

Кстати, если на rsdn уважают уважаемых дельферов, может дать
ссылку на полезный для NT сайт Colin Wilson:

http://www.wilsonc.demon.co.uk/delphi.htm

С уважением, LVT

0 new messages