/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: services/spoolsv/spoolsv.c * PURPOSE: Printer spooler * PROGRAMMER: Eric Kohl */ /* INCLUDES *****************************************************************/ #define WIN32_NO_STATUS #include #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(spoolsv); /* GLOBALS ******************************************************************/ static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv); static WCHAR ServiceName[] = L"Spooler"; static SERVICE_TABLE_ENTRYW ServiceTable[] = { {ServiceName, ServiceMain}, {NULL, NULL} }; SERVICE_STATUS_HANDLE ServiceStatusHandle; SERVICE_STATUS ServiceStatus; /* FUNCTIONS *****************************************************************/ static VOID UpdateServiceStatus(DWORD dwState) { ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ServiceStatus.dwCurrentState = dwState; if (dwState == SERVICE_RUNNING) ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; else if (dwState == SERVICE_PAUSED) ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE; else ServiceStatus.dwControlsAccepted = 0; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; if (dwState == SERVICE_START_PENDING || dwState == SERVICE_STOP_PENDING || dwState == SERVICE_PAUSE_PENDING || dwState == SERVICE_CONTINUE_PENDING) ServiceStatus.dwWaitHint = 10000; else ServiceStatus.dwWaitHint = 0; SetServiceStatus(ServiceStatusHandle, &ServiceStatus); } static DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext) { TRACE("ServiceControlHandler() called\n"); switch (dwControl) { case SERVICE_CONTROL_STOP: TRACE(" SERVICE_CONTROL_STOP received\n"); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; case SERVICE_CONTROL_PAUSE: TRACE(" SERVICE_CONTROL_PAUSE received\n"); UpdateServiceStatus(SERVICE_PAUSED); return ERROR_SUCCESS; case SERVICE_CONTROL_CONTINUE: TRACE(" SERVICE_CONTROL_CONTINUE received\n"); UpdateServiceStatus(SERVICE_RUNNING); return ERROR_SUCCESS; case SERVICE_CONTROL_INTERROGATE: TRACE(" SERVICE_CONTROL_INTERROGATE received\n"); SetServiceStatus(ServiceStatusHandle, &ServiceStatus); return ERROR_SUCCESS; case SERVICE_CONTROL_SHUTDOWN: TRACE(" SERVICE_CONTROL_SHUTDOWN received\n"); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; default : TRACE(" Control %lu received\n"); return ERROR_CALL_NOT_IMPLEMENTED; } } static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv) { UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); TRACE("ServiceMain() called\n"); ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, ServiceControlHandler, NULL); TRACE("Calling SetServiceStatus()\n"); UpdateServiceStatus(SERVICE_RUNNING); TRACE("SetServiceStatus() called\n"); TRACE("ServiceMain() done\n"); } int wmain(int argc, WCHAR *argv[]) { UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); TRACE("Spoolsv: main() started\n"); StartServiceCtrlDispatcher(ServiceTable); TRACE("Spoolsv: main() done\n"); return 0; } /* EOF */