/*------------------------------------
Author: Ted--Nefarian Zhu
Date: 2011/04/20 03:30
Version: V1.00 All rights reserved !
Life sucks,but we all have to move on!
------------------------------------*/
#ifndef CSERV_H_H
#define CSERV_H_H
#include <windows.h>
class CServ
{
private:
SC_HANDLE m_hSC, m_hSvc;
SERVICE_STATUS m_status;
LPQUERY_SERVICE_CONFIG m_config;
DWORD m_dwNeeded;
public:
CServ();
~CServ();
BOOL OpenServ(const char* servname);
BOOL AutoServ(const char* servname);
BOOL DemandServ(const char* servname);
BOOL DisableServ(const char* servname);
BOOL CheckServ(const char* servname,
char buff[],int buffsize);
BOOL StartServ(const char* servname);
BOOL StopServ(const char* servname);
};
CServ::CServ()
{
m_hSC = NULL;
m_hSvc = NULL;
memset(&m_status, 0, sizeof(SERVICE_STATUS));
memset(&m_config, 0, sizeof(LPQUERY_SERVICE_CONFIG));
m_dwNeeded = 0;
}
CServ::~CServ()
{
if (m_hSvc != NULL) CloseServiceHandle(m_hSvc);
if (m_hSC != NULL) CloseServiceHandle(m_hSC);
}
//Open the specified service
BOOL CServ::OpenServ(const char* servname)
{
m_hSC = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (m_hSC == NULL)
{
return FALSE;
}
m_hSvc = OpenService(m_hSC, servname, SERVICE_ALL_ACCESS|DELETE);
if (m_hSvc == NULL)
{
CloseServiceHandle(m_hSC);
return FALSE;
}
return TRUE;
}
//Make the specified service auto start
BOOL CServ::AutoServ(const char* servname)
{
assert(m_hSvc != NULL);
m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 4096);
BOOL isSuccess = QueryServiceConfig(m_hSvc, m_config, 4096, &m_dwNeeded);
if (!isSuccess) return FALSE;
if (m_config->dwStartType != SERVICE_AUTO_START)
{
isSuccess = ChangeServiceConfig(m_hSvc, SERVICE_NO_CHANGE,
SERVICE_AUTO_START, SERVICE_NO_CHANGE,
NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
if (!isSuccess) return FALSE;
return TRUE;
}
//Make the specified service demand start
BOOL CServ::DemandServ(const char* servname)
{
assert(m_hSvc != NULL);
m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 4096);
BOOL isSuccess = QueryServiceConfig(m_hSvc, m_config, 4096, &m_dwNeeded);
if (!isSuccess) return FALSE;
if (m_config->dwStartType != SERVICE_DEMAND_START)
{
isSuccess = ChangeServiceConfig(m_hSvc, SERVICE_NO_CHANGE,
SERVICE_DEMAND_START, SERVICE_NO_CHANGE,
NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
if (!isSuccess) return FALSE;
return TRUE;
}
//Disable the specified service
BOOL CServ::DisableServ(const char* servname)
{
assert(m_hSvc != NULL);
m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR, 4096);
BOOL isSuccess = QueryServiceConfig(m_hSvc,m_config,4096,&m_dwNeeded);
if (!isSuccess) return FALSE;
if (m_config->dwStartType != SERVICE_DISABLED)
{
isSuccess = ChangeServiceConfig(m_hSvc, SERVICE_NO_CHANGE,
SERVICE_DISABLED, SERVICE_NO_CHANGE,
NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
if (!isSuccess) return FALSE;
return TRUE;
}
//Check the status of the specified service
BOOL CServ::CheckServ(const char* servname,char buff[],int buffsize)
{
assert(m_hSvc != NULL);
m_config = (LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR,4096);
BOOL isSuccess = QueryServiceConfig(m_hSvc,m_config,4096,&m_dwNeeded);
if (!isSuccess) return FALSE;
if (m_config->dwStartType == SERVICE_AUTO_START)
memcpy(buff,"SERVICE_AUTO_START",sizeof("SERVICE_AUTO_START"));
else if (m_config->dwStartType == SERVICE_DEMAND_START)
memcpy(buff,"SERVICE_DEMAND_START",sizeof("SERVICE_DEMAND_START"));
else if (m_config->dwStartType == SERVICE_DEMAND_START)
memcpy(buff,"SERVICE_DISABLED",sizeof("SERVICE_DISABLED"));
if(QueryServiceStatus(m_hSvc,&m_status) == FALSE) return FALSE;
if( m_status.dwCurrentState == SERVICE_RUNNING)
{
strcat(buff," SERVICE_RUNNING");
return TRUE;
}
else if(m_status.dwCurrentState == SERVICE_STOPPED)
{
strcat(buff," SERVICE_STOPPED");
return TRUE;
}
else return FALSE;
}
//Start the specified service
BOOL CServ::StartServ(const char* servname)
{
assert(m_hSvc != NULL);
if(QueryServiceStatus(m_hSvc,&m_status) == FALSE) return FALSE;
// start the service
if(StartService( m_hSvc, 0, NULL) == FALSE) return FALSE;
// wait until the service is started
while(QueryServiceStatus(m_hSvc, &m_status) == TRUE)
{
Sleep(1000);
if( m_status.dwCurrentState == SERVICE_RUNNING)
{
return TRUE;
}
}
}
//Stop the specified service
BOOL CServ::StopServ(const char* servname)
{
assert(m_hSvc != NULL);
if(QueryServiceStatus(m_hSvc,&m_status) == FALSE) return FALSE;
// stop the service
if(ControlService(m_hSvc,SERVICE_CONTROL_STOP,&m_status)==FALSE)
{
return FALSE;
}
// wait until the service is stoped
while(QueryServiceStatus(m_hSvc, &m_status) == TRUE)
{
Sleep(1000);
if( m_status.dwCurrentState == SERVICE_STOPPED)
{
return TRUE;
}
}
}
#endif /*-------CSERV_H_H--------*/