首页
社区
课程
招聘
[翻译]windows关机过程(一)
发表于: 2023-5-8 16:29 7802

[翻译]windows关机过程(一)

2023-5-8 16:29
7802

1.系统关闭过程涉及不同的组件。Wininit在完成所有初始化后,等待系统关闭。

 

2.如果有人已经登录,而一个进程通过调用Windows ExitWindowsEx函数来发起关闭,那么一个消息会被发送到该会话的Csrss,要求它执行关闭操作。然后Csrss会冒充调用者并向winlogon发送RPC消息,告诉它执行系统关闭。Winlogon会检查系统是否处于混合引导转换的过程中(以进一步确定关闭过程的具体步骤),如果是,则执行混合引导过渡的相关操作;如果不是,则进一步检查当前是否有用户登录,是否存在未保存的更改,等等。最后,Winlogon向所有正在运行的进程发送 WM_QUERYENDSESSION 消息,以确定它们是否可以安全地关闭。如果所有进程都可以安全地关闭,则Winlogon会继续发送 WM_ENDSESSION 消息来通知它们进行清理操作,最终执行系统关闭。

 

3.启动系统关机的用户,会要求LogonUl淡出屏幕(可以通过注册表值HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon进行配置)。然后,用户会调用ExitWindowsEx函数并传递特殊的内部标志,同时调整FadePeriodConfiguration,该调用会发送一条消息到该会话中的Csrss进程,请求系统关机。

 

4.Csrss会识别到请求来自Winlogon,并按照它们的关闭级别(Shutdown Level)的相反顺序,循环遍历交互用户的登录会话中的所有进程(再次强调,不是请求关闭的用户)。进程可以通过调用SetProcessShutdownParameters函数指定其关闭级别,该级别指示系统何时希望该进程相对于其他进程退出。有效的关机级别范围是0到1023,缺省级别为640。例如,资源管理器(Explorer)将其关闭级别设置为2,而任务管理器则指定为1。对于每个拥有顶层窗口的活动进程,Csrss会向该进程中每个具有Windows消息循环的线程发送WM_QUERYENDSESSION消息。如果线程返回TRUE,则系统关机可以继续。然后,Csrss会向该线程发送WM_ENDSESSION消息以请求其退出。Csrss等待在HKCU\Control Panel\Desktop\HungAppTimeout中定义的秒数,等待该线程退出。(缺省值为5000毫秒。)

 

如果线程在超时之前未退出,Csrss会淡出屏幕并显示如图12-14所示的挂起程序屏幕。(您可以通过创建注册表值HKCU\Control Panel\Desktop\AutoEndTasks并将其设置为1来禁用此屏幕。)该屏幕指示当前正在运行的程序以及它们的当前状态(如果可用)。Windows会指示哪个程序没有及时关闭,并给用户一个选择:要么终止该进程,要么取消关机。(此屏幕没有超时限制,这意味着在此时,关机请求可能会一直等待。)此外,第三方应用程序可以添加它们自己的特定状态信息,例如,虚拟化产品可以使用ShutdownBlockReasonCreate API显示正在运行的虚拟机数量。

 

 

5.我们可以通过运行记事本(Notepad),输入文本到其编辑器中,然后注销来看到 HungAppTimeout 注册表值的使用。在超过 HungAppTimeout 注册表值指定的时间后,Csrss.exe 将显示一个提示,询问您是否要结束 Notepad 进程,因为它还未退出,正在等待您告诉它是否将输入的文本保存到文件中。如果您选择取消,则 Csrss.exe 将中止关机过程。

 

您可以通过运行记事本(Notepad),输入文本到其编辑器中,然后注销来看到 HungAppTimeout 注册表值的使用。在超过 HungAppTimeout 注册表值指定的时间后,Csrss.exe 将显示一个提示,询问您是否要结束 Notepad 进程,因为它还未退出,正在等待您告诉它是否将输入的文本保存到文件中。如果您选择取消,则 Csrss.exe 将中止关机过程。

 

第二个实验,如果您再次尝试关闭计算机(在记事本的查询对话框仍然打开的情况下),记事本将显示自己的消息框,告知您无法干净地进行关闭。然而,这个对话框只是一个信息提示框,帮助用户了解情况。Csrss.exe仍然会认为记事本是“挂起”的,并显示用户界面来终止无响应的进程。

 

如果线程在超时前退出,Csrss将继续向该进程中拥有窗口的其他线程发送WM_QUERYENDSESSION / WM_ENDSESSION消息对。一旦该进程中拥有窗口的所有线程都已退出,Csrss终止该进程并继续处理交互式会话中的下一个进程。

 

