当系统开始关闭的时候,Win32ExitWindowsEx函数发送消息给系统进程Csrss,调用Csrss的关闭例程。Csrss遍历所有
进程同志它们系统正在关闭。在通报下一个进程前,Csrss等待除SCM以外的每个系统进程退出,等待时间为:
HKLM\.DEFAULT\ControlPanel\Desktop\WaitToKillAppTimeout,缺省为20秒。当Csrss遇到SCM进程时,也通知SCM系统正
在关闭,并等待为SCM指定的超时。在系统初始化的时候,SCM通过RegisterServicesProcess函数向Csrss注册它的进程ID,
Csrss通过使用SCM的进程ID来识别SCM。SCM的超时值为:
HKLM\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout,缺省为20秒。
SCM的关闭处理程序发送关闭通知给所有SCM初始化时申请需要关闭通知的服务。SCM的ScShutdownAllServices遍历
SCM数据库寻找那些请求关闭通知的服务,并发送关闭通知,同时记录等待延时。发送关闭通知后,SCM等待通知的服务退
出或者等待超时为止。如果服务超时没有退出,SCM测定一个或者多个等待退出的服务是否发送一个消息给SCM,这个消息
是来告诉SCM服务在关闭过程中取得的进展。如果至少一个服务有进展,SCM就在延时等待范围内再等待一次。SCM持续该
等待循环,直到所有服务退出,或者在等待延时范围内没有收到服务的进展信息为止。
当SCM通知服务关系并且等待服务退出的时候,Csrss等待SCM退出。如果Csrss等待超时,而SCM还没有退出,Csrss就
继续关闭过程,所以,在系统关闭时,没有在规定时间内成功关闭的服务只是简单地同SCM一起执行。