MEMORY_BASIC_INFORMATION32 больше не является законным?

Я пытаюсь запросить информацию о памяти с помощью Windows API. Я хочу ориентироваться как на x86, так и на x64. Поэтому я прочитал документы о MEMORY_BASIC_INFORMATION и обнаружил, что мне нужно два, чтобы выполнить разные запросы в зависимости от "битности" целевого процесса.

Но когда я запрашиваю процесс x86 и использую структуру MEMORY_BASIC_INFORMATION32, я получаю системный код ошибки 24. В нем говорится, что длина команды недопустима.

Но когда я использую версию MEMORY_BASIC_INFORMATION64, вызов работает как для процессов x86, так и для x64. Что с этим. Это не то, что я понимаю, документация говорит мне. https://msdn.microsoft.com/en-us/library/windows/desktop/aa366775(v=vs.85).aspx

Так ли это поведение переносимо между версиями. Так может кто-нибудь объяснить это поведение. Или это просто моя система, которая полностью испорчена?

Это код, который я использую:

class Process {
     HANDLE m_handle;

     bool Process::query_impl(RemotePointer address, void *info, size_t size) {
           return VirtualQueryEx(m_handle, address.get(), (MEMORY_BASIC_INFORMATION*) info, size);
     }
public:

     bool Process::query(RemotePointer address, MEMORY_BASIC_INFORMATION64 &info) {
           return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION64));
     }

     bool Process::query(RemotePointer address,  MEMORY_BASIC_INFORMATION32 &info) {
           return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION32));
     }
}

Спасибо заранее.

0 ответов

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

Даже если вы заставите его каким-то образом работать, вы сможете запрашивать только нижние ~4 ГБ памяти.

По этой причине лучше всего скомпилировать отдельные двоичные файлы для каждой разрядности и просто использовать MEMORY_BASIC_INFORMATION, чтобы он разрешился с помощью макросов.

Другие вопросы по тегам