From 3368adc547f4595c0b23a8f55077404ba5954f95 Mon Sep 17 00:00:00 2001 From: Justin Miller Date: Tue, 11 Feb 2025 17:33:45 -0800 Subject: [PATCH] [POWRPROF] Sync Powrprof to WINE-10.0 - Add some functions too (#7681) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Hermès BÉLUSCA - MAÏTO "Sync" to WINE-10.0, plus add some functions we need. Required for various apps going forward. --- dll/win32/powrprof/CMakeLists.txt | 5 + dll/win32/powrprof/powrprof.c | 111 +++++++++++++++ dll/win32/powrprof/powrprof.spec | 18 ++- sdk/include/psdk/powrprof.h | 221 +++++++++++++++++++----------- 4 files changed, 276 insertions(+), 79 deletions(-) diff --git a/dll/win32/powrprof/CMakeLists.txt b/dll/win32/powrprof/CMakeLists.txt index cf6a2199a9b..a2b3ca0c056 100644 --- a/dll/win32/powrprof/CMakeLists.txt +++ b/dll/win32/powrprof/CMakeLists.txt @@ -6,6 +6,11 @@ add_library(powrprof MODULE powrprof.rc ${CMAKE_CURRENT_BINARY_DIR}/powrprof.def) +if(MSVC) + # Disable warning C4312: 'type cast': conversion from 'unsigned int' to 'HANDLE' of greater size + target_compile_options(powrprof PRIVATE /wd4312) +endif() + set_module_type(powrprof win32dll UNICODE) target_link_libraries(powrprof wine) add_importlibs(powrprof advapi32 user32 comctl32 msvcrt kernel32 ntdll) diff --git a/dll/win32/powrprof/powrprof.c b/dll/win32/powrprof/powrprof.c index 7172bb43646..fa19aec0868 100644 --- a/dll/win32/powrprof/powrprof.c +++ b/dll/win32/powrprof/powrprof.c @@ -510,6 +510,12 @@ PowerGetActiveScheme(HKEY UserRootPowerKey, GUID **polguid) return ERROR_CALL_NOT_IMPLEMENTED; } +DWORD WINAPI PowerSetActiveScheme(HKEY UserRootPowerKey, GUID *polguid) +{ + FIXME("(%p,%s) stub!\n", UserRootPowerKey, wine_dbgstr_guid(polguid)); + return ERROR_SUCCESS; +} + DWORD WINAPI PowerReadDCValue(HKEY RootPowerKey, const GUID *Scheme, const GUID *SubGroup, const GUID *PowerSettings, PULONG Type, PUCHAR Buffer, DWORD *BufferSize) { @@ -517,6 +523,111 @@ PowerReadDCValue(HKEY RootPowerKey, const GUID *Scheme, const GUID *SubGroup, co return ERROR_CALL_NOT_IMPLEMENTED; } +DWORD WINAPI PowerReadFriendlyName(HKEY RootPowerKey, const GUID *Scheme, + const GUID *SubGroup, const GUID *PowerSettings, UCHAR *Buffer, + DWORD *BufferSize) +{ + FIXME("(%p,%s,%s,%s,%p,%p) stub!\n", RootPowerKey, debugstr_guid(Scheme), debugstr_guid(SubGroup), debugstr_guid(PowerSettings), Buffer, BufferSize); + return ERROR_CALL_NOT_IMPLEMENTED; +} + +POWER_PLATFORM_ROLE WINAPI PowerDeterminePlatformRole(void) +{ + FIXME("stub\n"); + return PlatformRoleDesktop; +} + +POWER_PLATFORM_ROLE WINAPI PowerDeterminePlatformRoleEx(ULONG version) +{ + FIXME("%lu stub.\n", version); + return PlatformRoleDesktop; +} + +DWORD WINAPI PowerEnumerate(HKEY key, const GUID *scheme, const GUID *subgroup, POWER_DATA_ACCESSOR flags, + ULONG index, UCHAR *buffer, DWORD *buffer_size) +{ + FIXME("(%p,%s,%s,%d,%ld,%p,%p) stub!\n", key, debugstr_guid(scheme), debugstr_guid(subgroup), + flags, index, buffer, buffer_size); + return ERROR_CALL_NOT_IMPLEMENTED; +} + +DWORD WINAPI PowerRegisterSuspendResumeNotification(DWORD flags, HANDLE recipient, PHPOWERNOTIFY handle) +{ + FIXME("(0x%08lx,%p,%p) stub!\n", flags, recipient, handle); + *handle = (HPOWERNOTIFY)0xdeadbeef; + return ERROR_SUCCESS; +} + +DWORD WINAPI PowerUnregisterSuspendResumeNotification(HPOWERNOTIFY handle) +{ + FIXME("(%p) stub!\n", handle); + return ERROR_SUCCESS; +} + +DWORD WINAPI PowerSettingRegisterNotification(const GUID *setting, DWORD flags, HANDLE recipient, PHPOWERNOTIFY handle) +{ + FIXME("(%s,0x%08lx,%p,%p) stub!\n", debugstr_guid(setting), flags, recipient, handle); + *handle = (PHPOWERNOTIFY)0xdeadbeef; + return ERROR_SUCCESS; +} + +DWORD WINAPI PowerSettingUnregisterNotification(HPOWERNOTIFY handle) +{ + FIXME("(%p) stub!\n", handle); + return ERROR_SUCCESS; +} + +DWORD WINAPI PowerWriteACValueIndex(HKEY key, const GUID *scheme, const GUID *subgroup, const GUID *setting, DWORD index) +{ + FIXME("(%p,%s,%s,%s,0x%08lx) stub!\n", key, debugstr_guid(scheme), debugstr_guid(subgroup), debugstr_guid(setting), index); + return ERROR_SUCCESS; +} + +#ifdef __REACTOS__ +DWORD WINAPI PowerWriteDCValueIndex( + HKEY key, + const GUID *scheme, + const GUID *subgroup, + const GUID *setting, + DWORD index +) +{ + FIXME("(%p,%s,%s,%s,0x%08lx) stub!\n", key, debugstr_guid(scheme), debugstr_guid(subgroup), debugstr_guid(setting), index); + return ERROR_SUCCESS; +} + +DWORD WINAPI PowerReadACValueIndex( + HKEY key, + const GUID *scheme, + const GUID *subgroup, + const GUID *setting, + LPDWORD AcValueIndex +) +{ + FIXME("(%p,%s,%s,%s,0x%08lx) stub!\n", key, debugstr_guid(scheme), debugstr_guid(subgroup), debugstr_guid(setting)); + return ERROR_SUCCESS; +} + +DWORD WINAPI PowerReadDCValueIndex( + HKEY key, + const GUID *scheme, + const GUID *subgroup, + const GUID *setting, + LPDWORD DcValuetIndex +) +{ + FIXME("(%p,%s,%s,%s,0x%08lx) stub!\n", key, debugstr_guid(scheme), debugstr_guid(subgroup), debugstr_guid(setting)); + return ERROR_SUCCESS; +} + +DWORD WINAPI +PowerReadACValue(HKEY RootPowerKey, const GUID *Scheme, const GUID *SubGroup, const GUID *PowerSettings, PULONG Type, PUCHAR Buffer, DWORD *BufferSize) +{ + FIXME("(%p,%s,%s,%s,%p,%p,%p) stub!\n", RootPowerKey, debugstr_guid(Scheme), debugstr_guid(SubGroup), debugstr_guid(PowerSettings), Type, Buffer, BufferSize); + return ERROR_CALL_NOT_IMPLEMENTED; +} +#endif + BOOLEAN WINAPI ReadGlobalPwrPolicy(PGLOBAL_POWER_POLICY pGlobalPowerPolicy) { diff --git a/dll/win32/powrprof/powrprof.spec b/dll/win32/powrprof/powrprof.spec index 43a9723f793..37f2b02c84d 100644 --- a/dll/win32/powrprof/powrprof.spec +++ b/dll/win32/powrprof/powrprof.spec @@ -10,8 +10,22 @@ @ stdcall IsPwrHibernateAllowed () @ stdcall IsPwrShutdownAllowed () @ stdcall IsPwrSuspendAllowed () +@ stdcall PowerDeterminePlatformRole () +@ stdcall PowerDeterminePlatformRoleEx(long) +@ stdcall PowerEnumerate(long ptr ptr long long ptr ptr) @ stdcall PowerGetActiveScheme (ptr ptr) -@ stdcall PowerReadDCValue (ptr ptr ptr ptr ptr ptr ptr) +@ stdcall PowerSetActiveScheme (ptr ptr) +@ stdcall PowerReadACValue(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall PowerReadACValueIndex(ptr ptr ptr ptr ptr) +@ stdcall PowerReadDCValue(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall PowerReadDCValueIndex(ptr ptr ptr ptr ptr) +@ stdcall PowerReadFriendlyName (ptr ptr ptr ptr ptr ptr) +@ stdcall PowerRegisterSuspendResumeNotification(long ptr ptr) +@ stdcall PowerUnregisterSuspendResumeNotification(ptr) +@ stdcall PowerSettingRegisterNotification(ptr long ptr ptr) +@ stdcall PowerSettingUnregisterNotification(ptr) +@ stdcall PowerWriteACValueIndex(ptr ptr ptr ptr long) +@ stdcall PowerWriteDCValueIndex(ptr ptr ptr ptr long) @ stdcall ReadGlobalPwrPolicy (ptr) @ stdcall ReadProcessorPwrScheme (long ptr) @ stdcall ReadPwrScheme (long ptr) @@ -20,4 +34,4 @@ @ stdcall WriteGlobalPwrPolicy (ptr) @ stdcall WriteProcessorPwrScheme (long ptr) @ stdcall WritePwrScheme (ptr str str ptr) -@ stdcall ValidatePowerPolicies (ptr ptr) \ No newline at end of file +@ stdcall ValidatePowerPolicies (ptr ptr) diff --git a/sdk/include/psdk/powrprof.h b/sdk/include/psdk/powrprof.h index 50e54cd6ad9..4c5f0c69f3c 100644 --- a/sdk/include/psdk/powrprof.h +++ b/sdk/include/psdk/powrprof.h @@ -12,87 +12,147 @@ extern "C" { #endif -#define EnableMultiBatteryDisplay 2 -#define EnablePasswordLogon 4 -#define EnableSysTrayBatteryMeter 1 -#define EnableWakeOnRing 8 -#define EnableVideoDimDisplay 16 +#ifdef __REACTOS__ #define NEWSCHEME (UINT)-1 -#ifndef RC_INVOKED +typedef enum _POWER_PLATFORM_ROLE { + PlatformRoleUnspecified, + PlatformRoleDesktop, + PlatformRoleMobile, + PlatformRoleWorkstation, + PlatformRoleEnterpriseServer, + PlatformRoleSOHOServer, + PlatformRoleAppliancePC, + PlatformRolePerformanceServer, + PlatformRoleSlate, + PlatformRoleMaximum +} POWER_PLATFORM_ROLE, *PPOWER_PLATFORM_ROLE; +#endif + +#define EnableSysTrayBatteryMeter 0x01 +#define EnableMultiBatteryDisplay 0x02 +#define EnablePasswordLogon 0x04 +#define EnableWakeOnRing 0x08 +#define EnableVideoDimDisplay 0x10 + +typedef struct _GLOBAL_MACHINE_POWER_POLICY { + ULONG Revision; + SYSTEM_POWER_STATE LidOpenWakeAc; + SYSTEM_POWER_STATE LidOpenWakeDc; + ULONG BroadcastCapacityResolution; +} GLOBAL_MACHINE_POWER_POLICY, +*PGLOBAL_MACHINE_POWER_POLICY; + +typedef struct _GLOBAL_USER_POWER_POLICY { + ULONG Revision; + POWER_ACTION_POLICY PowerButtonAc; + POWER_ACTION_POLICY PowerButtonDc; + POWER_ACTION_POLICY SleepButtonAc; + POWER_ACTION_POLICY SleepButtonDc; + POWER_ACTION_POLICY LidCloseAc; + POWER_ACTION_POLICY LidCloseDc; + SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES]; + ULONG GlobalFlags; +} GLOBAL_USER_POWER_POLICY, +*PGLOBAL_USER_POWER_POLICY; + +typedef struct _GLOBAL_POWER_POLICY { + GLOBAL_USER_POWER_POLICY user; + GLOBAL_MACHINE_POWER_POLICY mach; +} GLOBAL_POWER_POLICY, +*PGLOBAL_POWER_POLICY; + +typedef struct _MACHINE_POWER_POLICY { + ULONG Revision; + SYSTEM_POWER_STATE MinSleepAc; + SYSTEM_POWER_STATE MinSleepDc; + SYSTEM_POWER_STATE ReducedLatencySleepAc; + SYSTEM_POWER_STATE ReducedLatencySleepDc; + ULONG DozeTimeoutAc; + ULONG DozeTimeoutDc; + ULONG DozeS4TimeoutAc; + ULONG DozeS4TimeoutDc; + UCHAR MinThrottleAc; + UCHAR MinThrottleDc; + UCHAR pad1[2]; + POWER_ACTION_POLICY OverThrottledAc; + POWER_ACTION_POLICY OverThrottledDc; +} MACHINE_POWER_POLICY, +*PMACHINE_POWER_POLICY; -typedef struct _GLOBAL_MACHINE_POWER_POLICY{ - ULONG Revision; - SYSTEM_POWER_STATE LidOpenWakeAc; - SYSTEM_POWER_STATE LidOpenWakeDc; - ULONG BroadcastCapacityResolution; -} GLOBAL_MACHINE_POWER_POLICY, *PGLOBAL_MACHINE_POWER_POLICY; -typedef struct _GLOBAL_USER_POWER_POLICY{ - ULONG Revision; - POWER_ACTION_POLICY PowerButtonAc; - POWER_ACTION_POLICY PowerButtonDc; - POWER_ACTION_POLICY SleepButtonAc; - POWER_ACTION_POLICY SleepButtonDc; - POWER_ACTION_POLICY LidCloseAc; - POWER_ACTION_POLICY LidCloseDc; - SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES]; - ULONG GlobalFlags; -} GLOBAL_USER_POWER_POLICY, *PGLOBAL_USER_POWER_POLICY; -typedef struct _GLOBAL_POWER_POLICY{ - GLOBAL_USER_POWER_POLICY user; - GLOBAL_MACHINE_POWER_POLICY mach; -} GLOBAL_POWER_POLICY, *PGLOBAL_POWER_POLICY; -typedef struct _MACHINE_POWER_POLICY{ - ULONG Revision; - SYSTEM_POWER_STATE MinSleepAc; - SYSTEM_POWER_STATE MinSleepDc; - SYSTEM_POWER_STATE ReducedLatencySleepAc; - SYSTEM_POWER_STATE ReducedLatencySleepDc; - ULONG DozeTimeoutAc; - ULONG DozeTimeoutDc; - ULONG DozeS4TimeoutAc; - ULONG DozeS4TimeoutDc; - UCHAR MinThrottleAc; - UCHAR MinThrottleDc; - UCHAR pad1[2]; - POWER_ACTION_POLICY OverThrottledAc; - POWER_ACTION_POLICY OverThrottledDc; -} MACHINE_POWER_POLICY, *PMACHINE_POWER_POLICY; typedef struct _MACHINE_PROCESSOR_POWER_POLICY { - ULONG Revision; - PROCESSOR_POWER_POLICY ProcessorPolicyAc; - PROCESSOR_POWER_POLICY ProcessorPolicyDc; -} MACHINE_PROCESSOR_POWER_POLICY, *PMACHINE_PROCESSOR_POWER_POLICY; -typedef struct _USER_POWER_POLICY{ - ULONG Revision; - POWER_ACTION_POLICY IdleAc; - POWER_ACTION_POLICY IdleDc; - ULONG IdleTimeoutAc; - ULONG IdleTimeoutDc; - UCHAR IdleSensitivityAc; - UCHAR IdleSensitivityDc; - UCHAR ThrottlePolicyAc; - UCHAR ThrottlePolicyDc; - SYSTEM_POWER_STATE MaxSleepAc; - SYSTEM_POWER_STATE MaxSleepDc; - ULONG Reserved[2]; - ULONG VideoTimeoutAc; - ULONG VideoTimeoutDc; - ULONG SpindownTimeoutAc; - ULONG SpindownTimeoutDc; - BOOLEAN OptimizeForPowerAc; - BOOLEAN OptimizeForPowerDc; - UCHAR FanThrottleToleranceAc; - UCHAR FanThrottleToleranceDc; - UCHAR ForcedThrottleAc; - UCHAR ForcedThrottleDc; -} USER_POWER_POLICY, *PUSER_POWER_POLICY; -typedef struct _POWER_POLICY{ - USER_POWER_POLICY user; - MACHINE_POWER_POLICY mach; -} POWER_POLICY, *PPOWER_POLICY; + ULONG Revision; + PROCESSOR_POWER_POLICY ProcessorPolicyAc; + PROCESSOR_POWER_POLICY ProcessorPolicyDc; +} MACHINE_PROCESSOR_POWER_POLICY, +*PMACHINE_PROCESSOR_POWER_POLICY; + +typedef struct _USER_POWER_POLICY { + ULONG Revision; + POWER_ACTION_POLICY IdleAc; + POWER_ACTION_POLICY IdleDc; + ULONG IdleTimeoutAc; + ULONG IdleTimeoutDc; + UCHAR IdleSensitivityAc; + UCHAR IdleSensitivityDc; + UCHAR ThrottlePolicyAc; + UCHAR ThrottlePolicyDc; + SYSTEM_POWER_STATE MaxSleepAc; + SYSTEM_POWER_STATE MaxSleepDc; + ULONG Reserved[2]; + ULONG VideoTimeoutAc; + ULONG VideoTimeoutDc; + ULONG SpindownTimeoutAc; + ULONG SpindownTimeoutDc; + BOOLEAN OptimizeForPowerAc; + BOOLEAN OptimizeForPowerDc; + UCHAR FanThrottleToleranceAc; + UCHAR FanThrottleToleranceDc; + UCHAR ForcedThrottleAc; + UCHAR ForcedThrottleDc; +} USER_POWER_POLICY, +*PUSER_POWER_POLICY; + +typedef struct _POWER_POLICY { + USER_POWER_POLICY user; + MACHINE_POWER_POLICY mach; +} POWER_POLICY, +*PPOWER_POLICY; + +typedef enum _POWER_DATA_ACCESSOR { + ACCESS_AC_POWER_SETTING_INDEX, + ACCESS_DC_POWER_SETTING_INDEX, + ACCESS_FRIENDLY_NAME, + ACCESS_DESCRIPTION, + ACCESS_POSSIBLE_POWER_SETTING, + ACCESS_POSSIBLE_POWER_SETTING_FRIENDLY_NAME, + ACCESS_POSSIBLE_POWER_SETTING_DESCRIPTION, + ACCESS_DEFAULT_AC_POWER_SETTING, + ACCESS_DEFAULT_DC_POWER_SETTING, + ACCESS_POSSIBLE_VALUE_MIN, + ACCESS_POSSIBLE_VALUE_MAX, + ACCESS_POSSIBLE_VALUE_INCREMENT, + ACCESS_POSSIBLE_VALUE_UNITS, + ACCESS_ICON_RESOURCE, + ACCESS_DEFAULT_SECURITY_DESCRIPTOR, + ACCESS_ATTRIBUTES, + ACCESS_SCHEME, + ACCESS_SUBGROUP, + ACCESS_INDIVIDUAL_SETTING, + ACCESS_ACTIVE_SCHEME, + ACCESS_CREATE_SCHEME, + ACCESS_AC_POWER_SETTING_MAX, + ACCESS_DC_POWER_SETTING_MAX, + ACCESS_AC_POWER_SETTING_MIN, + ACCESS_DC_POWER_SETTING_MIN, + ACCESS_PROFILE, + ACCESS_OVERLAY_SCHEME, + ACCESS_ACTIVE_OVERLAY_SCHEME, +} POWER_DATA_ACCESSOR, *PPOWER_DATA_ACCESSOR; + typedef BOOLEAN (CALLBACK* PWRSCHEMESENUMPROC)(UINT, DWORD, LPWSTR, DWORD, LPWSTR, PPOWER_POLICY, LPARAM); -typedef BOOLEAN (CALLBACK* PFNNTINITIATEPWRACTION)(POWER_ACTION, SYSTEM_POWER_STATE, ULONG, BOOLEAN); +typedef PVOID HPOWERNOTIFY, *PHPOWERNOTIFY; + NTSTATUS WINAPI CallNtPowerInformation(POWER_INFORMATION_LEVEL, PVOID, ULONG, PVOID, ULONG); BOOLEAN WINAPI CanUserWritePwrScheme(VOID); BOOLEAN WINAPI DeletePwrScheme(UINT); @@ -105,6 +165,12 @@ BOOLEAN WINAPI IsAdminOverrideActive(PADMINISTRATOR_POWER_POLICY); BOOLEAN WINAPI IsPwrHibernateAllowed(VOID); BOOLEAN WINAPI IsPwrShutdownAllowed(VOID); BOOLEAN WINAPI IsPwrSuspendAllowed(VOID); +DWORD WINAPI PowerEnumerate(HKEY, const GUID *, const GUID *, POWER_DATA_ACCESSOR, ULONG, UCHAR *, DWORD *); +DWORD WINAPI PowerRegisterSuspendResumeNotification(DWORD, HANDLE, PHPOWERNOTIFY); +DWORD WINAPI PowerUnregisterSuspendResumeNotification(HPOWERNOTIFY); +DWORD WINAPI PowerSettingRegisterNotification(const GUID *, DWORD, HANDLE, PHPOWERNOTIFY); +DWORD WINAPI PowerSettingUnregisterNotification(HPOWERNOTIFY); +DWORD WINAPI PowerWriteACValueIndex(HKEY, const GUID *, const GUID *, const GUID *, DWORD); BOOLEAN WINAPI ReadGlobalPwrPolicy(PGLOBAL_POWER_POLICY); BOOLEAN WINAPI ReadProcessorPwrScheme(UINT, PMACHINE_PROCESSOR_POWER_POLICY); BOOLEAN WINAPI ReadPwrScheme(UINT, PPOWER_POLICY); @@ -115,7 +181,8 @@ BOOLEAN WINAPI WriteProcessorPwrScheme(UINT, PMACHINE_PROCESSOR_POWER_POLICY); BOOLEAN WINAPI ValidatePowerPolicies(PGLOBAL_POWER_POLICY, PPOWER_POLICY); BOOLEAN WINAPI WritePwrScheme(PUINT, LPWSTR, LPWSTR, PPOWER_POLICY); -#endif /* RC_INVOKED */ +/* Power scheme */ +POWER_PLATFORM_ROLE WINAPI PowerDeterminePlatformRole(void); #ifdef __cplusplus }