VirtualQuery (kernel32)
Last changed: 79.121.41.41

.
Summary

C# Signature:

[DllImport("kernel32.dll")]
private static extern UIntPtr VirtualQuery (
    UIntPtr lpAddress,
    out MEMORY_BASIC_INFORMATION lpBuffer,
    UIntPtr dwLength
);

User-Defined Types:

None.

Notes:

This code shows how to call the VirtualQuery function and how data structures must be prepared.

Tips & Tricks:

Please add some!

Sample Code:

class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        Memory memory = new Memory();
        memory.ShowMemory();

        Console.Read();
    }
}

class Memory
{
    [StructLayout(LayoutKind.Sequential)]
    public struct SYSTEM_INFO {
        internal PROCESSOR_INFO_UNION p;
        public uint dwPageSize;
        public UIntPtr lpMinimumApplicationAddress;
        public UIntPtr lpMaximumApplicationAddress;
        public UIntPtr dwActiveProcessorMask;
        public uint dwNumberOfProcessors;
        public uint dwProcessorType;
        public uint dwAllocationGranularity;
        public ushort wProcessorLevel;
        public ushort wProcessorRevision;
    };

    [StructLayout(LayoutKind.Explicit)]
    public struct PROCESSOR_INFO_UNION
    {
        [FieldOffset(0)]internal uint dwOemId;
        [FieldOffset(0)]internal ushort wProcessorArchitecture;
        [FieldOffset(2)]internal ushort wReserved;
    }

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

    SYSTEM_INFO system_info;
    MEMORY_BASIC_INFORMATION mbi;

    [DllImport("kernel32.dll")]
    private static extern UIntPtr VirtualQuery (
        UIntPtr lpAddress,
        out MEMORY_BASIC_INFORMATION lpBuffer,
        UIntPtr dwLength
    );

    [DllImport("kernel32.dll")]
    private static extern void GetSystemInfo(
        [MarshalAs(UnmanagedType.Struct)] out SYSTEM_INFO lpSystemInfo
    );

    public void ShowMemory()
    {
        int iSize;

        GetSystemInfo(out system_info);
        Console.WriteLine("dwProcessorType: {0}", system_info.dwProcessorType.ToString());
        Console.WriteLine("dwPageSize: {0}", system_info.dwPageSize.ToString());

        if (VirtualQuery((UIntPtr)system_info.dwPageSize,
                 out mbi,
                 (UIntPtr)System.Runtime.InteropServices.Marshal.SizeOf<MEMORY_BASIC_INFORMATION>()) != 0)
        {
            Console.WriteLine("AllocationBase: {0}", mbi.AllocationBase);
            Console.WriteLine("BaseAddress: {0}", mbi.BaseAddress);
            Console.WriteLine("RegionSize: {0}", mbi.RegionSize);
        }
        else
        {
            Console.WriteLine("ERROR: VirtualQuery() failed.");
        }
    }
}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation