164 lines
3.4 KiB
C
164 lines
3.4 KiB
C
|
|
|||
|
/*++
|
|||
|
|
|||
|
Copyright (C) Microsoft Corporation, 1991 - 1999
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
startsvc.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This routine implements on-demand starting of the RpcSs service.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Bharat Shah (barats) 4-5-92
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#include <rpc.h>
|
|||
|
#include <winsvc.h>
|
|||
|
#include <startsvc.h>
|
|||
|
|
|||
|
#define SUCCESS 0
|
|||
|
#define RPCLOCATOR "RPCLOCATOR"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
RPC_STATUS
|
|||
|
StartServiceIfNecessary(
|
|||
|
void
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
If the locator service has not yet been started, then we attempt to
|
|||
|
start it.
|
|||
|
|
|||
|
Returns:
|
|||
|
|
|||
|
RPC_S_OK - The locator service is running.
|
|||
|
|
|||
|
Service controller errors.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
|
|||
|
SC_HANDLE hServiceController = NULL;
|
|||
|
SC_HANDLE hService = NULL;
|
|||
|
SERVICE_STATUS ServiceStatus;
|
|||
|
DWORD status;
|
|||
|
DWORD Counter = 0L;
|
|||
|
BOOL FirstTime = TRUE;
|
|||
|
unsigned long ArgC = 0;
|
|||
|
char __RPC_FAR * ArgV[1] = { NULL };
|
|||
|
|
|||
|
//
|
|||
|
// Get a handle to the service controller.
|
|||
|
//
|
|||
|
hServiceController = OpenSCManager(
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
GENERIC_READ);
|
|||
|
|
|||
|
if (hServiceController == NULL)
|
|||
|
{
|
|||
|
status = GetLastError();
|
|||
|
return(status);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Get a handle to the service
|
|||
|
//
|
|||
|
hService = OpenService(
|
|||
|
hServiceController,
|
|||
|
RPCLOCATOR,
|
|||
|
GENERIC_READ|SERVICE_START);
|
|||
|
|
|||
|
if (hService == NULL)
|
|||
|
{
|
|||
|
status = GetLastError();
|
|||
|
goto CleanExit;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Call StartService
|
|||
|
//
|
|||
|
/*
|
|||
|
if (!StartService(hService,ArgC,ArgV))
|
|||
|
{
|
|||
|
status = GetLastError();
|
|||
|
if (status == ERROR_SERVICE_ALREADY_RUNNING)
|
|||
|
status = RPC_S_OK;
|
|||
|
goto CleanExit;
|
|||
|
}
|
|||
|
*/
|
|||
|
|
|||
|
do
|
|||
|
{
|
|||
|
|
|||
|
if (!QueryServiceStatus(hService,&ServiceStatus))
|
|||
|
{
|
|||
|
status = GetLastError();
|
|||
|
goto CleanExit;
|
|||
|
}
|
|||
|
|
|||
|
switch(ServiceStatus.dwCurrentState)
|
|||
|
{
|
|||
|
|
|||
|
case SERVICE_RUNNING:
|
|||
|
status = SUCCESS;
|
|||
|
goto CleanExit;
|
|||
|
break;
|
|||
|
|
|||
|
case SERVICE_STOP_PENDING:
|
|||
|
case SERVICE_START_PENDING:
|
|||
|
if (!FirstTime && (Counter == ServiceStatus.dwCheckPoint))
|
|||
|
{
|
|||
|
status = ERROR_SERVICE_REQUEST_TIMEOUT;
|
|||
|
goto CleanExit;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
FirstTime = FALSE;
|
|||
|
Counter = ServiceStatus.dwCheckPoint;
|
|||
|
Sleep(ServiceStatus.dwWaitHint);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case SERVICE_STOPPED:
|
|||
|
if (!StartService(hService,ArgC,ArgV))
|
|||
|
{
|
|||
|
status = GetLastError();
|
|||
|
if (status == ERROR_SERVICE_ALREADY_RUNNING)
|
|||
|
status = RPC_S_OK;
|
|||
|
goto CleanExit;
|
|||
|
}
|
|||
|
Sleep(500);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
status = GetLastError();
|
|||
|
goto CleanExit;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
while (TRUE);
|
|||
|
|
|||
|
CleanExit:
|
|||
|
|
|||
|
if(hServiceController != NULL) {
|
|||
|
(VOID) CloseServiceHandle(hServiceController);
|
|||
|
}
|
|||
|
if(hService != NULL) {
|
|||
|
(VOID) CloseServiceHandle(hService);
|
|||
|
}
|
|||
|
return(status);
|
|||
|
}
|