如何将CM_POWER_DATA转换为Ctypes结构?



如何将CM_POWER_DATA转换为Ctypes结构?

https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-cm_power_data_s

我的问题是DEVICE_POWER_STATE数据类型不知道如何转换

typedef struct CM_Power_Data_s {
ULONG              PD_Size;
DEVICE_POWER_STATE PD_MostRecentPowerState;
ULONG              PD_Capabilities;
ULONG              PD_D1Latency;
ULONG              PD_D2Latency;
ULONG              PD_D3Latency;
DEVICE_POWER_STATE PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM];
SYSTEM_POWER_STATE PD_DeepestSystemWake;
} CM_POWER_DATA, *PCM_POWER_DATA;
下面是python代码
class CM_Power_Data_s(ct.Structure):
_fields_ = (('PD_Size', w.ULONG),
('PD_MostRecentPowerState', DEVICE_POWER_STATE), 
('PD_Capabilities', w.ULONG), 
('PD_D1Latency', w.ULONG)
('PD_D2Latency', w.ULONG)                , 
('PD_D3Latency', w.ULONG)
('PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM]', DEVICE_POWER_STATE)
('PD_DeepestSystemWake', DEVICE_POWER_STATE) )

NameError: name 'DEVICE_POWER_STATE' is not defined

我自己找到了如下答案如有必要,请参考以下

import ctypes as ct
from ctypes import wintypes as w
ENUM = ct.c_int 
POWER_SYSTEM_MAXIMUM = 7
class _SYSTEM_POWER_STATE(ENUM):
PowerSystemUnspecified = 0
PowerSystemWorking = 1
PowerSystemSleeping1 = 2
PowerSystemSleeping2 = 3
PowerSystemSleeping3 = 4
PowerSystemHibernate = 5
PowerSystemShutdown = 6
PowerSystemMaximum = 7

SYSTEM_POWER_STATE = _SYSTEM_POWER_STATE
PSYSTEM_POWER_STATE = ct.POINTER(_SYSTEM_POWER_STATE)

class _DEVICE_POWER_STATE(ENUM):
PowerDeviceUnspecified = 0
PowerDeviceD0 = 1
PowerDeviceD1 = 2
PowerDeviceD2 = 3
PowerDeviceD3 = 4
PowerDeviceMaximum = 5   
DEVICE_POWER_STATE = _DEVICE_POWER_STATE   

PDCAP_D0_SUPPORTED = 0x00000001
PDCAP_D1_SUPPORTED = 0x00000002
PDCAP_D2_SUPPORTED = 0x00000004
PDCAP_D3_SUPPORTED = 0x00000008
PDCAP_WAKE_FROM_D0_SUPPORTED = 0x00000010
PDCAP_WAKE_FROM_D1_SUPPORTED = 0x00000020
PDCAP_WAKE_FROM_D2_SUPPORTED = 0x00000040
PDCAP_WAKE_FROM_D3_SUPPORTED = 0x00000080
PDCAP_WARM_EJECT_SUPPORTED = 0x00000100

class CM_Power_Data_s(ct.Structure):
_fields_ = [
('PD_Size', w.ULONG),
('PD_MostRecentPowerState', DEVICE_POWER_STATE),
('PD_Capabilities', w.ULONG),
('PD_D1Latency', w.ULONG),
('PD_D2Latency', w.ULONG),
('PD_D3Latency', w.ULONG),
('PD_PowerStateMapping', DEVICE_POWER_STATE *
POWER_SYSTEM_MAXIMUM),
('PD_DeepestSystemWake', SYSTEM_POWER_STATE),
]
CM_POWER_DATA = CM_Power_Data_s
PCM_POWER_DATA = ct.POINTER(CM_Power_Data_s)

最新更新