Io userei la VirtualQuery (per il processo corrente) o la VirtualQueryEx (per lavorare su un altro processo) cercando informazioni su un tot di blocchi di pagine alla volta; si ottiene così un array di strutture MEMORY_BASIC_INFORMATION, di cui quelle che ti interessano sono solo quelle in commit (MEM_COMMIT) e senza protezione PAGE_NOACCESS. Difficile decidere come gestire le guard pages (modificatore PAGE_GUARD), dato che se le leggi viene sollevata un'eccezione STATUS_GUARD_PAGE_VIOLATION, che dovresti far sparire per poi resettare lo stato di guard page della pagina dopo che l'hai controllata.
Naturalmente per ottenere risultati sensati la scansione va fatta "a bocce ferme", ovvero con tutti i thread del processo esaminato in pausa, altrimenti otterrai risultati senza senso.