总有人在抱怨Windows的关机是如何的缓慢,实际上Windows本身的关机速度已经很快的了。问题主要出在用户安装的程序上面,由于一些设计不好的应用程序或驱动程序的问题,造成了关机上的延迟。针对这个问题,网络上出现了类似于下面的技巧:
打开任务管理器,按住“Ctrl”键的同时,再单击任务管理器窗口中的菜单“关机→关闭”命令时,系统会快速地被关闭,同样,在按住“Ctrl”键时,选择其他命令(例如重新启动)时,也会达到快速执行该命令的目的。
同时,也出现了像SuperFast Shutdown一样的快速关机软件。
在讨论上述技巧原理之前,先说说Windows是如何关机的:Windows关机步骤涉及到Windows多个组件和多个过程,简单的说,Windows的关机步骤不是大多数人认为的那么简单。基本的过程是这样的:
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步使用的时间相同。
上述3个步骤是整个Windows关机过程中最耗费时间的一段,大多数关机缓慢的原因都是因为这3个步骤引起的。完成前3个步骤以后,进入了关机操作的第4个阶段,也是最后一个阶段。
4. Winlogon.EXE调用一个原生API函数NtShutdownSystem()来命令系统执行后面的扫尾工作。在这个阶段里面,Windows执行子系统会完成最后的关机操作,例如:设备驱动在这个阶段里面完成一些驱动设定的特殊操作; 也是在这个阶段,配置管理系统将被修改过的注册表数据会写道磁盘里面。等除了电源管理以后的全部子系统完成退出以后,电源管理完成最后的操作:如重启、关机等。
了解了Windows的关机流程以后,下面分析一下前面说的快速关机操作是怎么完成的。先分析一下SuperFast Shutdown的原理,SuperFast Shutdown是使用Visual Basic编写的,体积很小,就15KB,经过分析以后得出一个令人惊讶的结论:SuperFast Shutdown首先使用RtlAdjustPrivilege()提升自己的权限,然后直接调用NtShutdownSystem() 函数来完成关机过程。由于跳过了最为耗费时间的前3个步骤而直接进入第4个步骤,所以造成了能够很快关机的假象。
再看看任务管理器的快速关机是如何实现的:分析结果也是类似于SuperFast Shutdown的原理,也是通过省略一些步骤来加快关机的速度。
那么,为什么在快速关机以后会出现设置丢失的情况呢?原因在于前3个步骤里面有一个让进程正常退出的可能。大多数软件在编写的时候会把一些设置保存在自己私有的内存空间里面,当软件关闭的时候才把这些设置回写到特定的地方,如注册表或某个配置文件里面 。而关机操作的第4步并没有提供一种途径能够让这些设置记录下来,因为这个阶段Windows已经认为前面所有必须经过的流程已经完成,剩下的就是Windows核心组件的退出的问题了。在这种情况下,使用快速关机导致设置丢失也不足为怪了。
因此,为了你系统的健康,关机还是按照正常顺序来,数据的安全性往往比节省的那几十秒钟重要的多。
代码:
C++
HINSTANCE h=LoadLibrary("ntdll.dll");
if(!h)
...{
MessageBox("加载'ntdll.dll'失败!");
return;
}
typedef int (__stdcall *AdjustPrivilege)(int,int,int,int *);
AdjustPrivilege SetPrivilege=NULL;
SetPrivilege=(AdjustPrivilege)GetProcAddress(h,"RtlAdjustPrivilege");
if(!SetPrivilege)
...{
MessageBox("加载'RtlAdjustPrivilege'失败!");
return;
}
typedef int (__stdcall *ShutdownSystem)(int);
ShutdownSystem Shutdown=NULL;
Shutdown=(ShutdownSystem)GetProcAddress(h,"NtShutdownSystem");
if(!Shutdown)
...{
MessageBox("加载'NtShutdownSystem'失败!");
return;
}
const int SE_SHUTDOWN_PRIVILEGE = 19;
const int shutdown=0;
const int RESTART=1;
const int POWEROFF=2;
int a;
(*SetPrivilege)(SE_SHUTDOWN_PRIVILEGE,true,false,&a);
(*Shutdown)(shutdown);
FreeLibrary(h);
Delphi:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const SE_SHUTDOWN_PRIVILEGE = 19;
Const shutdown = 0;
Const RESTART = 1;
Const POWEROFF = 2;
var
Form1: TForm1;
implementation
{$R *.dfm}
function RtlAdjustPrivilege(dwPrivilegeId : DWORD ;bSet: Bool ; AdjType : Bool; Unc : PBool): word ; stdcall ; external 'ntdll';
function NtShutdownSystem(ShutdownAction:integer):word;stdcall;external'ntdll.dll';
procedure TForm1.Button1Click(Sender: TObject);
var a:PBool;
begin
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, True, False, a);
NtShutdownSystem(RESTART);
end;
end.
分享到:
相关推荐
"Windows关机程序源码"是一个学习Windows编程和系统控制的好资源,它可以帮助开发者了解如何通过编程来实现系统的自动化操作。下面我们将详细探讨这个主题,以及相关的知识点。 首先,我们要知道在Windows系统中,...
通过研究和理解这个源码,开发者不仅可以学习到C语言的基础,还能深入理解Windows API的使用,特别是与系统控制相关的部分,这对于进行系统级编程和提升Windows应用程序开发技能非常有帮助。同时,这也是一个很好的...
在Windows操作系统中,底层操作通常涉及系统级别的编程,如关机、重启等。这些功能的实现需要对系统API和汇编语言有深入的理解。本文将详细介绍Windows下的底层关机源码,以及涉及到的汇编语言知识。 首先,汇编...
总结来说,这款MFC编写的定时关机程序展示了如何在Windows环境下利用C++和MFC进行GUI编程,以及如何结合Windows API实现系统级别的控制。对于初学者,通过阅读和理解源码,可以学习到MFC的基本架构、消息处理机制...
Windows系统时间同步(NTP)工具(附源码) 1、使用指定局域网NTP服务,或公网NTP服务 2、设置同步时间间隔(与NTP服务通信频率) 3、设置最大时间偏差(自动同步系统时间) 4、发送时钟同步事件到指定服务器 5、可视化图形...
在Windows操作系统中,虽然内置了一些简单的定时任务设定,但通常需要通过命令行或者第三方软件来实现定时关机。本项目采用VB(Visual Basic)编程语言开发了一款专门的定时关机工具,为用户提供了一个更加直观和...
标题中的“Win2000系统关机源码”指的是Windows 2000操作系统中的关机程序的原始代码。Windows 2000是由微软公司发布的一个基于NT内核的服务器和个人计算机操作系统,它在当时是Windows NT系列的一个重要版本,提供...
【标题】"电脑自动关机系统源码"指的是一个能够实现计算机定时自动关机功能的程序源代码。在计算机编程领域,这样的系统通常涉及到操作系统级别的交互,用于在预设的时间点执行关机操作。 【描述】提到这个源码可以...
在Windows系统中,我们可以调用` rundll32.exe powrprof.dll, SetSuspendState Hibernate `命令来实现关机;在Linux系统中,可以使用`shutdown`或`systemctl`命令。在Qt中,我们可以使用`QProcess`类来执行这些系统...
开发环境VS2010 C#,运行平台为Windows7操作系统,源码在压缩包中。 主要涉及C#中注册表修改的函数使用,希望对喜欢系统优化和编程的同学有所帮助。小弟系软件工程专业学生,愿结交朋友,可以加我QQ 444982047,...
《Windows网络编程技术》附书源码《Windows网络编程技术》附书源码《Windows网络编程技术》附书源码《Windows网络编程技术》附书源码《Windows网络编程技术》附书源码《Windows网络编程技术》附书源码
易语言局域网控制系统关机源码。@紫旭。 。
易语言源码易语言调用系统各种关机对话框源码.rar 易语言源码易语言调用系统各种关机对话框源码.rar 易语言源码易语言调用系统各种关机对话框源码.rar 易语言源码易语言调用系统各种关机对话框源码.rar 易语言...
Windows Mobile健康管理系统源码Windows Mobile健康管理系统源码Windows Mobile健康管理系统源码Windows Mobile健康管理系统源码Windows Mobile健康管理系统源码Windows Mobile健康管理系统源码Windows Mobile健康...
本项目提供了Android 8.1版本的定时开关机的完整源码,这对于开发者来说是一个宝贵的资源,可以帮助他们深入理解Android系统的内部工作原理。 在标签中提到了"mtk",这意味着该源码可能适用于搭载MediaTek(联发科...
本资源“易语言源码易语言完整定时关机源码.rar”提供了一个使用易语言编写的完整定时关机程序的源代码,这对于学习易语言和了解系统管理功能的开发者来说是极好的参考资料。 首先,我们来探讨易语言的核心特性。...
在IT领域,尤其是在Windows操作系统开发和管理中,获取系统的开关机时间是一项常见的需求。这篇内容主要探讨了如何使用C#编程语言通过系统日志来实现这一功能,并且提供了可能的扩展,例如获取系统错误码等信息。...
在“易语言源码易语言windows快速关机源码.rar”这个压缩包中,包含的是一段用易语言编写的Windows系统快速关机的源代码。这段源代码的主要目标是实现一键快速关闭Windows操作系统,对于学习易语言和系统控制的...
完整的零基础学习windows下驱动编程(内附源码)。内核编程环境配置;串口过滤、键盘过滤;磁盘虚拟;磁盘过滤;文件系统过滤与监控;文件系统透明加密;文件系统微过滤;网络传输层过滤;NDIS协议驱动;NDIS小端口...
#Windows实用系统工具 用C++实现一个可以在Windows系统下关机、删除C盘用户等功能的小程序源码+程序 分析详见:https://blog.csdn.net/pyz258/article/details/130663107spm=1001.2014.3001.5501