|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: N C S V C . H
//
// Contents: This file contains CService and CServiceManager, wrapper
// classes to the Win32 Service APIs.
//
// Notes: Note that not all functionality is currently extended through
// these classes.
//
// Author: mikemi 6 Mar 1997
//
//----------------------------------------------------------------------------
#pragma once
#ifndef _NCSVC_H_
#define _NCSVC_H_
// DaveA - 4/21/00 - temporary hack to get bvts to work until final
// solution is found. 15 seconds was not long enough
// for the workstation and dependent services to stop.
// Bug 95996. Two minute timeout will be used instead.
const DWORD c_dwDefaultWaitServiceStop = 120000;
// NTRAID9:105797@20001201#deonb REBOOT: FPS ask for reboot when installing it.
// Changing service start timeout value to 60 seconds instead of 15 seconds as FPS
// requires more time to start all it's dependent services.
const DWORD c_dwDefaultWaitServiceStart = 60000;
struct CSFLAGS { // These two fields define the 'control' to be applied. NULL both
// to not apply a control.
//
BOOL fStart; // TRUE to start the service. FALSE to use dwControl.
DWORD dwControl; // 0 to do nothing. SERVICE_CONTROL_ flag otherwise.
// These two fields define the wait behavior to be applied. NULL both
// to not apply a wait.
//
DWORD dwMaxWaitMilliseconds; // How long to wait in milliseconds.
// Zero to not wait.
DWORD dwStateToWaitFor; // Service state flag like SERVICE_STOPPED
// If TRUE, ignore services that are demand start or disabled.
//
BOOL fIgnoreDisabledAndDemandStart; };
HRESULT HrSvcQueryStatus ( PCWSTR pszService, DWORD* pdwState);
HRESULT HrQueryServiceConfigWithAlloc ( SC_HANDLE hService, LPQUERY_SERVICE_CONFIG* ppConfig);
HRESULT HrChangeServiceStartType ( PCWSTR szServiceName, DWORD dwStartType);
HRESULT HrChangeServiceStartTypeOptional ( PCWSTR szServiceName, DWORD dwStartType);
class CService { friend class CServiceManager;
public: CService() { _schandle = NULL; };
~CService() { Close(); };
VOID Close();
HRESULT HrControl (DWORD dwControl);
HRESULT HrRequestStop ();
HRESULT HrQueryServiceConfig (LPQUERY_SERVICE_CONFIG* ppConfig) { HRESULT hr = HrQueryServiceConfigWithAlloc (_schandle, ppConfig); TraceError ("CService::HrQueryServiceConfig", hr); return hr; }
HRESULT HrQueryState ( DWORD* pdwState ); HRESULT HrQueryStartType ( DWORD* pdwStartType ); HRESULT HrSetStartType ( DWORD dwStartType ) { AssertH(_schandle != NULL );
if (::ChangeServiceConfig( _schandle, SERVICE_NO_CHANGE, dwStartType, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) return S_OK; else return ::HrFromLastWin32Error(); }
HRESULT HrSetImagePath(IN PCWSTR pszImagePath) { AssertH(pszImagePath); AssertH(_schandle != NULL );
if (::ChangeServiceConfig( _schandle, SERVICE_NO_CHANGE, // ServiceType
SERVICE_NO_CHANGE, // StartType
SERVICE_NO_CHANGE, // ErrorControl
pszImagePath, // BinaryPathName
NULL, // LoadOredrGroup
NULL, // TagId
NULL, // Dependencies
NULL, // ServiceStartName
NULL, // Password
NULL)) // DisplayName
return S_OK; else return ::HrFromLastWin32Error(); }
HRESULT HrSetServiceRestartRecoveryOption(IN SERVICE_FAILURE_ACTIONS *psfa);
HRESULT HrSetDependencies(IN PCWSTR mszDependencyList) { AssertH(_schandle != NULL );
if (::ChangeServiceConfig( _schandle, SERVICE_NO_CHANGE, // ServiceType
SERVICE_NO_CHANGE, // StartType
SERVICE_NO_CHANGE, // ErrorControl
NULL, // BinaryPathName
NULL, // LoadOredrGroup
NULL, // TagId
mszDependencyList, // Dependencies
NULL, // ServiceStartName
NULL, // Password
NULL)) // DisplayName
return S_OK; else return ::HrFromLastWin32Error(); }
HRESULT HrSetDisplayName(IN PCWSTR mszDisplayName) { AssertH(_schandle != NULL );
if (::ChangeServiceConfig( _schandle, SERVICE_NO_CHANGE, // ServiceType
SERVICE_NO_CHANGE, // StartType
SERVICE_NO_CHANGE, // ErrorControl
NULL, // BinaryPathName
NULL, // LoadOredrGroup
NULL, // TagId
NULL, // Dependencies
NULL, // ServiceStartName
NULL, // Password
mszDisplayName)) // DisplayName
{ return S_OK; } else { return ::HrFromLastWin32Error(); } }
HRESULT HrSetServiceObjectSecurity( SECURITY_INFORMATION dwSecurityInformation, PSECURITY_DESCRIPTOR lpSecurityDescriptor) { AssertH(_schandle != NULL );
if (::SetServiceObjectSecurity( _schandle, dwSecurityInformation, lpSecurityDescriptor)) { return S_OK; } else { return ::HrFromLastWin32Error(); } }
private: SC_HANDLE _schandle; };
enum CSLOCK { NO_LOCK, WITH_LOCK, };
class CServiceManager { public: CServiceManager() { _schandle = NULL; _sclock = NULL; };
~CServiceManager();
SC_HANDLE Handle () const { return _schandle; }
HRESULT HrOpen( CSLOCK eLock = NO_LOCK, DWORD dwDesiredAccess = SC_MANAGER_ALL_ACCESS, PCWSTR pszMachineName = NULL, PCWSTR pszDatabaseName = NULL );
HRESULT HrControlServicesAndWait ( UINT cServices, const PCWSTR* apszServices, const CSFLAGS* pFlags);
HRESULT HrStartServicesNoWait (UINT cServices, const PCWSTR* apszServices); HRESULT HrStartServicesAndWait(UINT cServices, const PCWSTR* apszServices, DWORD dwWaitMilliseconds = c_dwDefaultWaitServiceStart); HRESULT HrStopServicesNoWait (UINT cServices, const PCWSTR* apszServices); HRESULT HrStopServicesAndWait (UINT cServices, const PCWSTR* apszServices, DWORD dwWaitMilliseconds = c_dwDefaultWaitServiceStop);
HRESULT HrStartServiceNoWait (PCWSTR pszService) { return HrStartServicesNoWait (1, &pszService); }
HRESULT HrStartServiceAndWait(PCWSTR pszService, DWORD dwWaitMilliseconds = c_dwDefaultWaitServiceStart) { return HrStartServicesAndWait (1, &pszService, dwWaitMilliseconds); }
HRESULT HrStopServiceNoWait (PCWSTR pszService) { return HrStopServicesNoWait (1, &pszService); }
HRESULT HrStopServiceAndWait (PCWSTR pszService, DWORD dwWaitMilliseconds = c_dwDefaultWaitServiceStop) { return HrStopServicesAndWait (1, &pszService, dwWaitMilliseconds); }
VOID Close();
HRESULT HrLock();
VOID Unlock();
HRESULT HrQueryLocked (BOOL* pfLocked);
HRESULT HrOpenService ( CService* pcsService, PCWSTR pszServiceName, CSLOCK eLock = NO_LOCK, DWORD dwScmAccess = SC_MANAGER_ALL_ACCESS, DWORD dwSvcAccess = SERVICE_ALL_ACCESS);
HRESULT HrCreateService (CService* pcsService, PCWSTR pszServiceName, PCWSTR pszDisplayName, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, PCWSTR pszBinaryPathName, PCWSTR pslzDependencies = NULL, PCWSTR pszLoadOrderGroup = NULL, PDWORD pdwTagId = NULL, DWORD dwDesiredAccess = SERVICE_ALL_ACCESS, PCWSTR pszServiceStartName = NULL, PCWSTR pszPassword = NULL, PCWSTR pszDescription = NULL);
enum SERVICE_START_CRITERIA { SERVICE_NO_CRITERIA, // Start the service regardless
SERVICE_ONLY_AUTO_START // Only start the service if it is of type
// Auto-Start
};
enum DEPENDENCY_ADDREMOVE { DEPENDENCY_ADD, DEPENDENCY_REMOVE };
HRESULT HrAddServiceDependency(PCWSTR szServiceName, PCWSTR szDependency) { return HrAddRemoveServiceDependency(szServiceName, szDependency, DEPENDENCY_ADD); }
HRESULT HrRemoveServiceDependency(PCWSTR szServiceName, PCWSTR szDependency) { return HrAddRemoveServiceDependency(szServiceName, szDependency, DEPENDENCY_REMOVE); }
HRESULT HrAddRemoveServiceDependency(PCWSTR szServiceName, PCWSTR szDependency, DEPENDENCY_ADDREMOVE enumFlag);
private: SC_HANDLE _schandle; SC_LOCK _sclock; };
#endif // _NCSVC_H_
|