Merge from amd64-branch:
[reactos.git] / reactos / base / services / rpcss / service_main.c
1 /*
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>
7 *
8 */
9
10 #include "rpcss.h"
11
12 #define NDEBUG
13 #include <debug.h>
14
15 extern BOOL RPCSS_Initialize(void);
16 extern BOOL RPCSS_Shutdown(void);
17 extern HANDLE exit_event;
18
19 static VOID WINAPI ServiceMain(DWORD, LPWSTR *);
20 static WCHAR ServiceName[] = L"RpcSs";
21 SERVICE_TABLE_ENTRYW ServiceTable[] =
22 {
23 { ServiceName, ServiceMain },
24 { NULL, NULL }
25 };
26
27 static SERVICE_STATUS ServiceStatus;
28 static SERVICE_STATUS_HANDLE ServiceStatusHandle;
29
30 DWORD WINAPI
31 ServiceControlHandler(DWORD dwControl,
32 DWORD dwEventType,
33 LPVOID lpEventData,
34 LPVOID lpContext)
35 {
36 switch (dwControl)
37 {
38 case SERVICE_CONTROL_SHUTDOWN:
39 case SERVICE_CONTROL_STOP:
40 SetEvent(exit_event);
41 return NO_ERROR;
42
43 case SERVICE_CONTROL_INTERROGATE:
44 return NO_ERROR;
45
46 default:
47 return ERROR_CALL_NOT_IMPLEMENTED;
48 }
49 }
50
51 VOID WINAPI
52 ServiceMain(DWORD argc, LPWSTR argv[])
53 {
54 DWORD dwError;
55
56 ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
57 ServiceControlHandler,
58 NULL);
59 if (!ServiceStatusHandle)
60 {
61 dwError = GetLastError();
62 DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError);
63 return;
64 }
65
66 ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
67 ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
68 ServiceStatus.dwControlsAccepted = 0;
69 ServiceStatus.dwWin32ExitCode = NO_ERROR;
70 ServiceStatus.dwServiceSpecificExitCode = 0;
71 ServiceStatus.dwCheckPoint = 0;
72 ServiceStatus.dwWaitHint = 1000;
73 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
74
75 if (RPCSS_Initialize())
76 {
77 ServiceStatus.dwCurrentState = SERVICE_RUNNING;
78 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
79 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
80
81 WaitForSingleObject(exit_event, INFINITE);
82
83 ServiceStatus.dwCurrentState = SERVICE_STOPPED;
84 SetServiceStatus(ServiceStatusHandle, &ServiceStatus);
85 RPCSS_Shutdown();
86 }
87 }
88
89 int wmain(int argc, LPWSTR argv[])
90 {
91 if (!StartServiceCtrlDispatcherW(ServiceTable))
92 {
93 DPRINT1("StartServiceCtrlDispatcherW() failed\n");
94 return 1;
95 }
96
97 return 0;
98 }