VirtualQueryEx (kernel32)
Last changed: -186.136.223.176

.
Summary

C# Signature:

    [DllImport("kernel32.dll")]
    static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength);

Boo Signature:

[DllImport("kernel32.dll", SetLastError : true)]
def VirtualQueryEx(hProcess as IntPtr, lpAddress as IntPtr, ref lpBuffer as MEMORY_BASIC_INFORMATION, dwLength as UIntPtr) as UIntPtr:
     pass

C# User-Defined Types:

MEMORY_BASIC_INFORMATION

    [StructLayout(LayoutKind.Sequential)]
    public struct MEMORY_BASIC_INFORMATION
    {
        public IntPtr BaseAddress;
        public IntPtr AllocationBase;
        public uint AllocationProtect;
        public IntPtr RegionSize;
        public uint State;
        public uint Protect;
        public uint Type;
    }

For querying 64bit applications, use the following structure:

    [StructLayout(LayoutKind.Sequential)]
    public struct MEMORY_BASIC_INFORMATION64
    {
        public ulong BaseAddress;
        public ulong AllocationBase;
        public int AllocationProtect;
        public int __alignment1;
        public ulong RegionSize;
        public int State;
        public int Protect;
        public int Type;
        public int __alignment2;
    }

c# usefull Flags for MEMORY_BASIC_INFORMATION

Flags

    public enum AllocationProtect : uint
    {
        PAGE_EXECUTE = 0x00000010,
        PAGE_EXECUTE_READ = 0x00000020,
        PAGE_EXECUTE_READWRITE = 0x00000040,
        PAGE_EXECUTE_WRITECOPY = 0x00000080,
        PAGE_NOACCESS = 0x00000001,
        PAGE_READONLY = 0x00000002,
        PAGE_READWRITE = 0x00000004,
        PAGE_WRITECOPY = 0x00000008,
        PAGE_GUARD = 0x00000100,
        PAGE_NOCACHE = 0x00000200,
        PAGE_WRITECOMBINE = 0x00000400
    }

Notes:

VirtualQueryEx returns 0 on failure.

Tips & Tricks:

Please add some!

Sample Code:

The following code demonstrates how to list all regions within a process' memory address.

long MaxAddress = 0x7fffffff;
long address = 0;
do
{
    MEMORY_BASIC_INFORMATION m;
    int result = VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle, (IntPtr)address, out m, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
    Console.WriteLine("{0}-{1} : {2} bytes result={3}", m.BaseAddress, (uint)m.BaseAddress + (uint)m.RegionSize - 1, m.RegionSize, result);
    if (address == (long)m.BaseAddress + (long)m.RegionSize)
        break;
    address = (long)m.BaseAddress + (long)m.RegionSize;
} while (address <= MaxAddress);

Alternative Managed API:

Do you know one? Please contribute it!

Documentation