1

让我先说一下,我最初的目标是在实际电源状态启动之前确定 Windows 操作系统正在进入的电源状态。我在另一个线程上问了一个类似的问题,为此我收到了一堆关于为什么我的假笑需要知道这一点。因此,无需详细解释我为什么需要这个,让我简单地说一下我连接到 PC 的硬件将需要这些信息来进行自己的电源管理。

此时我也试图避免编写设备驱动程序,因此我想尝试从用户模式/本地服务代码中找到解决方案。

好的,现在回到手头的问题。由于 Windows 操作系统只提供基本的电源通知,例如,不会让我区分重新启动与关闭或睡眠与休眠,因此我想在 Windows API 上实现一个全局挂钩来启动这些电源状态(它们是用于睡眠/休眠的SetSuspendState和用于重新启动/关闭的InitiateSystemShutdown 。)我还发现这篇文章解释了如何使用 C++/WinAPI 实现全局 API 挂钩。

因此,能够在电源事件发生之前拦截电源事件的命令,其想法是将电源事件的类型写入系统注册表(请参阅下面的 POWER_ACTION 和 SYSTEM_POWER_STATE),然后从用户模式/本地服务代码中读取它收到 WM_POWERBROADCAST 通知。

我从来没有做过全局 API 挂钩,所以在开始编写代码之前,我在向这个网站上的专业人士征求意见——你觉得这行得通吗?

还有一些关于 API 本身的技术问题:

1:我做了一些研究,似乎内核级别的大多数高级电源 API 都归结为从 Ntdll.dll 导出的NtInitiatePowerActionZwInitiatePowerAction 。两者似乎都做同样的事情,但问题是,我应该挂钩哪一个?

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

上述标志的实际值可以是这些here

3:我需要它在 Windows XP SP3 和更高版本的操作系统下工作。似乎从 XP 开始就支持所有这些东西,但我担心的是那些似乎没有在官方 MSDN 文档中提到的内核级 API。

所以无论如何,我很高兴听到对此的任何见解?

4

0 回答 0