Собственно, сабж. В данный момент я использую функции GetWindowThreadProcessId + CreateToolhelp32Snapshot/Process32First/Process32Next и OpenProcess/GetModuleFileNameEx, однако это не всегда дает положительный результат. В программе CyberManiac'а InqSoft Window Scanner (большой респект ему за такой великолепный инструмент!) есть "получение имени файла модуля внедрением DLL". Если это не представляет большого секрета, как именно это сделано?
Код (Text): // Для начала определяешь какому процессу принадлежит окно: Var pProcID : ^DWORD; begin GetMem (pProcID, SizeOf (DWORD)); GetWindowThreadProcessId (WinHandle, pProcID); end; // а после этого используешь TProcessEntry32 примерно так: function GetExeNameByProcID (ProcID : DWord) : String; var ContinueLoop : BOOL; FSnapshotHandle : THandle; FProcessEntry32 : TProcessEntry32; begin FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); Result := ''; while (Integer (ContinueLoop) <> 0) and (Result='') do begin if FProcessEntry32.th32ProcessID = ProcID then Result := FProcessEntry32.szExeFile; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; end; // Не забудь в uses добавить Tlhelp32 PS Просто рипнул из хелпа, это не моё. Может реализуешь неправильно?
PE_Kill, спасибо, но примерно так у меня все и реализовано. Меня интересует именно "получение имени файла модуля внедрением DLL".
GetWindowThreadProcessId OpenProcess WriteProcessMemory CreateRemoteThread Поиск рулит, о инжекте кода здесь кучу раз говорили.
Используем EnumProcessModules и GetModuleFileNameEx, для первого "модуля" получается полный путь до ехе, создавшего процесс. И не надо никаких DLL...
У меня прекрасно работает способ с ToolHelp API. Если не срабатывает полностью Process32*, используется Module32*. Алгоритм используется для получения иконок у упрямых процессов.