服务对应的 2 进制文件可以分作可执行文件和 DLL 动态链接库文件两类。对于可执行
文件来说,其本身就是服务的宿主程序,而对于 DLL 动态链接库来说,需要一个宿主程序
来引导服务的启动。
Svchost.exe,是大多数WIndows 服务的宿主程序。Svchost.exe 程序就是一个用于加
载服务对应的2 进制文件类型为 DLL 的宿主程序。
Svchost.exe 一般位于%systemroot%\system32 目录下面,另外,如果启用了 DllCache
功能,还可能存在于%systemroot%\system32\dllcache 目录下。另外,如果 Windows
Service Pack 不是使用集成安装的,那么还可能存在于%systemroot%\ServicePack 目录
下。除此之外,svchost.exe 不应该存在于其他的目录下面。如果存在,那么这个svchost.exe
可能不是系统自带的而是计算机病毒等一些恶意软件生成的,请小心检查。
Svchost.exe 作为服务的宿主程序,在启动的时候,通过以下方法来启动服务:系统启
动的时候,系统读取注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\SvcHost 下的键值。在这个分支下,有很多键值类型为 REG_MULTI_SZ
的键值,每一个键值代表一组服务。Svchost.exe 的每个实例将执行一个键值类型为
REG_MULTI_SZ 的键值,举例来说,当svchost.exe 开始读取 netsvcs 的时候,系统将创
建一个svchost.exe 的实例(在任务管理器里面呈现为进程)来处理netsvcs 键值的数据。
所有在 netsvcs 里面描述的服务将运行于一个 svchost.exe 进程里面,也就是说,一个
svchost.exe 将处理所有 netsvcs 里面记录的服务。这就是所谓的宿主的概念。不过有一点
需要注意,如果有任何一个服务发生问题,可能导致宿主程序svchost.exe 崩溃,甚至导致
Windows 崩溃。
在不同的系统中,svchost.exe 的实例数目是不相同的。这是因为微软将不同的服务归
结到不同的svchost.exe 实例,在Windows Server 2003 下,RpcSs 服务就单独的由一个
svchost.exe 负责,这是为了保证不会由于其他服务的错误而导致整个svchost.exe 进程错
误。我们可以这样理解:如果有一个svchost.exe 作为2 个服务的宿主,其中一个是系统重
要的服务 A,如果A 停止,则整个系统就崩溃,而另外一个服务是 B,B 不是一个重要的
服务,停止 B 不会引起整个系统的崩溃。如果某一天服务 B 发生异常,导致 B 的宿主程序
svchost.exe 崩溃,那么也会导致服务A 崩溃,从而导致系统崩漏。因此,一个svchost.exe
作为几个服务的宿主是很重要的,也不要对比自己的系统里面的svchost.exe 实例数量为什
么要比别人的多,影响svchost.exe 实例数量完全决定于你开启的服务的数量。
要确定一个 svchost.exe 作为哪些服务的宿主,可以在命令行方式下运行 tasklist /svc
查看(Windows XP/Server2003)。如图所示。