CallNtPowerInformation (powrprof)
Last changed: zkonstantin3@gmail.com-86.57.255.92

.
Summary
Sets or retrieves power information.

C# Signature:

[DllImport("powrprof.dll", SetLastError=true)]
private static extern UInt32 CallNtPowerInformation(
     Int32 InformationLevel,
     IntPtr lpInputBuffer,
     UInt32 nInputBufferSize,
     IntPtr lpOutputBuffer,
     UInt32 nOutputBufferSize);

[DllImport("powrprof.dll", SetLastError = true)]
private static extern uint CallNtPowerInformation(
     int informationLevel,
     IntPtr lpInputBuffer,
     uint nInputBufferSize,
     IntPtr lpOutputBuffer,
     uint nOutputBufferSize);

VB Signature:

<DllImport("powrprof.dll", SetLastError := True)> _
Private Shared Function CallNtPowerInformation(InformationLevel As Int32, lpInputBuffer As IntPtr, nInputBufferSize As UInt32, lpOutputBuffer As IntPtr, nOutputBufferSize As UInt32) As UInt32

End Function

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

InformationLevel parameter must be one of the POWER_INFORMATION_LEVEL enumeration type values.

Tips & Tricks:

This is obsolete on Vista. Try GetCurrentPowerPolicies() to get information on both XP and Vista.

Sample Code:

  IntPtr status = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(SYSTEM_BATTERY_STATE)));
  uint retval = CallNtPowerInformation(
    5,  // SystemBatteryState
    (IntPtr)null,
    0,
    status,
    (UInt32)Marshal.SizeOf(typeof(SYSTEM_BATTERY_STATE))
    );

  SYSTEM_BATTERY_STATE batt_status = (SYSTEM_BATTERY_STATE)Marshal.PtrToStructure(status, typeof(SYSTEM_BATTERY_STATE));

Sample Code:

    class Program
    {
    const int ProcessorInformation = 11;
    const uint STATUS_SUCCESS = 0;

    [StructLayout(LayoutKind.Sequential)]
    struct PROCESSOR_POWER_INFORMATION
    {
        public uint Number;
        public uint MaxMhz;
        public uint CurrentMhz;
        public uint MhzLimit;
        public uint MaxIdleState;
        public uint CurrentIdleState;
    }

    [DllImport("powrprof.dll")]
    static extern uint CallNtPowerInformation(
        int InformationLevel,
        IntPtr lpInputBuffer,
        int nInputBufferSize,
        [Out] PROCESSOR_POWER_INFORMATION[] lpOutputBuffer,
        int nOutputBufferSize
    );

    static void Main(string[] args)
    {
        int procCount = Environment.ProcessorCount;
        PROCESSOR_POWER_INFORMATION[] procInfo =
        new PROCESSOR_POWER_INFORMATION[procCount];
        uint retval = CallNtPowerInformation(
        ProcessorInformation,
        IntPtr.Zero,
        0,
        procInfo,
        procInfo.Length * Marshal.SizeOf(typeof(PROCESSOR_POWER_INFORMATION))
        );
        if (retval == STATUS_SUCCESS)
        {
        foreach (var item in procInfo)
        {
            Console.WriteLine(item.CurrentMhz);
        }
        }
    }
    }

Documentation