在互联网上的各种示例中,我们可以看到很多对 的调用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
曾经跳过向“应用程序和驱动程序”发送某些通知,但可能不再产生影响。