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);
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
static WCHAR wszSPOOLER[] = {'S','P','O','O','L','E','R',0};
|
||||
static const SERVICE_TABLE_ENTRYW servtbl[] = {
|
||||
{wszSPOOLER, serv_main},
|
||||
{spoolerW, serv_main},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue