IF> Можно ли получить путь к исполняемому файлу чужого процесса не используя
IF> psapi? Известен pid и имя процесса.
Можно: http://www.rsdn.ru/?qna/?baseserv/enumproc.xml
-- Alex Fedotov
IF>> Можно ли получить путь к исполняемому файлу чужого процесса не
IF>> используя psapi? Известен pid и имя процесса.
AF> Можно: http://www.rsdn.ru/?qna/?baseserv/enumproc.xml
Статья хорошая, но там этого нет.
Hужно на _голой_ NT4 путь к исполняемому файлу чужого процесса.
Известен pid и имя процесса.
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а.
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
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
>> процессе (для пущей верности можно воспользоваться
>> ZwQueryInformationProcess, чтобы получить этот адрес).
LT> Можно спросить и у самого процесса
Это не совсем то. Этот код возвращает командную строку, которая, вообще
говоря, не обязана содержать в себе полный путь к exe-файлу.
LT> И есть ли на rsdn ссылка на http://www.mvps.org/win32/main.html ?
Есть: http://www.rsdn.ru/res/?links.xml?page=winapi
-- Alex Fedotov
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