通过 Windows 关机命令休眠时使用 /f 选项的实际效果是什么?

通过 Windows 关机命令休眠时使用 /f 选项的实际效果是什么?

在互联网上的各种示例中,我们可以看到很多对 的调用shutdown /h,但有时也会调用 来shutdown /h /f执行相同操作,即让 Windows 7/8/10 的 PC 休眠 - 即关闭 PC无需关闭正在运行的应用程序

关机文档指出/h用于休眠的选项可以与该/f选项一起使用(不能与其他选项一起使用)。

该文档还给出了该选项的以下描述/f

强制关闭正在运行的应用程序而不警告用户。警告:使用/F选项可能会导致未保存的数据丢失。

假设冬眠只是“常识”暂停应用程序,我不禁要问,在什么情况下休眠才会真正关闭(终止)某个应用程序。换句话说,/f当与一起使用时,该选项究竟何时生效shutdown /h?或者只是文档中的措辞不当?

答案1

实际效果似乎介于微妙和零之间,具体取决于您的 Windows 版本。

我使用了免费版艾达专业版反汇编shutdown.exe并查看它对/f参数做了什么。很难从反汇编中看出该参数最终设置了什么变量,但我在寄存器eax用作标志参数之前发现了这一点InitiateShutdownW称呼:

SHUTDOWN_FORCE_SELF标志的值为 2,并且只有设置了此变量才能添加,因此我继续将该变量命名为fFlag

InitiateShutdownW似乎无法使计算机休眠,所以我们需要从其他地方寻找这种逻辑。在另一个代码路径上,我们的fFlag变量涉及对NtInitiatePowerAction

最后一个push为调用提供了第一个参数,因此SystemAction参数是 3,根据POWER_ACTION文档(从零开始计数枚举条目)确实指定了休眠。另一个push有趣的是第二个,它决定了第三个参数Flags。上面代码块的前半部分大部分都是一些小问题,0x80000000如果fFlag设置了,则传递,否则传递零。不幸的是,函数定义没有说明该数字的含义来自哪个枚举,但它可能与成员Flags相同POWER_ACTION_POLICY结构,在这种情况下0x80000000的值是POWER_ACTION_CRITICAL并且“强制进行关键暂停”。

那么问题是:什么是关键停职?系统电源管理事件页面显示

当系统执行临界暂停,系统会因电池电量不足警报等关键情况而立即进入休眠状态。与正常休眠转换不同,系统在执行关键暂停之前不会通知应用程序和驾驶员。

申请将由PBT_APMSUSPEND事件。然而,我用间谍++观察发送的消息,并PBT_APMSUSPEND在休眠前查看是否/f指定了。(为了再次检查是否POWER_ACTION_CRITICAL确实指定了,我还尝试NtInitiatePowerAction直接调用而不是使用shutdown /h /f。我仍然没有发现 Windows 10 1909 上有什么不同。)某些电源管理行为在 Windows 版本之间发生了变化。例如,PBT_APMRESUMECRITICAL事件,用于通知应用程序系统已从严重挂起状态恢复的功能,在 Windows Vista 中已被停用。

我的评估是,结合/h可能/f曾经跳过向“应用程序和驱动程序”发送某些通知,但可能不再产生影响。

相关内容