VirtualQuery (kernel32)
Last changed: 79.121.41.41

.
Summary

C# Signature:

[DllImport("kernel32.dll")]
private static extern int VirtualQuery (ref uint lpAddress,
    ref MEMORY_BASIC_INFORMATION lpBuffer,
    int dwLength
);

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

using System;

using System.Runtime.InteropServices;

namespace VirtualQuery

{

    class Class1
    {

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

            Console.Read();
        }
    }

    unsafe class Memory
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct SYSTEM_INFO {
            internal PROCESSOR_INFO_UNION p;
            public uint dwPageSize;
            public uint lpMinimumApplicationAddress;
            public uint lpMaximumApplicationAddress;
            public uint dwActiveProcessorMask;
            public uint dwNumberOfProcessors;
            public uint dwProcessorType;
            public uint dwAllocationGranularity;
            public uint wProcessorLevel;
            public uint 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 uint BaseAddress;
            public uint AllocationBase;
            public uint AllocationProtect;
            public uint RegionSize;
            public uint State;
            public uint Protect;
            public uint Type;
        }

        SYSTEM_INFO system_info;
        MEMORY_BASIC_INFORMATION mbi;

        [DllImport("kernel32.dll")]
        private static extern int VirtualQuery (ref uint lpAddress,
            ref MEMORY_BASIC_INFORMATION lpBuffer,
            int dwLength
        );

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

        public Memory()
        {
            system_info = new SYSTEM_INFO();
            mbi = new MEMORY_BASIC_INFORMATION();
        }

        public void ShowMemory()
        {
            int iSize;

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

            if (VirtualQuery(ref system_info.dwPageSize,
                ref mbi,
                (int)System.Runtime.InteropServices.Marshal.SizeOf(mbi)) != 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