MEMORY_BASIC_INFORMATION и VirtualQueryEx на разных архитектурах - PullRequest
0 голосов
/ 24 марта 2020

Страница MSDN для MEMORY_BASIC_INFORMATION указывает в разделе замечаний, что MEMORY_BASIC_INFORMATION32 и MEMORY_BASIC_INFORMATION64 следует указывать в ситуациях, когда целевой процесс выполняется в другой архитектуре, чем программа запроса (при использовании VirtualQueryEx) ). Я также нашел несколько сообщений SO, которые указали на это в своих ответах на связанные вопросы. Однако я обнаружил, что версия MEMORY_BASIC_INFORMATION, которую мне передавал VirtualQUeryEx, была такой же, как и архитектура моей программы, несмотря на целевую. Я хочу убедиться, что я правильно анализирую информацию из VirtualQueryEx. Мне действительно нужно указывать версию MEMORY_BASIC_INFORMATION, которую я использую, чтобы соответствовать архитектуре цели? Если так, то почему VirtualQueryEx возвращает только версию архитектуры моей программы и как я могу обойти это?

1 Ответ

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

По моему опыту, лучшее решение - использовать обычный макрос MEMORY_BASIC_INFORMATION и создать отдельный исполняемый файл для x86 и x64. Кроме того, используйте макрос для всех адресов, смещений и указателей, которые соответствуют правильному размеру в зависимости от архитектуры, для которой вы строите. Затем используйте соответствующий исполняемый файл на основе архитектуры целевого процесса. Это приведет к наименьшей головной боли.

В этом случае, если вы используете MEMORY_BASIC_INFORMATION из процесса x64 и нацеливаетесь на процесс x86 или x64, он должен работать нормально. Но я не предполагаю, что это будет работать со всеми структурами и Windows API-функциями, поскольку это только приведет к неприятностям в будущем, поэтому я рекомендую описанный выше метод.

...