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.
244 lines
6.3 KiB
244 lines
6.3 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|