Мне любопытно, что вы планируете делать с этой информацией?
Существует расширение windbg,! Address, которое может получить эту информацию, если вам не нужен код для этого. Сценарии отладчика, вероятно, будут намного надежнее, чтобы получить эту информацию.
VirtualQuery не может вернуть вам эту информацию самостоятельно, так как не знает, почему код режима пользователя запрашивает память. Вам нужно использовать его с другими источниками информации, чтобы получить эту информацию, и все же могут быть некоторые ошибки.
Во-первых, вы должны фильтровать только по памяти MEM_PRIVATE. , , Распределение кучи, стека и статики (при условии, что они были изменены) должны попадать в этот диапазон.
Статические распределения (глобальные и т. Д.) Должны осуществляться по адресу с загруженным модулем. Вы можете использовать PSAPI, чтобы определить, находится ли адрес в загруженном модуле, например, вызвать EnumProcessModules, а затем GetModuleInformation.
Значения стека, вы можете использовать API всплывающей подсказки, чтобы определить, находится ли ячейка памяти в стеке. CreateToolhelp32Snapshot с TH32CS_SNAPSHOT для получения потоков в целевом процессе, затем GetThreadContext и проверка, находится ли результирующий указатель стека в сегменте.
Я не знаю хорошего способа обхода извне. Toolhelp привязывает список кучи, но не дает хорошего набора границ для кучи памяти. Внутри этого процесса вы можете использовать GetProcessHeaps для обхода списка кучи, а затем вызвать HeapValidate, чтобы определить, находится ли область памяти внутри кучи.