让我先说明我的最初目标是确定Windows操作系统在实际电源状态启动之前进入的电源状态。我在另一个线程上问了一个类似的问题,我收到了一堆假笑关于为什么我需要知道这个。因此,在没有详细说明我为什么需要这个的情况下,让我简单地说,我连接到PC的硬件将需要这些信息用于自己的电源管理。
此时我也试图避免编写设备驱动程序,所以我想尝试从用户模式/本地服务代码中找到解决方案。
好的,现在回到手头的问题。由于Windows操作系统仅提供basic power notification,例如,我不会让我区分重启与关闭,睡眠与休眠,我想在Windows API上实现一个全局挂钩来启动这些电源状态(睡眠/休眠为SetSuspendState,重启/关闭为InitiateSystemShutdown。)我还发现this article解释了如何使用C ++ / WinAPI实现全局API挂钩。
因此,能够在电源事件发生之前拦截命令,其目的是将电源事件的类型写入系统注册表(请参阅下面的POWER_ACTION和SYSTEM_POWER_STATE)并从用户模式/本地服务中读取它收到WM_POWERBROADCAST通知后的代码。
我从来没有做过全球API挂钩,所以在我开始编码之前,我在网站上寻求专业人士的建议 - 您怎么看?这可行吗?
关于API本身的一些技术问题:
1:我做了一些研究,似乎内核级别的大多数更高级别的功能API都归结为 NtInitiatePowerAction 或 ZwInitiatePowerAction 从Ntdll.dll导出。两者似乎都这样做,但问题是,我应该勾选哪一个?
2:微软在这些内核级API上缺少文档。我能找到的唯一东西就是这个。有没有人有任何信息可以添加到它?
NTSYSAPI
NTSTATUS
NTAPI
NtInitiatePowerAction(
IN POWER_ACTION SystemAction,
IN SYSTEM_POWER_STATE MinSystemState,
IN ULONG Flags,
IN BOOLEAN Asynchronous
);
typedef enum _POWER_ACTION {
PowerActionNone,
PowerActionReserved,
PowerActionSleep,
PowerActionHibernate,
PowerActionShutdown,
PowerActionShutdownReset,
PowerActionShutdownOff
} POWER_ACTION, *PPOWER_ACTION;
typedef enum _SYSTEM_POWER_STATE {
PowerSystemUnspecified = 0,
PowerSystemWorking,
PowerSystemSleeping1,
PowerSystemSleeping2,
PowerSystemSleeping3,
PowerSystemHibernate,
PowerSystemShutdown
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
//Flags seem to be the these ones
POWER_ACTION_QUERY_ALLOWED
POWER_ACTION_UI_ALLOWED
POWER_ACTION_OVERRIDE_APPS
POWER_ACTION_LOCK_CONSOLE
POWER_ACTION_DISABLE_WAKES
POWER_ACTION_CRITICAL
上述标志的实际值可以是these here。
3:我需要在Windows XP SP3及更高版本的操作系统下工作。似乎从XP开始就支持所有这些东西,但我关注的是那些内核级别的API似乎没有在官方MSDN文档中提及。
所以,无论如何,我很高兴听到有关此事的任何见解?