原文链接:http://blog.csdn.net/flyoxs/article/details/3710367

Windows开机和关机慢,很多时候慢得令人抓狂。特别是做嵌入式开发时(如XPE和WinCE),任谁都无法忍受开发出来的设备开关机的蜗牛速度。所以我们得为她加速。采用HORM是不错的方案,因为是直接从休眠文件中恢复系统现场,开机速度快了不少。采用HORM方案后,Windows默认的关机过程中,很多步骤对我们的设备来说,是完全不需要的,我们需要直接断电关机。本文将分析Windows的关机过程,然后介绍如何使用Windows未公开的API实现直接断电关机。

 

一 Windows关机过程

简单地说,在Windows关机时,系统做了以下工作:

1. 软保护  首先先结束登录用户打开的所有程序,保存用户的设置和系统设置,然后停止系统服务和操作系统大部分进程。

2. 硬保护 复位硬件,如复位磁盘的磁头、停止硬件驱动程序等。

3. 断电 断开主板给各硬件设备的电源。当然这步需要主板的电源管理模块支持,一般来说,ATX电源和主板都支持软断电。

在整个关机过程中,软保护是最耗时的,少则五六秒,多则上分钟。刚安装的操作系统,因为未安装驱动和开启额外的系统服务,关机非常快。开启服务一多,关机就慢下来了,特别是安装了有Bug的驱动,问题可能更糟。

 

二 软保护

为了保证数据的完整性,软保护是必须的,不管是操作系统本身还是第三方的应用程序。

软保护的步骤有:

1. 用户发起关机指令以后,发起关机指令的程序会通知Windows子系统CSRSS.EXE,CSRSS.EXE收到通知以后会和Winlogon.EXE做一个数据交换,接着由Winlogon.EXE通知CSRSS.EXE开始关闭系统的流程 。

2. CSRSS.EXE收到Winlogon.EXE的通知以后,会依次查询拥有顶层窗口的用户进程,让这些用户进程退出。如果某一个用户进程在一个默认的超时时间5000毫秒(可以通过修改注册表键值HKEY_CURRENT_USER/Cont rol Panel/Desktop/ HungAppTimeout设定超时时间)内没有退出的话,Windows会显示一个结束任务对话框用于询问用户是否结束这个任务。默认情况下将显示这个对话框并一直保持而不会自动关闭。对于控制台程序来说,基本情况类似,只不过Windows使用HK EY_CURRENT_USER/Control Panel/Desktop/ WaitToKillAppTimeout值来设置超时时间。

3. 接着是轮到终止系统进程了。系统进程包括SMSS.EXE、Winlogon.EXE、Lsass.EXE等。Windows在终止系统进程的时候并不像终止用户进程那样如果无法在规定时间内终止则提示用户,而是跳过这个进程,去执行下一个系统 进程的终止操作。使用的超时时间和第2步使用的时间相同。

 

三 硬保护和断电

在完成软保护过程后,Winlogon.EXE调用一个原生API函数ZwShutdownSystem()或NtShutdownSystem()来命令系统执行后面的扫尾工作,包括上面提到的硬保护和ATX断电。

在ZwShutdownSystem函数调用过程中,Windows执行子系统会完成最后的关机操作,例如:设备驱动在这个阶段里面完成一些驱动设定的特殊操作;也是在这个阶段,配置管理系统将被修改过的注册表数据会写道磁盘里面。等除了电源管理以后的全部子系统完成退出以后,电源管理完成最后的操作,如重启、关机等。

 

四  响应关机事件

不管是直接按机箱上的Power按钮,还是点击开始菜单->关闭计算机(注销、关机、重启),我们的应用程序都可以响应这类事件,那就是窗口消息WM_QUERYENDSESSION和WM_ENDSESSION。

系统提供了一个常用的API实现系统的注销、关机和重启,它的声明为:

BOOL ExitWindowsEx(
UINT uFlags,
DWORD dwReason
);

参数uFlags可分为两类,之间可以用“|”合并:

1. 关闭动作,有以下标志:EWX_LOGOFF(注销)、EWX_SHUTDOWN(关闭系统后不切断电源,即使主板支持ATX电源管理)、EWX_POWEROFF(关机,关闭系统后切断电源,需主板支持)、EWX_REBOOT(重启)。

