Вызов ReadProcessorPwrScheme () не возвращает правильные значения - PullRequest
1 голос
/ 21 июля 2010

Я хотел бы задать вопрос относительно метода P / Invoke.Я пишу в C # и хотел бы получить доступ к API управления питанием (powrprof.dll) метод "ReadProcessorPwrScheme".К сожалению, я не получаю правильные значения и подозреваю, что у меня могут быть проблемы с маршалингом.Буду признателен за любую оказанную помощь.Некоторые из имеющихся у меня кодов:

struct PROCESSOR_POWER_POLICY_INFO
{
    public uint TimeCheck;                  // ULONG
    public uint DemoteLimit;                // ULONG
    public uint PromoteLimit;               // ULONG
    public byte DemotePercent;
    public byte PromotePercent;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public byte[] Spare;
    public uint AllowDemotion;
    public uint AllowPromotion;
    public uint Reserved;
}

struct PROCESSOR_POWER_POLICY
{
    public uint Revision;                   // DWORD
    public byte DynamicThrottle;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] Spare;
    public uint DisableCStates;             // DWORD
    public uint Reserved;                   // DWORD
    public uint PolicyCount;                // DWORD
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public PROCESSOR_POWER_POLICY_INFO[] Policy;
}

struct MACHINE_PROCESSOR_POWER_POLICY
{
    public uint Revision;                   // ULONG
    public PROCESSOR_POWER_POLICY ProcessorPolicyAc;
    public PROCESSOR_POWER_POLICY ProcessorPolicyDc;
}


[DllImport("powrprof.dll", SetLastError = true)]
static extern bool ReadProcessorPwrScheme(uint uiID, out MACHINE_PROCESSOR_POWER_POLICY pMachineProcessorPowerPolicy);
public void ReadProcessorPowerScheme()
{
    MACHINE_PROCESSOR_POWER_POLICY mppp = new MACHINE_PROCESSOR_POWER_POLICY();
    uint schemeID0 = 0;

    if (ReadProcessorPwrScheme(schemeID0, out mppp))
    {
        Console.WriteLine(mppp.ProcessorPolicyAc.DynamicThrottle);
        Console.WriteLine(mppp.ProcessorPolicyDc.DynamicThrottle);
    }
}

mppp.ProcessorPolicyAc.DynamicThrottle показывает правильное значение, но mppp.ProcessorPolicyDc.DynamicThrottle не показывает правильноезначение.У кого-нибудь есть подсказка или идея, что не так?

Дополнительная информация: Это работает на Win XP

1 Ответ

1 голос
/ 23 июля 2010

Я нашел решение моего вопроса.Это было мое недопонимание относительно определения структуры, которое заставляет читать неправильные байты.Правильное определение структуры приведено ниже.

struct PROCESSOR_POWER_POLICY_INFO 
{ 
    public uint TimeCheck;                  // ULONG 
    public uint DemoteLimit;                // ULONG 
    public uint PromoteLimit;               // ULONG 
    public byte DemotePercent; 
    public byte PromotePercent; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] 
    public byte[] Spare; 
    //public uint AllowDemotion; 
    //public uint AllowPromotion; 
    //public uint Reserved; 
    public uint AllowBits;
} 

struct PROCESSOR_POWER_POLICY 
{ 
    public uint Revision;                   // DWORD 
    public byte DynamicThrottle; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] 
    public byte[] Spare; 
    //public uint DisableCStates;             // DWORD 
    public uint Reserved;                   // DWORD 
    public uint PolicyCount;                // DWORD 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] 
    public PROCESSOR_POWER_POLICY_INFO[] Policy; 
} 
...