2 * PROJECT: ReactOS Remote Procedure Call service
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: /base/services/rpcss/service_main.c
5 * PURPOSE: Service control code
6 * COPYRIGHT: Copyright 2008 Ged Murphy <gedmurphy@reactos.org>
12 BOOL
RPCSS_Initialize(void);
13 BOOL
RPCSS_Shutdown(void);
15 static WCHAR ServiceName
[] = L
"RpcSs";
17 typedef struct _ServiceInfo
19 SERVICE_STATUS servStatus
;
20 SERVICE_STATUS_HANDLE hStatus
;
21 } SERVICEINFO
, *PSERVICEINFO
;
25 UpdateStatus(PSERVICEINFO pServInfo
,
31 pServInfo
->servStatus
.dwCheckPoint
+= Check
;
35 pServInfo
->servStatus
.dwCheckPoint
= Check
;
40 pServInfo
->servStatus
.dwCurrentState
= NewStatus
;
43 SetServiceStatus(pServInfo
->hStatus
, &pServInfo
->servStatus
);
48 RunService(PSERVICEINFO pServInfo
)
50 return RPCSS_Initialize();
54 ServerCtrlHandler(DWORD dwControl
,
59 PSERVICEINFO pServInfo
= (PSERVICEINFO
)lpContext
;
63 case SERVICE_CONTROL_SHUTDOWN
:
64 case SERVICE_CONTROL_STOP
:
66 pServInfo
->servStatus
.dwWin32ExitCode
= 0;
67 pServInfo
->servStatus
.dwWaitHint
= 0;
68 UpdateStatus(pServInfo
, SERVICE_STOP_PENDING
, 1);
77 ServiceMain(DWORD argc
, LPWSTR argv
[])
83 servInfo
.servStatus
.dwServiceType
= SERVICE_WIN32_OWN_PROCESS
;
84 servInfo
.servStatus
.dwCurrentState
= SERVICE_STOPPED
;
85 servInfo
.servStatus
.dwControlsAccepted
= SERVICE_ACCEPT_SHUTDOWN
;
86 servInfo
.servStatus
.dwWin32ExitCode
= ERROR_SERVICE_SPECIFIC_ERROR
;
87 servInfo
.servStatus
.dwServiceSpecificExitCode
= 0;
88 servInfo
.servStatus
.dwCheckPoint
= 0;
89 servInfo
.servStatus
.dwWaitHint
= 1000;
91 servInfo
.hStatus
= RegisterServiceCtrlHandlerExW(ServiceName
,
92 (LPHANDLER_FUNCTION_EX
)ServerCtrlHandler
,
94 if (!servInfo
.hStatus
) return;
96 UpdateStatus(&servInfo
, SERVICE_START_PENDING
, 1);
98 /* Create worker thread */
99 hThread
= CreateThread(NULL
,
101 (LPTHREAD_START_ROUTINE
)RunService
,
105 if (!hThread
) return;
107 /* Set service status to running */
108 UpdateStatus(&servInfo
, SERVICE_RUNNING
, 0);
110 /* Wait until thread has terminated */
111 WaitForSingleObject(hThread
, INFINITE
);
113 CloseHandle(hThread
);
115 UpdateStatus(&servInfo
, SERVICE_STOPPED
, 0);
119 int wmain(int argc
, LPWSTR argv
[])
121 SERVICE_TABLE_ENTRYW ServiceTable
[] =
123 {ServiceName
, ServiceMain
},
127 return (int)(StartServiceCtrlDispatcherW(ServiceTable
) != TRUE
);