Windows系统服务原理

简单地说,Windows服务是一类Win32可执行程序,通常无界面,由控制台形式的程序实现。这类程序常驻内存,受到操作系统优待。Windows服务(NT服务)分为服务应用程序和内核驱动服务程序,本文利用服务应用程序对检测系统进行健壮性守护,故不对内核驱动服务类程序进行深入探讨。实现Windows服务需要动态链接库、线程及同步、结构异常处理、虚拟内存、内存映射文件、设备I/O及WinAPI 函数应用接口等多种技术的支持。

服务由Service Control Manager(SCM)、服务本身、Service Control Dispatcher(SCP)组成。

SCM位于Service.exe中,是Windows NT/2000系统的基础构件,伴随着操作系统的生命周期启动和终止。SCM包含一个存储着已安装服务和驱动程序信息的数据库,并统一管理这些信息,当有服务程序安装时,将其自身信息写入数据库。服务本身通常由用户自己实现,负责从SCM接收信号并执行服务本身想要执行的功能代码,执行结束后向SCM返回状态信息。

SCP负责与SCM通讯,通过提供用户界面控制计算机服务上的Win32应用程序。在实际开发的过程中,用户有时需要自定义客户端作为SCP与SCM进行通讯,Windows管理工具中的“服务”是Windows操作系统中最典型的SCP。

Windows服务的开发原理如图所示。

Windows系统服务原理_第1张图片

服务多为控制台程序,故以Main函数作为程序入口函数。

主函数中,初始化SERVICE_TABLE_ENTRY结构数组,该结构数组列出服务程序中包含的服务名称及进入点函数地址,结尾以NULL标识数组结束。

结构数组初始化完毕后,通过调用StartServiceCtrlDispatcher函数与SCM通信,为数组中每一个非空元素创建一个服务控制分派线程去执行其ServiceMain函数。

ServiceMain函数通过调用RegisterServiceCtrlHandler函数来回调控制请求处理函数CtrlHandler,利用SetServiceStatus函数与SCM通信,告之初始化服务状态信息。

CtrlHandle负责响应来自SCP的控制命令并告之SCM服务状态信息。

值得一提的是,ServiceMain函数和CtrlHandle函数都是需要用户自己定义的函数,其函数名并不固定,但必须保持一致的函数原型,ServiceMain函数和CtrlHandler函数原型定义如表一所示。

Windows系统服务原理_第2张图片

你可能感兴趣的:(windows)