xref: /reactos/base/services/browser/browser.c (revision 463784c5)
1  /*
2   * PROJECT:     ReactOS Browser Service
3   * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4   * PURPOSE:     Browser service RPC server
5   * COPYRIGHT:   Eric Kohl 2020 <eric.kohl@reactos.org>
6   */
7  
8  /* INCLUDES *****************************************************************/
9  
10  #include "precomp.h"
11  
12  WINE_DEFAULT_DEBUG_CHANNEL(browser);
13  
14  
15  /* GLOBALS ******************************************************************/
16  
17  HINSTANCE hDllInstance;
18  
19  static WCHAR ServiceName[] = L"browser";
20  
21  static SERVICE_STATUS_HANDLE ServiceStatusHandle;
22  static SERVICE_STATUS ServiceStatus;
23  
24  
25  /* FUNCTIONS *****************************************************************/
26  
27  static
28  VOID
29  UpdateServiceStatus(
30      DWORD dwState)
31  {
32      ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
33      ServiceStatus.dwCurrentState = dwState;
34      ServiceStatus.dwControlsAccepted = 0;
35      ServiceStatus.dwWin32ExitCode = 0;
36      ServiceStatus.dwServiceSpecificExitCode = 0;
37      ServiceStatus.dwCheckPoint = 0;
38  
39      if (dwState == SERVICE_START_PENDING ||
40          dwState == SERVICE_STOP_PENDING ||
41          dwState == SERVICE_PAUSE_PENDING ||
42          dwState == SERVICE_CONTINUE_PENDING)
43          ServiceStatus.dwWaitHint = 10000;
44      else
45          ServiceStatus.dwWaitHint = 0;
46  
47      SetServiceStatus(ServiceStatusHandle,
48                       &ServiceStatus);
49  }
50  
51  
52  static
53  DWORD
54  WINAPI
55  ServiceControlHandler(
56      DWORD dwControl,
57      DWORD dwEventType,
58      LPVOID lpEventData,
59      LPVOID lpContext)
60  {
61      TRACE("ServiceControlHandler()\n");
62  
63      switch (dwControl)
64      {
65          case SERVICE_CONTROL_STOP:
66              TRACE("  SERVICE_CONTROL_STOP received\n");
67              /* Stop listening to incoming RPC messages */
68              RpcMgmtStopServerListening(NULL);
69              UpdateServiceStatus(SERVICE_STOPPED);
70              return ERROR_SUCCESS;
71  
72          case SERVICE_CONTROL_PAUSE:
73              TRACE("  SERVICE_CONTROL_PAUSE received\n");
74              UpdateServiceStatus(SERVICE_PAUSED);
75              return ERROR_SUCCESS;
76  
77          case SERVICE_CONTROL_CONTINUE:
78              TRACE("  SERVICE_CONTROL_CONTINUE received\n");
79              UpdateServiceStatus(SERVICE_RUNNING);
80              return ERROR_SUCCESS;
81  
82          case SERVICE_CONTROL_INTERROGATE:
83              TRACE("  SERVICE_CONTROL_INTERROGATE received\n");
84              SetServiceStatus(ServiceStatusHandle,
85                               &ServiceStatus);
86              return ERROR_SUCCESS;
87  
88          case SERVICE_CONTROL_SHUTDOWN:
89              TRACE("  SERVICE_CONTROL_SHUTDOWN received\n");
90              UpdateServiceStatus(SERVICE_STOPPED);
91              return ERROR_SUCCESS;
92  
93          default :
94              TRACE("  Control %lu received\n", dwControl);
95              return ERROR_CALL_NOT_IMPLEMENTED;
96      }
97  }
98  
99  
100  static
101  DWORD
102  ServiceInit(VOID)
103  {
104      HANDLE hThread;
105  
106      hThread = CreateThread(NULL,
107                             0,
108                             (LPTHREAD_START_ROUTINE)RpcThreadRoutine,
109                             NULL,
110                             0,
111                             NULL);
112  
113      if (!hThread)
114      {
115          ERR("Can't create PortThread\n");
116          return GetLastError();
117      }
118      else
119          CloseHandle(hThread);
120  
121      return ERROR_SUCCESS;
122  }
123  
124  
125  VOID
126  WINAPI
127  ServiceMain(
128      _In_ INT ArgCount,
129      _In_ PWSTR *ArgVector)
130  {
131      DWORD dwError;
132  
133      UNREFERENCED_PARAMETER(ArgCount);
134      UNREFERENCED_PARAMETER(ArgVector);
135  
136      FIXME("ServiceMain(%d %p)\n", ArgCount, ArgVector);
137  
138      ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
139                                                          ServiceControlHandler,
140                                                          NULL);
141      if (!ServiceStatusHandle)
142      {
143          ERR("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError());
144          return;
145      }
146  
147      UpdateServiceStatus(SERVICE_START_PENDING);
148  
149      dwError = ServiceInit();
150      if (dwError != ERROR_SUCCESS)
151      {
152          ERR("Service stopped (dwError: %lu\n", dwError);
153          UpdateServiceStatus(SERVICE_STOPPED);
154          return;
155      }
156  
157      UpdateServiceStatus(SERVICE_RUNNING);
158  }
159  
160  
161  BOOL
162  WINAPI
163  DllMain(
164      _In_ HINSTANCE hinstDLL,
165      _In_ DWORD fdwReason,
166      _In_ PVOID pvReserved)
167  {
168      UNREFERENCED_PARAMETER(pvReserved);
169  
170      switch (fdwReason)
171      {
172          case DLL_PROCESS_ATTACH:
173              DisableThreadLibraryCalls(hinstDLL);
174              hDllInstance = hinstDLL;
175              break;
176  
177          case DLL_PROCESS_DETACH:
178              break;
179      }
180  
181      return TRUE;
182  }
183  
184  /* EOF */
185