2. 关闭强度,有以下标志:数值0(安全关闭,不使用该类标志时默认为该项)、EWX_FORCEIFHUNG(应用程序挂起一段时间后强行关闭)、EWX_FORCE(强行关闭,不管应用程序有没有挂起)。

如果不使用关闭强度标志(EWX_FORCE或EWX_FORCEIFHUNG),关机是安全的,也就是说,在关机的软保护时,系统将给每个以桌面为顶级的窗口进程发送WM_QUERYENDSESSION消息。如果超过5000毫秒(可以通过修改注册表键值HKEY_CURRENT_USER/Cont rol Panel/Desktop/ HungAppTimeout设定超时时间)仍未有WM_QUERYENDSESSION消息的返回,则弹出结束任务对话框用于询问用户是否结束这个任务。默认情况下将显示这个对话框并一直保持而不会自动关闭;如果设置了自动结束任务(HKEY_CURRENT_USER/Cont rol Panel/Desktop/AutoEndTasks键值改为1),那么超时(HungAppTimeout)后仍未有WM_QUERYENDSESSION消息的返回值时,不再显示结束任务对话框而直接结束这个挂起的任务。如果多个进程响应了WM_QUERYENDSESSION并挂起(如记事本弹出询问是否保存的消息框),那么系统对于每个进程是串行处理的,即等待第一个挂起的进程响应WM_QUERYENDSESSION并返回后(立即发送WM_ENDSESSION通知同一窗口用户的选择<是否确认关闭>),再给下一个进程发送WM_QUERYENDSESSION并等待挂起超时。

需要注意的是,不管是点击系统弹出的结束任务对话框上的确定按钮,还是系统超时自动结束所有任务(已设置AutoEndTasks),那么挂起后的WM_QUERYENDSESSION和WM_ENDSESSION响应代码不会被执行。

 

五  直接断电关机

如上分析,如果您不在乎应用程序的数据丢失和操作系统的系统文件破坏(可能进不了系统),您完全可以把关机的软保护过程省略,来加快关机的速度。网上已经有许多快速关机软件,就是直接调用ntdll.dll中的ZwShutdownSystem()实现的。当然Windows系统本身也提供了这样的功能让您有选择地快速关机:打开任务管理器,按住键盘的Ctrl键,同时点击菜单“关机”-“关闭(或重启)”,即可在一两秒内立即断电关机。

程序实现断电关机的代码如下:

const int SE_SHUTDOWN_PRIVILEGE = 0x13;
typedef int (__stdcall *PFN_RtlAdjustPrivilege)( INT, BOOL, BOOL, INT*);
typedef int (__stdcall *PFN_ZwShutdownSystem)(INT);
HMODULE hModule = ::LoadLibrary(_T("ntdll.dll"));
if( hModule != NULL)
{
PFN_RtlAdjustPrivilege pfnRtl = (PFN_RtlAdjustPrivilege)GetProcAddress( hModule, "RtlAdjustPrivilege");
PFN_ZwShutdownSystem pfnShutdown = (PFN_ZwShutdownSystem)GetProcAddress( hModule,"ZwShutdownSystem");
if( pfnRtl != NULL &
pfnShutdown != NULL )
{
int en = 0;
int nRet= pfnRtl( SE_SHUTDOWN_PRIVILEGE, TRUE, TRUE, &en);
if( nRet == 0x0C000007C )
nRet = pfnRtl(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &en);
//SH_SHUTDOWN = 0;
//SH_RESTART = 1;
//SH_POWEROFF = 2;
const int SH_POWEROFF = 2;
nRet = pfnShutdown(POWEROFF);
}
}

