如何使用 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 值?
使用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
方法,允许您从非托管内存中读取。