如果Csrss发现控制台应用程序,它通过发送CTRL_LOGOFF_EVENT事件来调用控制台控制处理程序。(只有服务进程在关机时会收到CTRL_SHUTDOWN_EVENT事件。)如果处理程序返回FALSE,Csrss会终止该进程。如果处理程序返回TRUE或在HKCU \ Control Panel \ Desktop \ WaitToKillTimeout定义的秒数内未响应(默认为5,000毫秒),Csrss将显示图12-14所示的挂起程序屏幕。接下来,Winlogon状态机调用ExitWindowsEx来让Csrss终止作为交互式用户会话的一部分的任何COM进程。

 

此时,交互式用户会话中的所有进程都已终止。接下来,Wininit调用ExitWindowsEx,这次是在系统进程上下文中执行。这会导致Wininit向会话0中的Csrss部分发送一条消息,服务即驻留在其中。然后,Csrss查看属于系统上下文的所有进程,并对GUI线程执行并发送WM_QUERYENDSESSION / WM_ENDSESSION消息(与之前一样)。但是,对于已注册控制处理程序的控制台应用程序,它不会发送CTRL_LOGOFF_EVENT,而是发送CTRL_SHUTDOWN_EVENT。如果SCM是一个控制台程序,则会注册一个控制处理程序。当它接收到消息时,它将执行所需的操作,否则Csrss将杀死该进程。

 

虽然 Csrss 在终止用户进程时执行了相同的超时,但它不显示任何对话框,也不会终止任何进程。(系统进程超时的注册表值来自默认用户配置文件。)这些超时只是为了让系统进程有机会在系统关闭之前清理并退出。因此,许多系统进程实际上仍在运行,例如 Smss、Wininit、Services 和 LSASS。
一旦Csrss完成了通知系统进程系统正在关闭的过程,它会向Winlogon返回,Winlogon随后调用 ExitWindowsEx来完成系统的关闭。

 

Wininit在完成通知系统进程关机的任务后会被唤醒,等待60秒以确保所有会话都已经被销毁,然后(如果需要)调用SystemRestore(在这个阶段,系统中没有活动的用户进程,因此还原应用程序可以处理之前可能正在使用的所有需要文件)。Wininit通过关闭LogonUI和调用执行子系统函数NtShutdownSystem来完成关机过程。此函数调用函数PoSetSystemPowerState来协调驱动程序和其余执行子系统(Plug and Play管理器、电源管理器、执行子系统、I/O管理器、配置管理器和内存管理器)的关闭。
例如,PoSetSystemPowerState 调用 I/O 管理器向所有请求关闭通知的设备驱动程序发送关闭 I/O 数据包。这个操作给了设备驱动程序在 Windows 退出之前执行特殊处理的机会。工作线程的堆栈被交换,配置管理器将所有修改后的注册表数据刷新到磁盘上,内存管理器将所有包含文件数据的修改页面写回到它们各自的文件中。如果启用了在关闭时清除分页文件的选项,则内存管理器会在此时清除分页文件。然后再次调用 I/O 管理器,通知文件系统驱动程序系统正在关闭。系统关闭最终由电源管理器结束。电源管理器所采取的措施取决于用户是否指定了关闭、重启或关机。

 

现代应用程序都依赖于Windows关机接口(WSI)来正确关闭系统。WSI API仍然使用RPC在进程之间进行通信,并支持宽限期。宽限期是一种机制,用于在关机实际开始之前通知用户。即使系统需要安装更新,也会使用此机制。Advapi32使用WSI与Wininit通信。Wininit排队一个定时器,在宽限期结束时触发并调用Winloaon初始化关机请求。然后调用ExitWindowsEx,其余过程与先前的过程相同。所有的UWP应用程序(甚至新的开始菜单)都使用ShutdownUX模块来关闭系统。ShutdownUX管理UWP应用程序的电源转换,并与Advapi32.dll链接。

 

休眠和快速启动:

 

为了提高系统启动时间,Windows 8引入了一个名为快速启动(也称为混合启动)的新功能。在之前的Windows版本中,如果硬件支持S4系统电源状态(有关电源管理器的更多详细信息,请参见第1部分第6章),Windows允许用户将系统置于休眠模式。要充分理解快速启动,需要完整描述休眠过程。

 

Regenerate response


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 3
支持
分享
最新回复 (3)
雪    币: 1645
活跃值: (5355)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
谢谢
2023-5-8 21:54
0
雪    币: 97
活跃值: (141)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2023-12-28 06:44
0
雪    币: 11
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很详细的过程
2023-12-28 20:28
0
游客
登录 | 注册 方可回帖
返回
//