Reactos
at master 202 lines 4.9 kB view raw
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 12WINE_DEFAULT_DEBUG_CHANNEL(browser); 13 14 15/* GLOBALS ******************************************************************/ 16 17HINSTANCE hDllInstance; 18PSVCHOST_GLOBAL_DATA lpServiceGlobals; 19 20static WCHAR ServiceName[] = L"browser"; 21 22static SERVICE_STATUS_HANDLE ServiceStatusHandle; 23static SERVICE_STATUS ServiceStatus; 24 25 26/* FUNCTIONS *****************************************************************/ 27 28static 29VOID 30UpdateServiceStatus( 31 DWORD dwState) 32{ 33 ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 34 ServiceStatus.dwCurrentState = dwState; 35 36 if (dwState == SERVICE_RUNNING) 37 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP; 38 else 39 ServiceStatus.dwControlsAccepted = 0; 40 41 ServiceStatus.dwWin32ExitCode = 0; 42 ServiceStatus.dwServiceSpecificExitCode = 0; 43 ServiceStatus.dwCheckPoint = 0; 44 45 if (dwState == SERVICE_START_PENDING || 46 dwState == SERVICE_STOP_PENDING || 47 dwState == SERVICE_PAUSE_PENDING || 48 dwState == SERVICE_CONTINUE_PENDING) 49 ServiceStatus.dwWaitHint = 10000; 50 else 51 ServiceStatus.dwWaitHint = 0; 52 53 SetServiceStatus(ServiceStatusHandle, 54 &ServiceStatus); 55} 56 57 58static 59DWORD 60WINAPI 61ServiceControlHandler( 62 DWORD dwControl, 63 DWORD dwEventType, 64 LPVOID lpEventData, 65 LPVOID lpContext) 66{ 67 TRACE("ServiceControlHandler()\n"); 68 69 switch (dwControl) 70 { 71 case SERVICE_CONTROL_STOP: 72 TRACE(" SERVICE_CONTROL_STOP received\n"); 73 /* Stop listening to incoming RPC messages */ 74 RpcMgmtStopServerListening(NULL); 75 UpdateServiceStatus(SERVICE_STOPPED); 76 return ERROR_SUCCESS; 77 78 case SERVICE_CONTROL_PAUSE: 79 TRACE(" SERVICE_CONTROL_PAUSE received\n"); 80 UpdateServiceStatus(SERVICE_PAUSED); 81 return ERROR_SUCCESS; 82 83 case SERVICE_CONTROL_CONTINUE: 84 TRACE(" SERVICE_CONTROL_CONTINUE received\n"); 85 UpdateServiceStatus(SERVICE_RUNNING); 86 return ERROR_SUCCESS; 87 88 case SERVICE_CONTROL_INTERROGATE: 89 TRACE(" SERVICE_CONTROL_INTERROGATE received\n"); 90 SetServiceStatus(ServiceStatusHandle, 91 &ServiceStatus); 92 return ERROR_SUCCESS; 93 94 case SERVICE_CONTROL_SHUTDOWN: 95 TRACE(" SERVICE_CONTROL_SHUTDOWN received\n"); 96 /* Stop listening to incoming RPC messages */ 97 RpcMgmtStopServerListening(NULL); 98 UpdateServiceStatus(SERVICE_STOPPED); 99 return ERROR_SUCCESS; 100 101 default : 102 TRACE(" Control %lu received\n", dwControl); 103 return ERROR_CALL_NOT_IMPLEMENTED; 104 } 105} 106 107 108static 109DWORD 110ServiceInit(VOID) 111{ 112 HANDLE hThread; 113 114 hThread = CreateThread(NULL, 115 0, 116 (LPTHREAD_START_ROUTINE)RpcThreadRoutine, 117 NULL, 118 0, 119 NULL); 120 121 if (!hThread) 122 { 123 ERR("Can't create PortThread\n"); 124 return GetLastError(); 125 } 126 else 127 CloseHandle(hThread); 128 129 return ERROR_SUCCESS; 130} 131 132 133VOID 134WINAPI 135ServiceMain( 136 _In_ DWORD ArgCount, 137 _In_ LPWSTR *ArgVector) 138{ 139 DWORD dwError; 140 141 UNREFERENCED_PARAMETER(ArgCount); 142 UNREFERENCED_PARAMETER(ArgVector); 143 144 FIXME("ServiceMain(%d %p)\n", ArgCount, ArgVector); 145 146 ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, 147 ServiceControlHandler, 148 NULL); 149 if (!ServiceStatusHandle) 150 { 151 ERR("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError()); 152 return; 153 } 154 155 UpdateServiceStatus(SERVICE_START_PENDING); 156 157 dwError = ServiceInit(); 158 if (dwError != ERROR_SUCCESS) 159 { 160 ERR("Service stopped (dwError: %lu\n", dwError); 161 UpdateServiceStatus(SERVICE_STOPPED); 162 return; 163 } 164 165 UpdateServiceStatus(SERVICE_RUNNING); 166} 167 168 169VOID 170WINAPI 171SvchostPushServiceGlobals( 172 _In_ PSVCHOST_GLOBAL_DATA lpGlobals) 173{ 174 TRACE("SvchostPushServiceGlobals(%p)\n", lpGlobals); 175 lpServiceGlobals = lpGlobals; 176} 177 178 179BOOL 180WINAPI 181DllMain( 182 _In_ HINSTANCE hinstDLL, 183 _In_ DWORD fdwReason, 184 _In_ PVOID pvReserved) 185{ 186 UNREFERENCED_PARAMETER(pvReserved); 187 188 switch (fdwReason) 189 { 190 case DLL_PROCESS_ATTACH: 191 DisableThreadLibraryCalls(hinstDLL); 192 hDllInstance = hinstDLL; 193 break; 194 195 case DLL_PROCESS_DETACH: 196 break; 197 } 198 199 return TRUE; 200} 201 202/* EOF */