2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/spoolsv/spoolsv.c
5 * PURPOSE: Printer spooler
6 * PROGRAMMER: Eric Kohl
9 /* INCLUDES *****************************************************************/
11 #define WIN32_NO_STATUS
14 #include "wine/debug.h"
16 WINE_DEFAULT_DEBUG_CHANNEL(spoolsv
);
19 /* GLOBALS ******************************************************************/
21 static VOID CALLBACK
ServiceMain(DWORD argc
, LPWSTR
*argv
);
22 static WCHAR ServiceName
[] = L
"Spooler";
23 static SERVICE_TABLE_ENTRYW ServiceTable
[] =
25 {ServiceName
, ServiceMain
},
29 SERVICE_STATUS_HANDLE ServiceStatusHandle
;
30 SERVICE_STATUS ServiceStatus
;
33 /* FUNCTIONS *****************************************************************/
36 UpdateServiceStatus(DWORD dwState
)
38 ServiceStatus
.dwServiceType
= SERVICE_WIN32_OWN_PROCESS
;
39 ServiceStatus
.dwCurrentState
= dwState
;
41 if (dwState
== SERVICE_RUNNING
)
42 ServiceStatus
.dwControlsAccepted
= SERVICE_ACCEPT_PAUSE_CONTINUE
| SERVICE_ACCEPT_STOP
| SERVICE_ACCEPT_SHUTDOWN
;
43 else if (dwState
== SERVICE_PAUSED
)
44 ServiceStatus
.dwControlsAccepted
= SERVICE_ACCEPT_PAUSE_CONTINUE
;
46 ServiceStatus
.dwControlsAccepted
= 0;
48 ServiceStatus
.dwWin32ExitCode
= 0;
49 ServiceStatus
.dwServiceSpecificExitCode
= 0;
50 ServiceStatus
.dwCheckPoint
= 0;
52 if (dwState
== SERVICE_START_PENDING
||
53 dwState
== SERVICE_STOP_PENDING
||
54 dwState
== SERVICE_PAUSE_PENDING
||
55 dwState
== SERVICE_CONTINUE_PENDING
)
56 ServiceStatus
.dwWaitHint
= 10000;
58 ServiceStatus
.dwWaitHint
= 0;
60 SetServiceStatus(ServiceStatusHandle
,
66 ServiceControlHandler(DWORD dwControl
,
71 TRACE("ServiceControlHandler() called\n");
75 case SERVICE_CONTROL_STOP
:
76 TRACE(" SERVICE_CONTROL_STOP received\n");
77 UpdateServiceStatus(SERVICE_STOPPED
);
80 case SERVICE_CONTROL_PAUSE
:
81 TRACE(" SERVICE_CONTROL_PAUSE received\n");
82 UpdateServiceStatus(SERVICE_PAUSED
);
85 case SERVICE_CONTROL_CONTINUE
:
86 TRACE(" SERVICE_CONTROL_CONTINUE received\n");
87 UpdateServiceStatus(SERVICE_RUNNING
);
90 case SERVICE_CONTROL_INTERROGATE
:
91 TRACE(" SERVICE_CONTROL_INTERROGATE received\n");
92 SetServiceStatus(ServiceStatusHandle
,
96 case SERVICE_CONTROL_SHUTDOWN
:
97 TRACE(" SERVICE_CONTROL_SHUTDOWN received\n");
98 UpdateServiceStatus(SERVICE_STOPPED
);
102 TRACE(" Control %lu received\n");
103 return ERROR_CALL_NOT_IMPLEMENTED
;
109 ServiceMain(DWORD argc
, LPWSTR
*argv
)
111 UNREFERENCED_PARAMETER(argc
);
112 UNREFERENCED_PARAMETER(argv
);
114 TRACE("ServiceMain() called\n");
116 ServiceStatusHandle
= RegisterServiceCtrlHandlerExW(ServiceName
,
117 ServiceControlHandler
,
120 TRACE("Calling SetServiceStatus()\n");
121 UpdateServiceStatus(SERVICE_RUNNING
);
122 TRACE("SetServiceStatus() called\n");
125 TRACE("ServiceMain() done\n");
130 wmain(int argc
, WCHAR
*argv
[])
132 UNREFERENCED_PARAMETER(argc
);
133 UNREFERENCED_PARAMETER(argv
);
135 TRACE("Spoolsv: main() started\n");
137 StartServiceCtrlDispatcher(ServiceTable
);
139 TRACE("Spoolsv: main() done\n");