Ich bin neugierig, was Sie mit diesen Informationen zu tun gedenken.
Es gibt eine windbg-Erweiterung, !address, die Ihnen diese Informationen liefern kann, wenn Sie keinen Code dafür benötigen. Ein Skript für den Debugger wird wahrscheinlich viel zuverlässiger sein, um diese Informationen zu erhalten.
VirtualQuery kann Ihnen diese Informationen nicht selbst zurückgeben, da es keine Ahnung hat, warum der Benutzermoduscode den Speicher angefordert hat. Sie müssen es mit anderen Informationsquellen verwenden, um diese Informationen zu erhalten, und es kann immer noch einige Fehlerfälle geben.
Zunächst sollten Sie nur nach MEM_PRIVATE-Speicher filtern Heap-, Stack- und statische Zuweisungen (sofern sie geändert wurden) sollten in diesen Bereich fallen.
Statische Zuweisungen (Globals usw.) sollten an einer Adresse mit einem geladenen Modul liegen. Sie können PSAPI verwenden, um festzustellen, ob die Adresse in einem geladenen Modul liegt, indem Sie z.B. EnumProcessModules und dann GetModuleInformation aufrufen.
Stack-Werte, können Sie die toolhelp-API verwenden, um festzustellen, ob sich der Speicherplatz in einem Stack befindet. CreateToolhelp32Snapshot mit TH32CS_SNAPSHOT, um Threads im Zielprozess zu erhalten, dann GetThreadContext und prüfen, ob der resultierende Stapelzeiger innerhalb des Segments liegt.
Ich kenne keinen guten Weg, um Haufen von außerhalb des Prozesses zu gehen. Toolhelp schnappt sich eine Heap-Liste, aber gibt Ihnen keinen guten Satz von Grenzen für den Heap-Speicher. Innerhalb des Prozesses können Sie GetProcessHeaps verwenden, um die Liste der Heaps zu durchsuchen, und dann HeapValidate aufrufen, um festzustellen, ob der Speicherplatz innerhalb des Heaps liegt.