//+-------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // // File: services.cpp // // Contents: // // History: // //--------------------------------------------------------------------------- #include "stdafx.h" #include "logfile.h" /* * Constants. */ const UINT SECTION_SIZE = 256; const TCHAR SERVICE_DEL_KEY[] = _T("DelService"); const UINT SERVICE_DEL_NAME = 1; const TCHAR SERVICE_START_KEY[] = _T("StartService"); const UINT SERVICE_START_NAME = 1; /* * Helper Functions. */ VOID ProcessDelService( IN SC_HANDLE schSCManager, IN LPCTSTR pszServiceName ) { SC_HANDLE schService; SERVICE_STATUS ssStatus; schService = OpenService(schSCManager, pszServiceName, SERVICE_ALL_ACCESS); if (!schService) { LOGMESSAGE(_T("ProcessDelService: Can't open service %s"), pszServiceName); return; } if (ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)) { Sleep(1000); while(QueryServiceStatus(schService, &ssStatus)) { if (ssStatus.dwCurrentState == SERVICE_STOP_PENDING) { Sleep(1000); } else { break; } } if (ssStatus.dwCurrentState != SERVICE_STOPPED) { LOGMESSAGE(_T("ProcessDelService: Couldn't stop service %s"), pszServiceName); } } else { LOGMESSAGE(_T("ProcessDelService: Couldn't control service %s"), pszServiceName); } if (DeleteService(schService)) { LOGMESSAGE(_T("ProcessDelService: %s deleted"), pszServiceName); } else { LOGMESSAGE(_T("ProcessDelService: Couldn't delete service %s"), pszServiceName); } CloseServiceHandle(schService); } VOID ProcessStartService( IN SC_HANDLE schSCManager, IN LPCTSTR pszServiceName ) { SC_HANDLE schService; SERVICE_STATUS ssStatus; schService = OpenService(schSCManager, pszServiceName, SERVICE_ALL_ACCESS); if (!schService) { LOGMESSAGE(_T("ProcessStartService: Can't open service %s"), pszServiceName); return; } if (StartService(schService, 0, NULL)) { Sleep(1000); while(QueryServiceStatus(schService, &ssStatus)) { if (ssStatus.dwCurrentState == SERVICE_START_PENDING) { Sleep(1000); } else { break; } } if (ssStatus.dwCurrentState == SERVICE_RUNNING) { LOGMESSAGE(_T("ProcessStartService: %s started"), pszServiceName); } else { LOGMESSAGE(_T("ProcessStartService: Couldn't start service %s"), pszServiceName); } } else { LOGMESSAGE(_T("ProcessStartService: Couldn't control service %s"), pszServiceName); } CloseServiceHandle(schService); } /* * ServiceDeleteFromInfSection() * * Handles service deletion from inf sections in the form of: * * [SectionName] * DelService = Service1 * DelService = Service2 * * where Service1 and Service2 are service names. */ DWORD ServiceDeleteFromInfSection( IN HINF hInf, IN LPCTSTR pszSection ) { BOOL fErr; BOOL fFound; INFCONTEXT infContext; SC_HANDLE schSCManager; schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (!schSCManager) { LOGMESSAGE(_T("ServiceDeleteFromInfSection: Failed to open SC Manager")); return(GetLastError()); } fFound = SetupFindFirstLine( hInf, pszSection, SERVICE_DEL_KEY, &infContext ); while (fFound) { TCHAR pszServiceName[SECTION_SIZE]; fErr = SetupGetStringField( &infContext, SERVICE_DEL_NAME, pszServiceName, SECTION_SIZE, NULL ); if (fErr) { ProcessDelService(schSCManager, pszServiceName); } else { LOGMESSAGE(_T("ServiceDeleteFromInfSection: Could not get service section.")); } fFound = SetupFindNextMatchLine( &infContext, SERVICE_DEL_KEY, &infContext ); } CloseServiceHandle(schSCManager); return(ERROR_SUCCESS); } /* * ServiceStartFromInfSection() * * Starts a service that has been installed by setupapi. * */ DWORD ServiceStartFromInfSection( IN HINF hInf, IN LPCTSTR pszSection ) { BOOL fErr; BOOL fFound; INFCONTEXT infContext; SC_HANDLE schSCManager; schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (!schSCManager) { LOGMESSAGE(_T("ServiceStartFromInfSection: Failed to open SC Manager")); return(GetLastError()); } fFound = SetupFindFirstLine( hInf, pszSection, SERVICE_START_KEY, &infContext ); while (fFound) { TCHAR pszServiceName[SECTION_SIZE]; fErr = SetupGetStringField( &infContext, SERVICE_START_NAME, pszServiceName, SECTION_SIZE, NULL ); if (fErr) { ProcessStartService(schSCManager, pszServiceName); } else { LOGMESSAGE(_T("ServiceStartFromInfSection: Could not get service section.")); } fFound = SetupFindNextMatchLine( &infContext, SERVICE_START_KEY, &infContext ); } CloseServiceHandle(schSCManager); return(ERROR_SUCCESS); }