如何使用 CallNtPowerInformation(带互操作)获取 Windows SystemExecutionS

本文关键字:获取 Windows SystemExecutionS 互操作 何使用 CallNtPowerInformation | 更新日期: 2023-09-27 18:31:51

我真的在努力使用C#中的CallNtPowerInformation函数。我需要获取Windows SystemExecutionState。(此处列出的可能值)。

我找到了合适的 C# 签名:

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

现在我需要使用信息级别 16 来读取"系统执行状态"。这是我到目前为止的代码:

IntPtr status = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(ulong)));
UInt32 returnValue = CallNtPowerInformation(
    16, 
    (IntPtr)null, 
    0, 
    status, (
    UInt32)Marshal.SizeOf(typeof(ulong)));
Marshal.FreeCoTaskMem(status);

根据Microsoft文档:

lpOutputBuffer 缓冲区接收包含系统的 ULONG 值 执行状态缓冲区。

如何从 IntPtr 获取 ULONG 值?

如何使用 CallNtPowerInformation(带互操作)获取 Windows SystemExecutionS

使用out uint而不是IntPtr

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

uint result;
CallNtPowerInformation(..., out result);

调用 Marshal.ReadInt32(status) 以获取值。

uint statusValue = (uint)Marshal.ReadInt32(status);

Marshal类具有一整套 ReadXXX 方法,允许您从非托管内存中读取。