Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
#ifndef _SCMMANAGER_HXX_
#define _SCMMANAGER_HXX_
#include <winsvc.h>
//
// WaitHint for SERVICE_START_PENDING
//
const DWORD HTTPFILTER_SERVICE_STARTUP_WAIT_HINT = 180 * 1000; // 3 minutes
//
// WaitHint for SERVICE_STOP_PENDING
//
const DWORD HTTPFILTER_SERVICE_STOP_WAIT_HINT = 180 * 1000; // 3 minutes
class SCM_MANAGER { public: SCM_MANAGER( const WCHAR * pszServiceName ) { _hService = NULL; _hServiceStopEvent = NULL; _hServicePauseEvent = NULL; _hServiceContinueEvent = NULL; _dwStartupWaitHint = HTTPFILTER_SERVICE_STARTUP_WAIT_HINT; wcsncpy( _szServiceName, pszServiceName, sizeof( _szServiceName ) / sizeof( _szServiceName[0] ) ); _szServiceName[ ( sizeof( _szServiceName ) / sizeof( _szServiceName[0] ) ) - 1 ] = L'\0'; ZeroMemory( &_serviceStatus, sizeof( _serviceStatus ) );
_fInitcsSCMLock = FALSE; } virtual ~SCM_MANAGER();
HRESULT RunService( VOID );
static VOID ReportFatalServiceStartupError( WCHAR * pszServiceName, DWORD dwError ); private: HRESULT Initialize( VOID ); VOID Terminate( VOID );
HRESULT IndicatePending( DWORD dwPendingState ); HRESULT IndicateComplete( DWORD dwState, HRESULT hrErrorToReport = S_OK );
static DWORD WINAPI GlobalServiceControlHandler( DWORD dwControl, DWORD /*dwEventType*/, LPVOID /*pEventData*/, LPVOID pServiceContext ); VOID UpdateServiceStatus( BOOL fUpdateCheckpoint = FALSE ); BOOL QueryIsInitialized( VOID ) { return _hService != NULL; }
protected: //
// child class should implement
// it's specific Start/Stop sequence
// by implementing OnServiceStart() and OnServiceStop()
//
virtual HRESULT OnServiceStart( VOID ) = NULL; virtual HRESULT OnServiceStop( VOID ) = NULL; DWORD ControlHandler( DWORD dwControlCode );
private:
//
// Not implemented methods
// Declarations present to prevent compiler
// to generate default ones.
//
SCM_MANAGER(); SCM_MANAGER( const SCM_MANAGER& ); SCM_MANAGER& operator=( const SCM_MANAGER& );
//
// _hService, _serviceStatus and _strServiceName
// are used for SCM communication
//
SERVICE_STATUS_HANDLE _hService; SERVICE_STATUS _serviceStatus; //
// 256 is the max supported size of the service name
//
WCHAR _szServiceName[ 256 ]; //
// Event is signaled when the service should end
//
HANDLE _hServiceStopEvent; //
// Event is signaled when the service should pause
//
HANDLE _hServicePauseEvent; //
// Event is signaled when the service should continue
//
HANDLE _hServiceContinueEvent; //
// Critical section to synchronize using of _serviceStatus
// _hService with SetServiceStatus() call.
//
CRITICAL_SECTION _csSCMLock; BOOL _fInitcsSCMLock;
//
// Service start up and stop wait hint
//
DWORD _dwStartupWaitHint; DWORD _dwStopWaitHint;
};
#endif
|