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