Есть handle запущенного PE файла. Как определить откуда он был запущен?

 

Я так предполагаю что getmodulefilename как и GetModuleHandle

работает в рамках только своего процесса.

 

А решить твою задачу .. можно так:

Тут парочка моих любимых функций

Code:

uses

tlhelp32;

 

type

TModuleArray = array of TModuleEntry32;

 

// Возвращает список описаний (TModuleEntry32) модулей по идентификатору процесса

function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray;

 

implementation

 

function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray;

var

hSnapshot : THandle;

lpme : TModuleEntry32;

 

procedure AddModuleToList;

begin

SetLength(Result,High(Result)+2);

Result[high(Result)]:=lpme;

end;

 

begin

SetLength(Result,0);

hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessId);

if hSnapshot=-1 then RaiseLastWin32Error;

lpme.dwSize:=SizeOf(lpme);

if Module32First(hSnapshot,lpme) then

begin

AddModuleToList;

while Module32Next(hSnapshot,lpme) do AddModuleToList;

end;

end;

 

 

Code:

VAR Wnd : hWnd;

buff: ARRAY [0..127] OF Char;

//------------------------------------

Pid : Cardinal;

modarr : TModuleArray;

Name : String;

//------------------------------------

begin

StringGrid1.RowCount:=1;

Wnd := GetWindow(Handle, gw_HWndFirst);

WHILE Wnd <> 0 DO

BEGIN

IF (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) THEN

BEGIN

fillchar(name,sizeof(name),#0);

GetWindowText(wnd,buff,sizeof(buff));

// if getmodulefilename(GetWindowLong(wnd,GWL_HINSTANCE),name,sizeof(name))=0

// then name:='Null';

//-----------------------------------------

GetWindowThreadProcessId(Wnd,@Pid);

modarr:=GetModulesListByProcessId(Pid);

name:='Null';

for i:=0 to High(modarr) do

begin

if Integer(modarr[i].modBaseAddr)=$400000 then

begin

name:=modarr[i].szExePath;

break;

end;

end;

//-----------------------------------------

StringGrid1.Cells[0,StringGrid1.RowCount-1]:=StrPas(buff);

StringGrid1.Cells[1,StringGrid1.RowCount-1]:=StrPas(name);

StringGrid1.RowCount:=StringGrid1.RowCount+1;

END;

Wnd := GetWindow(Wnd, gw_hWndNext);

END;

StringGrid1.RowCount:=StringGrid1.RowCount-1;

end;

 Автор ответа: TAPAKAH

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить