// 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 #include #include #include #include #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); }