zoukankan      html  css  js  c++  java
  • 编程实现Windows瞬间关机

    我们先来看看Windows正常的关机流程:
    ①关机指令通知Windows子系统
    csrss.execsrss.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

    注意:快速关机虽然不会损坏硬件和操作系统,但是可能会造成某些正在运行的进程内存中尚未保存数据的丢失!

  • 相关阅读:
    将博客搬至CSDN
    ActiveMQ 的可持久化(六)
    ActiveMQ之协议(五)
    ActiveMQ与Spring / SpringBoot 整合(四)
    ActiveMQ之JMS及保证消息的可靠性<持久化、事务、签收>(三)
    ActiveMQ部署和代码尝试(二)
    ActiveMQ初步安装使用(一)
    Redis之哨兵机制(五)
    Redis主从复制(读写分离)(四)
    Redis持久化(三)
  • 原文地址:https://www.cnblogs.com/cpper-kaixuan/p/3532742.html
Copyright © 2011-2022 走看看