159 lines
3.7 KiB
C++
159 lines
3.7 KiB
C++
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
||
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
||
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
||
|
// PARTICULAR PURPOSE.
|
||
|
//
|
||
|
// Copyright (C) 1993-1996 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
// MODULE: simple.c
|
||
|
//
|
||
|
// PURPOSE: Implements the body of the service.
|
||
|
// The default behavior is to open a
|
||
|
// named pipe, \\.\pipe\simple, and read
|
||
|
// from it. It the modifies the data and
|
||
|
// writes it back to the pipe.
|
||
|
//
|
||
|
// FUNCTIONS:
|
||
|
// ServiceStart(DWORD dwArgc, LPTSTR *lpszArgv);
|
||
|
// ServiceStop( );
|
||
|
//
|
||
|
// COMMENTS: The functions implemented in simple.c are
|
||
|
// prototyped in service.h
|
||
|
//
|
||
|
//
|
||
|
// AUTHOR: Craig Link - Microsoft Developer Support
|
||
|
//
|
||
|
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <process.h>
|
||
|
#include <tchar.h>
|
||
|
#include "service.h"
|
||
|
|
||
|
#include "bootexp.hxx"
|
||
|
|
||
|
// this event is signalled when the
|
||
|
// service should end
|
||
|
//
|
||
|
HANDLE hServerStopEvent = NULL;
|
||
|
|
||
|
|
||
|
//
|
||
|
// FUNCTION: ServiceStart
|
||
|
//
|
||
|
// PURPOSE: Actual code of the service
|
||
|
// that does the work.
|
||
|
//
|
||
|
// PARAMETERS:
|
||
|
// dwArgc - number of command line arguments
|
||
|
// lpszArgv - array of command line arguments
|
||
|
//
|
||
|
// RETURN VALUE:
|
||
|
// none
|
||
|
//
|
||
|
// COMMENTS:
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
ServiceStart(
|
||
|
DWORD dwArgc,
|
||
|
LPTSTR* lpszArgv
|
||
|
)
|
||
|
{
|
||
|
HANDLE hEvents[2] = {NULL, NULL};
|
||
|
BOOL bRet;
|
||
|
DWORD dwWait;
|
||
|
|
||
|
///////////////////////////////////////////////////
|
||
|
//
|
||
|
// Service initialization
|
||
|
//
|
||
|
|
||
|
// report the status to the service control manager.
|
||
|
//
|
||
|
if (!ReportStatusToSCMgr(
|
||
|
SERVICE_START_PENDING, // service state
|
||
|
NO_ERROR, // exit code
|
||
|
SERVICE_UPDATE_WAIT_HINT)) // wait hint
|
||
|
goto cleanup;
|
||
|
|
||
|
// create the event object. The control handler function signals
|
||
|
// this event when it receives the "stop" control code.
|
||
|
//
|
||
|
hServerStopEvent = CreateEvent(
|
||
|
NULL, // no security attributes
|
||
|
TRUE, // manual reset event
|
||
|
FALSE, // not-signalled
|
||
|
NULL); // no name
|
||
|
|
||
|
if ( hServerStopEvent == NULL)
|
||
|
goto cleanup;
|
||
|
|
||
|
hEvents[0] = hServerStopEvent;
|
||
|
|
||
|
// report the status to the service control manager.
|
||
|
//
|
||
|
if (!ReportStatusToSCMgr(
|
||
|
SERVICE_START_PENDING, // service state
|
||
|
NO_ERROR, // exit code
|
||
|
SERVICE_UPDATE_WAIT_HINT)) // wait hint
|
||
|
goto cleanup;
|
||
|
|
||
|
InitComLb();
|
||
|
|
||
|
// report the status to the service control manager.
|
||
|
//
|
||
|
if (!ReportStatusToSCMgr(
|
||
|
SERVICE_RUNNING, // service state
|
||
|
NO_ERROR, // exit code
|
||
|
0)) // wait hint
|
||
|
goto cleanup;
|
||
|
|
||
|
//
|
||
|
// End of initialization
|
||
|
//
|
||
|
////////////////////////////////////////////////////////
|
||
|
|
||
|
////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Service is now running, perform work until shutdown
|
||
|
//
|
||
|
|
||
|
dwWait = WaitForMultipleObjects( 1, hEvents, FALSE, INFINITE );
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
if (hServerStopEvent)
|
||
|
CloseHandle(hServerStopEvent);
|
||
|
|
||
|
TerminateComLb();
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// FUNCTION: ServiceStop
|
||
|
//
|
||
|
// PURPOSE: Stops the service
|
||
|
//
|
||
|
// PARAMETERS:
|
||
|
// none
|
||
|
//
|
||
|
// RETURN VALUE:
|
||
|
// none
|
||
|
//
|
||
|
// COMMENTS:
|
||
|
// If a ServiceStop procedure is going to
|
||
|
// take longer than 3 seconds to execute,
|
||
|
// it should spawn a thread to execute the
|
||
|
// stop code, and return. Otherwise, the
|
||
|
// ServiceControlManager will believe that
|
||
|
// the service has stopped responding.
|
||
|
//
|
||
|
VOID ServiceStop()
|
||
|
{
|
||
|
if ( hServerStopEvent )
|
||
|
SetEvent(hServerStopEvent);
|
||
|
}
|