Created
April 7, 2017 22:57
-
-
Save sean-m/ec10b1598932abbed0bf6b53ea380f91 to your computer and use it in GitHub Desktop.
PowerShell wrapper fro the GetPerformanceInfo system call
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# PowerShell wrapper fro the GetPerformanceInfo system call #> | |
function Get-PerformanceInfo { | |
## Liberally taken from Pinvoke.net, thank you whoever contributed that | |
## http://www.pinvoke.net/default.aspx/psapi/GetPerformanceInfo.html | |
Add-Type -Language CSharp -TypeDefinition @" | |
using System; | |
using System.Runtime.InteropServices; | |
public static class PerformanceInfo | |
{ | |
[DllImport("psapi.dll", SetLastError = true)] | |
[return: MarshalAs(UnmanagedType.Bool)] | |
private static extern bool GetPerformanceInfo([Out] out PsApiPerformanceInformation PerformanceInformation, [In] int Size); | |
[StructLayout(LayoutKind.Sequential)] | |
public struct PsApiPerformanceInformation | |
{ | |
public int Size; | |
public IntPtr CommitTotal; | |
public IntPtr CommitLimit; | |
public IntPtr CommitPeak; | |
public IntPtr PhysicalTotal; | |
public IntPtr PhysicalAvailable; | |
public IntPtr SystemCache; | |
public IntPtr KernelTotal; | |
public IntPtr KernelPaged; | |
public IntPtr KernelNonPaged; | |
public IntPtr PageSize; | |
public int HandlesCount; | |
public int ProcessCount; | |
public int ThreadCount; | |
} | |
public static PerfomanceInfoData GetPerformanceInfo() { | |
PerfomanceInfoData data = new PerfomanceInfoData(); | |
PsApiPerformanceInformation perfInfo = new PsApiPerformanceInformation(); | |
if (GetPerformanceInfo(out perfInfo, Marshal.SizeOf(perfInfo))) { | |
/// data in pages | |
data.CommitTotalPages = perfInfo.CommitTotal.ToInt64(); | |
data.CommitLimitPages = perfInfo.CommitLimit.ToInt64(); | |
data.CommitPeakPages = perfInfo.CommitPeak.ToInt64(); | |
/// data in bytes | |
Int64 pageSize = perfInfo.PageSize.ToInt64(); | |
data.PhysicalTotalBytes = perfInfo.PhysicalTotal.ToInt64() * pageSize; | |
data.PhysicalAvailableBytes = perfInfo.PhysicalAvailable.ToInt64() * pageSize; | |
data.SystemCacheBytes = perfInfo.SystemCache.ToInt64() * pageSize; | |
data.KernelTotalBytes = perfInfo.KernelTotal.ToInt64() * pageSize; | |
data.KernelPagedBytes = perfInfo.KernelPaged.ToInt64() * pageSize; | |
data.KernelNonPagedBytes = perfInfo.KernelNonPaged.ToInt64() * pageSize; | |
data.PageSizeBytes = pageSize; | |
/// counters | |
data.HandlesCount = perfInfo.HandlesCount; | |
data.ProcessCount = perfInfo.ProcessCount; | |
data.ThreadCount = perfInfo.ThreadCount; | |
} | |
return data; | |
} | |
} | |
public class PerfomanceInfoData | |
{ | |
public Int64 CommitTotalPages; | |
public Int64 CommitLimitPages; | |
public Int64 CommitPeakPages; | |
public Int64 PhysicalTotalBytes; | |
public Int64 PhysicalAvailableBytes; | |
public Int64 SystemCacheBytes; | |
public Int64 KernelTotalBytes; | |
public Int64 KernelPagedBytes; | |
public Int64 KernelNonPagedBytes; | |
public Int64 PageSizeBytes; | |
public int HandlesCount; | |
public int ProcessCount; | |
public int ThreadCount; | |
} | |
"@ | |
[PerformanceInfo]::GetPerformanceInfo() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment