/*++ Copyright (c) 1996 Microsoft Corporation Module Name: service.cpp Abstract: This file provides access to the service control manager for starting, stopping, adding, and removing services. Environment: WIN32 User Mode Author: Vlad Sadovsky (vlads) 17-Apr-1998 --*/ #include "cplusinc.h" #include "sticomm.h" #include #include DWORD SetServiceSecurity( LPTSTR AccountName ); // // Installation routines. // DWORD WINAPI StiServiceInstall( BOOL UseLocalSystem, BOOL DemandStart, LPTSTR lpszUserName, LPTSTR lpszUserPassword ) /*++ Routine Description: Service installation function. Calls SCM to install STI service, which is running in user security context BUGBUG Review Arguments: Return Value: None. --*/ { DWORD dwError = NOERROR; SC_HANDLE hSCM = NULL; SC_HANDLE hService = NULL; __try { hSCM = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!hSCM) { dwError = GetLastError(); __leave; } // // If service already exists - bail out quickly // hService = OpenService( hSCM, STI_SERVICE_NAME, SERVICE_ALL_ACCESS ); if (hService) { dwError = NOERROR; __leave; } // // If use local system - set security // if (!UseLocalSystem) { #ifdef LATER dwError = SetServiceSecurity( lpszUserName ); if (dwError) { dwError = ERROR_SERVICE_LOGON_FAILED ; __leave; } #endif } hService = CreateService( hSCM, STI_SERVICE_NAME, STI_DISPLAY_NAME, SERVICE_ALL_ACCESS, STI_SVC_SERVICE_TYPE, DemandStart ? SERVICE_DEMAND_START : SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, STI_IMAGE_NAME, NULL, NULL, NULL, //STI_SERVICE_DEPENDENCY, UseLocalSystem ? NULL : lpszUserName, UseLocalSystem ? NULL : lpszUserPassword ); if (!hService) { dwError = GetLastError(); __leave; } // // Add registry settings for event logging // RegisterStiEventSources(); // // Start service // dwError = StartService(hService,0,(LPCTSTR *)NULL); } __finally { CloseServiceHandle( hService ); CloseServiceHandle( hSCM ); } return dwError; } //StiServiceInstall DWORD WINAPI StiServiceRemove( VOID ) /*++ Routine Description: Service removal function. This function calls SCM to remove the STI service. Arguments: None. Return Value: Return code. Return zero for success --*/ { DWORD dwError = NOERROR; SC_HANDLE hSCM = NULL; SC_HANDLE hService = NULL; SERVICE_STATUS ServiceStatus; UINT uiRetry = 10; HKEY hkRun; __try { hSCM = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (!hSCM) { dwError = GetLastError(); __leave; } hService = OpenService( hSCM, STI_SERVICE_NAME, SERVICE_ALL_ACCESS ); if (!hService) { dwError = GetLastError(); __leave; } // // Stop service first // if (ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus )) { // // Wait a little // Sleep( STI_STOP_FOR_REMOVE_TIMEOUT ); ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; while( QueryServiceStatus( hService, &ServiceStatus ) && (SERVICE_STOP_PENDING == ServiceStatus.dwCurrentState)) { Sleep( STI_STOP_FOR_REMOVE_TIMEOUT ); if (!uiRetry--) { break; } } if (ServiceStatus.dwCurrentState != SERVICE_STOPPED) { dwError = GetLastError(); __leave; } } else { dwError = GetLastError(); __leave; } if (!DeleteService( hService )) { dwError = GetLastError(); __leave; } } __finally { CloseServiceHandle( hService ); CloseServiceHandle( hSCM ); } // // Leftovers from Win9x - remove STI monitor from Run section // if (RegOpenKey(HKEY_LOCAL_MACHINE, REGSTR_PATH_RUN, &hkRun) == NO_ERROR) { RegDeleteValue (hkRun, REGSTR_VAL_MONITOR); RegCloseKey(hkRun); } return dwError; } // StiServiceRemove BOOL SetServiceDependency( LPTSTR ServiceName, LPTSTR DependentServiceName ) { BOOL rVal = FALSE; SC_HANDLE hSvcMgr; SC_HANDLE hService; hSvcMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (!hSvcMgr) { goto exit; } hService = OpenService( hSvcMgr, ServiceName, SERVICE_ALL_ACCESS ); if (!hService) { goto exit; } if (!ChangeServiceConfig( hService, // handle to service SERVICE_NO_CHANGE, // type of service SERVICE_NO_CHANGE, // when to start service SERVICE_NO_CHANGE, // severity if service fails to start NULL, // pointer to service binary file name NULL, // pointer to load ordering group name NULL, // pointer to variable to get tag identifier DependentServiceName, // pointer to array of dependency names NULL, // pointer to account name of service NULL, // pointer to password for service account NULL // pointer to display name )) { goto exit; } rVal = TRUE; exit: CloseServiceHandle( hService ); CloseServiceHandle( hSvcMgr ); return rVal; } BOOL SetServiceStart( LPTSTR ServiceName, DWORD StartType ) { BOOL rVal = FALSE; SC_HANDLE hSvcMgr; SC_HANDLE hService; hSvcMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (!hSvcMgr) { goto exit; } hService = OpenService( hSvcMgr, ServiceName, SERVICE_ALL_ACCESS ); if (!hService) { goto exit; } if (!ChangeServiceConfig( hService, // handle to service SERVICE_NO_CHANGE, // type of service StartType, // when to start service SERVICE_NO_CHANGE, // severity if service fails to start NULL, // pointer to service binary file name NULL, // pointer to load ordering group name NULL, // pointer to variable to get tag identifier NULL, // pointer to array of dependency names NULL, // pointer to account name of service NULL, // pointer to password for service account NULL // pointer to display name )) { goto exit; } rVal = TRUE; exit: CloseServiceHandle( hService ); CloseServiceHandle( hSvcMgr ); return rVal; } /* BOOL SetServiceAccount( LPTSTR ServiceName, PSECURITY_INFO SecurityInfo ) { BOOL rVal = FALSE; SC_HANDLE hSvcMgr; SC_HANDLE hService; hSvcMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (!hSvcMgr) { goto exit; } hService = OpenService( hSvcMgr, ServiceName, SERVICE_ALL_ACCESS ); if (!hService) { goto exit; } if (!ChangeServiceConfig( hService, // handle to service SERVICE_NO_CHANGE, // type of service SERVICE_NO_CHANGE, // when to start service SERVICE_NO_CHANGE, // severity if service fails to start NULL, // pointer to service binary file name NULL, // pointer to load ordering group name NULL, // pointer to variable to get tag identifier NULL, // pointer to array of dependency names SecurityInfo->AccountName, // pointer to account name of service SecurityInfo->Password, // pointer to password for service account NULL // pointer to display name )) { goto exit; } rVal = TRUE; exit: CloseServiceHandle( hService ); CloseServiceHandle( hSvcMgr ); return rVal; } */