一、序言

  Windows下的服务程式都遵循服务控制管理器(SCM)的接口标准,他们会在登录系统时自动运行,甚至在没有用户登录系统的情况下也会正常执行,类似和UNIX系统中的守护进程(daemon)。他们大多是控制台程式,但是也有少数的GUI程式。本文所涉及到的服务程式仅限于Windows2000/XP系统中的一般服务程式,不包含Windows9X。

  二、Windows服务简介

  服务控制管理器拥有一个在注册表中记录的数据库,包含了任何已安装的服务程式和设备驱动服务程式的相关信息。他允许系统管理员为每个服务自定义安全需要和控制访问权限。Windows服务包括四大部分:服务控制管理器(Service Control Manager),服务控制程式(Service Control Program),服务程式(Service Program)和服务配置程式(Service Configuration Program)。

  1.服务控制管理器(SCM)

  服务控制管理器在系统启动的早期由Winlogon进程启动,可执行文档名是“Admin$/System32/Services.exe”,他是系统中的一个RPC服务器,因此服务配置程式和服务控制程式能够在远程操纵服务。他包括以下几方面的信息:

  已安装服务数据库:服务控制管理器在注册表中拥有一个已安装服务的数据库,他在服务控制管理器和程式添加,删除,配置服务程式时使用,在注册表中数据库的位置为:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services。他包括很多子键,每个子键的名字就代表一个对应的服务。数据库中包括:服务类型(私有进程,共享进程),启动类型(自动运行,由服务控制管理器启动,无效),错误类型(忽略,常规错误,服务错误,关键错误),执行文档路径,依赖信息选项,可选用户名和密码。

  自动启动服务:系统启动时,服务控制管理器启动任何“自启”服务和相关依赖服务。服务的加载顺序:顺序装载组列表:

  HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/ServiceGroupOrder;指定组列表:    
  HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/GroupOrderList;每个服务所依赖的服务程式。

  在系统成功引导后会保留一份LKG(Last-Know-Good)的配置信息位于:

  HKEY_LOCAL_MACHINE/SYSTEM/ControlSetXXX/Services。

  因需要而启动服务:用户能够使用服务控制面板程式来启动一项服务。服务控制程式也能够使用StartService来启动服务。服务控制管理器会进行下面的操作:获取帐户信息,登录服务项目,创建服务为悬挂状态,分配登录令牌给进程,允许进程执行。

  服务记录列表:每项服务在数据库中都包含了下面的内容:服务名称,开始类型,服务状态(类型,当前状态,接受控制代码,退出代码,等待提示),依赖服务列表指针。

  服务控制管理器句柄:服务控制管理器支持句柄类型访问以下对象:已安装服务数据库,服务程式,数据库的锁开状态。

  2.服务控制程式(SCP)

  服务控制程式能够执行对服务程式的开启,控制和状态查询功能:

  开启服务:假如服务的开启类型为SERVICE_DEMAND_START,就能够用服务控制程式来开始一项服务。在开始服务的初始化阶段服务的当前状态为:SERVICE_START_PENDING,而在初始化完成后的状态就是:SERVICE_RUNNING。

  向正在运行的服务发送控制请求:控制请求能够是系统默认的,也能够是用户自定义的。标准控制代码如下:停止服务(SERVICE_CONTROL_STOP),暂停服务(SERVICE_CONTROL_PAUSE),恢复已暂停服务(SERVICE_CONTROL_CONTINUE),获得更新信息(SERVICE_CONTROL_INTERROGATE)。

  3.服务程式

  一个服务程式可能拥有一个或多个服务的执行代码。我们能够创建类型为SERVICE_WIN32_OWN_PROCESS的只拥有一个服务的服务程式。而类型为SERVICE_WIN32_SHARE_PROCESS的服务程式却能够包含多个服务的执行代码。详情参见后面的Windows服务和编程。

  4.服务配置程式

  编程人员和系统管理员能够使用服务配置程式来更改,查询已安装服务的信息。当然也能够通过注册表函数来访问相关资源。

  服务的安装,删除和列举:我们能够使用相关的系统函数来创建,删除服务和查询任何服务的当前状态。

  服务配置:系统管理员通过服务配置程式来控制服务的启动类型,显示名称和相关描述信息。

  三、Windows服务和编程

  Windows服务编程包括几方面的内容,下面我们将从服务控制程式,服务程式和服务配置程式的角度介绍服务编程相关的内容。

  1.服务控制程式

  执行服务控制程式的相关函数前,我们需要获得一个服务对象的句柄,方式有两种:由OpenSCManager来获得一台特定主机的服务控制管理器数据库的句柄;使用OpenService或CreateService函数来获得某个服务对象的句柄。

  启动服务:要启动一个服务,服务控制程式能够使用StartService来实现。假如服务控制管理器数据库被锁定,那需要等待一定的时间然后再次测试StartService函数。当然也能够使用QueryServiceLockStatus函数来确认数据库的当前状态。在启动成功完成时,那么dwCurrentState参数将会返回SERVICE_RUNNING值。

  服务控制请求:服务控制程式使用ControlService函数来发送控制请求到正在运行的服务程式。他会向控制句柄函数发送一个特定的控制命令,能够是系统默认的,也能够是用户自定义的。而且每个服务都会确定自己将会接收的控制命令列表。使用QueryServiceStatus函数时,在返回的dwControlsAccepted参数中表明服务程式将会接收的控制命令。任何的服务都会接受SERVICE_CONTROL_INTERROGATE命令。

  2.服务程式

  一个服务程式内能够包含一个服务或多个服务的执行代码,但是他们都拥有固定的三个部分:服务main函数,服务ServiceMain函数和服务Control Handler函数。

  服务main函数:服务程式通常是以控制台的方式存在的,所以他们的入口点都是main函数。在服务控制管理器开始一个服务程式时,会等待StartServiceCtrlDispatcher函数的执行。假如服务类型是SERVICE_WIN32_OWN_PROCESS就会立即调用StartServiceCtrlDispatcher函数的执行;假如服务类型是SERVICE_WIN32_SHARE_PROCESS,通常在初始化任何服务之后再调用他。StartServiceCtrlDispatcher函数的参数就是个SERVICE_TABLE_ENTRY结构,他包含了进程内任何服务的名称和服务入口点。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!