/*------------------------------------Author: Ted--Nefarian ZhuDate: 2011/04/20 03:30Version: 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 serviceBOOL 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 startBOOL 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 startBOOL 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 serviceBOOL 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 serviceBOOL 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 serviceBOOL 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 serviceBOOL 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--------*/