Как маршалу УЛОНГЛОНГУ в C#? - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь получить время последнего пробуждения, используя CallNtPowerInformation, и значение, которое копируется в OutputBuffer, имеет тип ULONGLONG в C ++, который, я считаю, эквивалентен ulong в C#.

При попытке использовать методы Marshal stati c я не вижу способа получить ulong, только long. Есть ли способ получить ulong?

Мой код:

[DllImport("powrprof.dll", SetLastError = true)]
public static extern uint CallNtPowerInformation(
    InformationLevel informationLevel,
    IntPtr lpInputBuffer,
    uint nInputBufferSize,
    IntPtr lpOutpuBuffer,
    nOutputBuffer);

public enum InformationLevel
{
    AdministratorPowerPolicy = 9,
    LastSleepTime = 15,
    LastWakeTime = 14,
    ProcessorInformation = 11,
    ProcessorPowerPolicyAc = 18,
    ProcessorPowerPolicyCurrent = 22,
    ProcessorPowerPolicyDc = 19,
    SystemBatteryState = 5,
    SystemExecutionState = 16,
    SystemPowerCapabilities = 4,
    SystemPowerInformation = 12,
    SystemPowerPolicyAc = 0,
    SystemPowerPolicyCurrent = 8,
    SystemPowerPolicyDc = 1,
    SystemReserveHiberFile = 10,
    VerifyProcessorPowerPolicyAc = 20,
    VerifyProcessorPowerPolicyDc = 21,
    VerifySystemPolicyAc = 2,
    VerifySystemPolicyDc = 3
}

public static ulong GetLastWakeTime()
{
    var lpOutputBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ulong)));
    var ntstatusResult = CallNtPowerInformation(
        InformationLevel.LastWakeTime,
        IntPtr.Zero,
        0,
        lpOuputBuffer,
        (uint)Marshal.SizeOf(typeof(ulong)));
    var lastWakeTime = Marshal.ReadInt64(lpOutputBuffer); // This is where ulong should get read from unmanaged memory
    Marshal.FreeHGlobal(lpOutputBuffer);
    return lastWakeTime;
}
...