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