Как я могу получить путь к исполняемому файлу 64-битного процесса, учитывая его PID от 32-битного процесса? - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над приложением C ++ Windows, 32-разрядным, которое по независящим от меня причинам должно оставаться 32-разрядным. Это приложение должно иметь возможность получить полный путь к исполняемому файлу других процессов выполнения с заданным PID.

Обычно для 64-разрядного приложения вы можете использовать OpenProcess(), чтобы получить дескриптор процесса с помощью конкретный PID, а затем передать дескриптор, который он возвращает GetModuleFileNameEx(), чтобы получить путь к исполняемому файлу. Однако OpenProcess() завершится неудачно, если вы попытаетесь получить дескриптор 64-битного процесса из 32-битного процесса, поэтому этот метод мне недоступен. (Это общепринятое решение этого вопроса , но поскольку ни он, ни другие его ответы не решают проблему доступа к 64-битным процессам из 32-битного процесса, он не отвечает на мой вопрос.)

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 21 апреля 2020

В комментариях уже упоминалось несколько способов. Вероятно, лучшим и простым способом было бы открыть процесс с PROCESS_QUERY_LIMITED_INFORMATION и вызвать QueryFullProcessImageName, как писали Реми Лебо и RbMm.

Тем не менее, позвольте мне показать другой способ: вы можете использовать WMI. Обратите внимание, что это далеко не лучший вариант (так как он очень «дорогой» за кулисами), но если по какой-то причине вы не можете использовать другие опции, это может быть полезно знать.

Класс WMI Win32_Process имеет поле ExecutablePath, которое содержит информацию, которую вы ищете. Вы также сможете читать его из 32-разрядного процесса.

Вот описание , как читать данные из WMI с помощью C ++ .

Пример в PowerShell :

PS Z:\> Get-WmiObject -Query 'Select ExecutablePath From Win32_Process Where ProcessId = 6056'


__GENUS          : 2
__CLASS          : Win32_Process
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ExecutablePath   : C:\Program Files (x86)\Moo0\AlwaysOnTop 1.24\WindowMenuPlus64.exe
PSComputerName   :
...