一般来说,服务的基本操作有注册(创建)、启动、暂停、停止、卸载操作,下面分别介绍服务的注册(创建)、启动、停止以及卸载操作。
在介绍服务的基本操作前,不得不提一个概念, 即服务管理器(services.exe),服务管理器的主要工作是管理操作系统上的所有服务,其中包括跟踪、维护服务的各种状态,以及对服务发起具体的操作。开发者可以通过服务管理器来查询服务状态、修改服务配置、注册(创建)新服务、启动服务等。而实际上,上面提及到的服务基本操作,都是基于服务管理器的操作,换句话说,开发者通过API (应用程序编程接口)操作服务,API内部首先会通过一一个称为“LPC”(本地方法调用)的方式,把请求发送给服务管理器,服务管理器再处理具体的请求。
1、打开服务管理器:
SC_HANDLE WINAPI OpenSCManager(
LPCTSTR lpMachineName, //机器的名字,NULL表示本机的服务管理器
LPCTSTR lpDatabaseName,//数据库的名字,NULL表示打开的是一一个活动数据库
DWORD dwDesireAccess);
第三个参数比较关键,为一个DWORD类型的值,表示权限。开发者通过服务管理器去操作服务时,不同的操作需要不同的权限。常用的服务管理器权限有:
SC_MANAGER_CREATE_SERVICE: 表示拥有注册(创建)服务的权限。
SC_MANAGER_ENUMERATE_SERVICE: 表示拥有枚举系统服务的权限。
SC_MANAGER_ALL_ACCESS:表示拥有一切权限。
当这个服务管理器句柄不再需要使用,开发者需要调用CloseServiceHandle()来关闭句柄。
2、服务的创建
SC_ HANDLE WINAPI CreateService(
SC_ HANDLE hSCManager, //服务管理器句柄
LPCTSTR lpServiceName, //要创建服务的名字
LPCTSTR lpDisplayName, //服务显示的名字
DWORD dwDesiredAccess, //服务的权限,返回的句柄要启动服务使用的权限
DWORD dwServiceType, //服务的类型
DWORD dwStartType ,//服务的启动方式
DWORD dwErrorControl ,//服务的错误控制
LPCTSTR lpBinaryPathName,//服务的可执行文件全路径
LPCTSTR lpLoadOrderGroup ,//服务所在分组的名字,可为NULL
LPDWORD lpdwTagId,//服务所在分组内的标识,可为NULL
LPCTSTR lpDependencies,//服务依赖的服务,可为NULL
LPCTSTR lpServiceStartName ,//以什么身份启动服务,可为NULL
LPCTSTR lpPassword//那个身份的密码,可为NULL
);
当这个服务句柄不再需要使用,开发者需要调用CloseServiceHandle()来关闭句柄。
3、服务的启动与停止
启动服务
BOOL WINAPI StartService(
SC_ HANDLE hService, //服务句柄
DWORD dwNumServiceArgs,//启动参数,同 argc
LPCTSTR *IpServiceArgVectors//启动参数,同 argv[]
);
停止服务
BO0L WINAPI ControlService(
sc HANDLE hService, //服务句柄
DWORD dwControl,//控制码,停止,挂起。。。
LPSERVICE_ STATUS lpServiceStatus//返回的参数,返回被控制的服务的最新状态
);
4、服务的删除
BOOL WINAPI DeleteService(
SC_HANDLE hService //服务的句柄
);
5、例子
#include "stdafx. h"
#include "windows .h"
#define SER NAME _T("FirstDriver")int main()
SC_ HANDLE hSCM = NULL;
SC_ HANDLE hSer = NULL ;
do{
hSCM = OpenSCManager( NULL,NULL,SC_ _MANAGER _CREATE SERVICE );
if( hSCM == NULL ){
break;
}
//TCHAR *p = SER_ NAME;
hSer = CreateService(
hSCM,//句柄
SER_ NAME ,//服务名称
SER_ NAME,//服务显示的名字
SERVICE_ ALL ACCESS,//所有权限打开
SERVICE_ KERNEL _DRIVER,//内核 类型的服务
SERVICE_ DEMAND_ START,//服务启动类型,这里是手动启动
SERVICE_ ERROR_ IGNORE,//错误类型
_T("C:\\FirstDriver. sys"),//sys文件所在的磁盘目录
NULL,//服务所在的组,不关心顺序,传递NULL
NULL,//服务的Tag,这里不关心,传递NULL
NULL,//服务的依赖,这里没有依赖,传递NULL
NULL,//服务的启动用户名,传递NULL
NULL);//服务启动用户名对应的密码,传递NULL
if( hSer == NULL )
{
DWORD dwErrorCode = GetLastError();
if( dwErrorCode == ERROR_ SERVICE_ EXISTS ) //ERROR SERVICE_ EXISTS 表示服务已经存在,不能重复注册,属于正常的情况
{
hSer = OpenService( hSCM , SER NAME , SERVICE_ ALL_ ACCESS );
if( hSer == NULL ){
//打开失败
break;
}
}
else
{
break;
}
}
printf("CreateService or OpenService succ n");
getchar();
//准备启动服务
BOOL bSucc = StartService( hSer , NULL , NULL );
printf("StartService:%uln" , bSucc );
getchar();
//停止服务
SERVICE_ STATUS SerStatus = [o];
bSucc = ControlService( hSer , SERVICE_ CONTROL_ STOP , &SerStatus );
printf("ControlService:%un" ,bSucc );
getchar();
//下面开始删除服务
DeleteService( hSer );
}
while( FALSE );
if( hSCM != NULL )
{
CloseServiceHandle( hSCM );
hSCM = NULL;
}
if( hSer != NULL )
{
CloseServiceHandle( hSer );
hSer = NULL;
}
return 0;
}