我们先来看看Windows正常的关机流程:
①关机指令通知Windows子系统csrss.exe,csrss.exe收到通知后会和Winlogon.exe做一个数据交换,再由Winlogon.exe通知csrss.exe开始关闭系统的流程。
②csrss.exe依次查询拥有顶层窗口的用户进程,让这些用户进程退出。
③接着开始终止系统进程(以上3个步骤是整个Windows关机过程中最耗费时间的一段,大多数关机缓慢的原因都是因为这3个步骤引起的)。
④Winlogon.exe调用NtShutdownSystem()函数来命令系统执行后面的扫尾工作,最后关机。
如果想要实现快速关机,我们完全可以跳过前三个步骤,直接调用NtShutdownSystem来实现。 但是NtShutdownSystem并不是任何进程都可以随便调用的,需要首先给调用进程提升权限,赋予SE_SHUTDOWN_PRIVILEGE权限,这就需要借助RtlAdjustPrivilege函数,NtShutdownSystem和RtlAdjustPrivilege都是Windows 的内核级API。
NTSTATUS
RtlAdjustPrivilege(
ULONG Privilege
BOOLEAN Enable
BOOLEAN Client
PBOOLEAN WasEnabled
);
NTSYSAPI
NTSTATUS
NTAPI
NtShutdownSystem(IN SHUTDOWN_ACTION Action );
这两个API都位于NTDLL.dll里面,微软并未在MSDN中公开,向大家分享一册MSDN未归档API文档,下载地址:http://t.cn/8s0sciN
了解以上思路,我们在应用程序中用代码实现起来就比较容易了。
我用C++编写的CPowerManager源码:http://t.cn/8s0sVD2
同时用JNI编写的java版powermanager:http://t.cn/8s0smGz
注意:快速关机虽然不会损坏硬件和操作系统,但是可能会造成某些正在运行的进程内存中尚未保存数据的丢失!