spoolsv: Improve the service stub so that it can be started and stopped.
This commit is contained in:
parent
681146c9f0
commit
ff0099df0d
|
@ -24,16 +24,73 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(spoolsv);
|
WINE_DEFAULT_DEBUG_CHANNEL(spoolsv);
|
||||||
|
|
||||||
|
static WCHAR spoolerW[] = {'S','p','o','o','l','e','r',0};
|
||||||
|
|
||||||
|
static SERVICE_STATUS_HANDLE service_handle;
|
||||||
|
static HANDLE stop_event;
|
||||||
|
|
||||||
|
static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context )
|
||||||
|
{
|
||||||
|
SERVICE_STATUS status;
|
||||||
|
|
||||||
|
status.dwServiceType = SERVICE_WIN32;
|
||||||
|
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
|
||||||
|
status.dwWin32ExitCode = 0;
|
||||||
|
status.dwServiceSpecificExitCode = 0;
|
||||||
|
status.dwCheckPoint = 0;
|
||||||
|
status.dwWaitHint = 0;
|
||||||
|
|
||||||
|
switch(ctrl)
|
||||||
|
{
|
||||||
|
case SERVICE_CONTROL_STOP:
|
||||||
|
case SERVICE_CONTROL_SHUTDOWN:
|
||||||
|
WINE_TRACE( "shutting down\n" );
|
||||||
|
status.dwCurrentState = SERVICE_STOP_PENDING;
|
||||||
|
status.dwControlsAccepted = 0;
|
||||||
|
SetServiceStatus( service_handle, &status );
|
||||||
|
SetEvent( stop_event );
|
||||||
|
return NO_ERROR;
|
||||||
|
default:
|
||||||
|
WINE_FIXME( "got service ctrl %x\n", ctrl );
|
||||||
|
status.dwCurrentState = SERVICE_RUNNING;
|
||||||
|
SetServiceStatus( service_handle, &status );
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void WINAPI serv_main(DWORD argc, LPWSTR *argv)
|
static void WINAPI serv_main(DWORD argc, LPWSTR *argv)
|
||||||
{
|
{
|
||||||
WINE_FIXME("(%d %p)\n", argc, argv);
|
SERVICE_STATUS status;
|
||||||
|
|
||||||
|
WINE_TRACE( "starting service\n" );
|
||||||
|
|
||||||
|
stop_event = CreateEventW( NULL, TRUE, FALSE, NULL );
|
||||||
|
|
||||||
|
service_handle = RegisterServiceCtrlHandlerExW( spoolerW, service_handler, NULL );
|
||||||
|
if (!service_handle)
|
||||||
|
return;
|
||||||
|
|
||||||
|
status.dwServiceType = SERVICE_WIN32;
|
||||||
|
status.dwCurrentState = SERVICE_RUNNING;
|
||||||
|
status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
|
||||||
|
status.dwWin32ExitCode = 0;
|
||||||
|
status.dwServiceSpecificExitCode = 0;
|
||||||
|
status.dwCheckPoint = 0;
|
||||||
|
status.dwWaitHint = 10000;
|
||||||
|
SetServiceStatus( service_handle, &status );
|
||||||
|
|
||||||
|
WaitForSingleObject( stop_event, INFINITE );
|
||||||
|
|
||||||
|
status.dwCurrentState = SERVICE_STOPPED;
|
||||||
|
status.dwControlsAccepted = 0;
|
||||||
|
SetServiceStatus( service_handle, &status );
|
||||||
|
WINE_TRACE( "service stopped\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
static WCHAR wszSPOOLER[] = {'S','P','O','O','L','E','R',0};
|
|
||||||
static const SERVICE_TABLE_ENTRYW servtbl[] = {
|
static const SERVICE_TABLE_ENTRYW servtbl[] = {
|
||||||
{wszSPOOLER, serv_main},
|
{spoolerW, serv_main},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue