using System;
using System.Text;
using System.Runtime.InteropServices;

namespace Kdt.CF.Utility
{
    public class Memory
    {
        static MEMORYSTATUS status = new MEMORYSTATUS();

        #region P/V invoke
        private struct MEMORYSTATUS
        {
            public UInt32 dwLength;
            public UInt32 dwMemoryLoad;
            public UInt32 dwTotalPhys;
            public UInt32 dwAvailPhys;
            public UInt32 dwTotalPageFile;
            public UInt32 dwAvailPageFile;
            public UInt32 dwTotalVirtual;
            public UInt32 dwAvailVirtual;
        }

        [DllImport("CoreDll.dll")]
        private static extern void GlobalMemoryStatus
        (
            ref MEMORYSTATUS lpBuffer
        );

        [DllImport("CoreDll.dll")]
        private static extern UInt32 GetSystemMemoryDivision
        (
            ref UInt32 lpdwStorePages,
            ref UInt32 lpdwRamPages,
            ref UInt32 lpdwPageSize
        );

        #endregion
        /// <summary>
        /// 更新内存信息
        /// </summary>
        public static void UpdateStatus()
        {
            GlobalMemoryStatus(ref status);
        }
        /// <summary>
        /// 系统物理内存
        /// </summary>
        public static UInt32 TotalPhysicalMemory
        {
            get
            {
                return status.dwTotalPhys;
            }
        }
        /// <summary>
        /// 可用物理内存
        /// </summary>
        public static UInt32 AvilablePhysicalMemory
        {
            get
            {
                return status.dwAvailPhys;
            }
        }
        /// <summary>
        /// 系统虚拟内存
        /// </summary>
        public static UInt32 TotalVirtualMemory
        {
            get
            {
                return status.dwTotalVirtual;
            }
        }
        /// <summary>
        /// 可用虚拟内存
        /// </summary>
        public static UInt32 AvilableVirtualMemory
        {
            get
            {
                return status.dwAvailVirtual;
            }
        }
        /// <summary>
        /// 系统页
        /// </summary>
        public static UInt32 TotalPageFile
        {
            get
            {
                return status.dwTotalPageFile;
            }
        }
        /// <summary>
        /// 可用页
        /// </summary>
        public static UInt32 AvilablePageFile
        {
            get
            {
                return status.dwAvailPageFile;
            }
        }
    }
}