getprocessmemoryinfo (psapi)
Last changed: -93.61.102.184

.
Summary
Reads a process memory usage

C# Signature:

[DllImport("psapi.dll", SetLastError=true)]
static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS counters, uint size);

VB Signature:

Declare Function GetProcessMemoryInfo Lib "psapi.dll" (TODO) As TODO
Declare Function GetProcessMemoryInfo Lib "PSAPI.DLL" (ByVal hProcess As Integer, ByRef ppsmemCounters As PROCESS_MEMORY_COUNTERS, ByVal cb As Integer ) As Integer

User-Defined Types:

[StructLayout(LayoutKind.Sequential, Size=72)]
private struct PROCESS_MEMORY_COUNTERS
{
    public uint cb;
    public uint PageFaultCount;
    public UInt64 PeakWorkingSetSize;
    public UInt64 WorkingSetSize;
    public UInt64 QuotaPeakPagedPoolUsage;
    public UInt64 QuotaPagedPoolUsage;
    public UInt64 QuotaPeakNonPagedPoolUsage;
    public UInt64 QuotaNonPagedPoolUsage;
    public UInt64 PagefileUsage;
    public UInt64 PeakPagefileUsage;
}

//simpler, but 32 bit only

[StructLayout(LayoutKind.Sequential, Size=40)]
private struct PROCESS_MEMORY_COUNTERS
{
    public uint cb;
    public uint PageFaultCount;
    public int PeakWorkingSetSize;
    public int WorkingSetSize;
    public int QuotaPeakPagedPoolUsage;
    public int QuotaPagedPoolUsage;
    public int QuotaPeakNonPagedPoolUsage;
    public int QuotaNonPagedPoolUsage;
    public int PagefileUsage;
    public int PeakPagefileUsage;
}

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

   [DllImport("kernel32.dll")]
   private static extern IntPtr GetCurrentProcess();

   [StructLayout(LayoutKind.Sequential, Size = 40)]
   private struct PROCESS_MEMORY_COUNTERS
   {
      public uint cb;             // The size of the structure, in bytes (DWORD).
      public uint PageFaultCount;         // The number of page faults (DWORD).
      public uint PeakWorkingSetSize;     // The peak working set size, in bytes (SIZE_T).
      public uint WorkingSetSize;         // The current working set size, in bytes (SIZE_T).
      public uint QuotaPeakPagedPoolUsage;    // The peak paged pool usage, in bytes (SIZE_T).
      public uint QuotaPagedPoolUsage;    // The current paged pool usage, in bytes (SIZE_T).
      public uint QuotaPeakNonPagedPoolUsage; // The peak nonpaged pool usage, in bytes (SIZE_T).
      public uint QuotaNonPagedPoolUsage;     // The current nonpaged pool usage, in bytes (SIZE_T).
      public uint PagefileUsage;          // The Commit Charge value in bytes for this process (SIZE_T). Commit Charge is the total amount of memory that the memory manager has committed for a running process.
      public uint PeakPagefileUsage;      // The peak value in bytes of the Commit Charge during the lifetime of this process (SIZE_T).
   }

   [DllImport("psapi.dll", SetLastError = true)]
   static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS counters, uint size);

   // ...

   IntPtr currentProcessHandle = GetCurrentProcess();
   PROCESS_MEMORY_COUNTERS memoryCounters;
   //unsafe
   //{
   //   memoryCounters.cb = (uint) sizeof (PROCESS_MEMORY_COUNTERS);
   //}
   // Do nor use unsafe here, use Marshal.SizeOf() :-)
   memoryCounters.cb = (uint)Marshal.SizeOf(typeof(PROCESS_MEMORY_COUNTERS));
   if (GetProcessMemoryInfo(currentProcessHandle, out memoryCounters, memoryCounters.cb))
   {
      // Work with memoryCounters
      // ...
   }

   // TODO: Throw a dedicated exception
   throw new Exception("GetProcessMemoryInfo returned false. Error Code is " +
      Marshal.GetLastWin32Error());