Задача такая. Есть хендл или PID процесса в NT-драйвере. Как по этим данным получить путь к exe-файлу, запустившего процесс. Путь надо получить именно в драйвере и он должен быть полным.
Заранее благодарен за советы и помощь
Re: Получить путь exe-файла по handle процесса в NT
Здравствуйте MaxK, Вы писали:
MK>Задача такая. Есть хендл или PID процесса в NT-драйвере. Как по этим данным получить путь к exe-файлу, запустившего процесс. Путь надо получить именно в драйвере и он должен быть полным. MK>Заранее благодарен за советы и помощь
Я так из вопроса и не понял, тебе по процессу надо его путь или путь родительского процесса.
Ну да это без разницы почти.
Итак, определяем имя файла по ProcessHandle.
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryInformationProcess(
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass, //тута 0 надо
OUT PVOID ProcessInformation, //буфер, формат ниже
IN ULONG ProcessInformationLength, //типа его размер
OUT PULONG ReturnLength OPTIONAL //типа NULL засунь.
);
Так получаешь адрес PEB (PPEB PebBaseAddress) в адресном пространстве ТОГО процесса.
Если надо родителя — то тут можно взять ULONG InheritedFromUniqueProcessId — это Id родительского процесса.
А тут уже сам смотри, чего надо
UNICODE_STRING ImageFile;
UNICODE_STRING CommandLine;
Читать все через ZwReadVirtualMemory.
На самом деле это по барабану, в ядре или нет так делать.
Если в ядре — выхода в usermode не будет все равно.
Вот так.
Можно "проще", но это только для ядра.
Короче, берешь текущий EPROCESS.
У него по адресу 0xA0 сидит LIST_ENTRY ActiveProcessesList
Там и пробегайся по этим entries.
Только аккуратнее, там ссылки не на EPROCESS, а опять же на сами entries в этом списке. То есть смещение отнять придется. Вот так, пробежался и нашел процесс по идентификатору. А для найденного из EPROCESS берешь ссылку на PEB — и дальше как и раньше.