Windows关机过程分析与快速关机的更多相关文章

  1. Windows 8 自带定时关机的4种实现方法

    问题描述:前几天发布了一篇文章[ Windows 7/8 自带定时关机命令 ],文章中的用到的命令我在Windows 7都运行成功,但没有在Windows 8 上进行测试,因为我认为Windows 8 ...

  2. Win10快速关机的快捷键

    Win10快速关机的快捷键... ------------------------------- -------------------------------------------- 关机程序的位 ...

  3. 谢欣伦 - 原创软件 - 工具软件 - 快速关机Shutdown

    快速关机Shutdown,含源码. 公司公用的笔记本电脑实在太烂,不知从什么时候开始关机永远都关不了,一直停留在“关闭系统中……”.忍无可忍之下,自己写了一个快速关机程序. 下载: Shutdown_ ...

  4. 一行JS搞定快速关机

    一.在本地新建一个文件js文件 JS代码: (new ActiveXObject("Shell.Application")).ShutdownWindows(); 二.设置快捷键 ...

  5. Windows下通过脚本快速修改IP地址

    Windows下通过脚本快速修改IP地址 如果通过Windows的网络属性修改Ip/网关,真是太麻烦了. 经常要切换ip,所以我写了两个脚本: c:\办公室.bat netsh interface i ...

  6. python MySQLdb在windows环境下的快速安装

    python MySQLdb在windows环境下的快速安装.问题解决方式 使用python访问mysql,需要一系列安装 linux下MySQLdb安装见 Python MySQLdb在Linux下 ...

  7. Windows 10用户可以快速移除U盘

    新浪科技讯,北京时间 4 月 9 日上午消息,据美国科技媒体 The Verge 报道,微软再次证实,从 1809 版本的 Windows 10 开始,插入新闪存盘时“快速移除”(quick remo ...

  8. Windows 7下阻止系统关机

    从Vista开始,想阻止系统关机就开始变麻烦了,不能只拦截WM_QUERYENDSESSION了,操作系统只给一个应用程序两秒钟的时间去保存自己的东西,两秒钟之后,不管做完了没有,Game Over! ...

  9. windows如何查看电脑开关机记录

    如何查看电脑开关机记录 (一)如果你只是想查看一下,从昨天关机到今天开机之间有没有人使用我的计算机,在“开始”菜单的运行”中输入“eventvwr.msc”,或者是按下"开始菜单" ...

随机推荐

  1. 深入理解is_callable和method_exists

    一.函数解析 is_callable() 定义: (PHP 4 >= 4.0.6, PHP 5, PHP 7) is_callable — 检测参数是否为合法的可调用结构 bool is_cal ...

  2. DSP+ARM多核异构开发环境SYSLINK搭建OMAPL138

    DSP+ARM多核异构开发环境搭建OMAPL138 注意: 环境为Ubuntu 12.04 只能是这个环境.我甚至在Ubuntu16.04上面安装了VMware,然后,在装了一个Ubuntu 12.0 ...

  3. js bom和dom

    一, 前言 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM ...

  4. Rmarkdown:输出html设置

    在Rstudio中可自行更改主题样式 --- title: "题目" author: "name" date: "`r format(Sys.time ...

  5. CSS3单选动画

    本示例实现了两种单选按钮动画效果,一种是缩放,一种是旋转,以下是html布局以及css样式 html:这里使用了label标签的for属性,以此来绑定radio <div class=" ...

  6. 什么是OSS/BSS(电信业务)

    电信业务运营支持系统(BOSS),面对客户是统一的:面对电信运营商,它融合了业务支撑系统(BSS)与运营支撑系统(OSS),是一个综合的业务运营和管理平台,同时也是真正融合了传统IP数据业务与移动增值 ...

  7. Mac系统下安装Homebrew后无法使用brew命令,-bash: brew: command not found

    使用如下命令: sudo vim .bash_profile 然后输入以下代码: export PATH=/usr/local/bin:$PATH 再使用以下命令使配置生效: source .bash ...

  8. 在 Ubuntu 16.04 LTS 上安装 Python 3.6.0

    原文连接:https://segmentfault.com/a/1190000007912666 最近 Python 3 发布了新版本 Python 3.6.0,好像又加入了不少黑魔法!- 由于暂时不 ...

  9. 推荐5个机器学习Python 库,国内外评价超高

    机器学习令人无比神往,但从事这个工作的人可能并不这么想. 机器学习的工作内容往往复杂枯燥又困难——通过大量重复工作进行提升必不可少: 汇总工作流及传输渠道.设置数据源以及在内部部署和云部署的资源之间来 ...

  10. coreos install hpssacli

    基于官方的coreos ramdisk安装hp raid管理工具,其版本为debian8 apt-get install curl nano /etc/apt/sources.list deb htt ...