3 * Copyright (C) 2015 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS Services
22 * FILE: base/services/srvsvc/srvsvc.c
23 * PURPOSE: Server service
24 * PROGRAMMER: Eric Kohl
27 /* INCLUDES *****************************************************************/
31 WINE_DEFAULT_DEBUG_CHANNEL(srvsvc
);
33 /* GLOBALS ******************************************************************/
35 static WCHAR ServiceName
[] = L
"Lanmanserver";
37 static SERVICE_STATUS_HANDLE ServiceStatusHandle
;
38 static SERVICE_STATUS ServiceStatus
;
40 DWORD dwServiceBits
= 0;
43 /* FUNCTIONS *****************************************************************/
46 UpdateServiceStatus(DWORD dwState
)
48 ServiceStatus
.dwServiceType
= SERVICE_WIN32_OWN_PROCESS
;
49 ServiceStatus
.dwCurrentState
= dwState
;
50 ServiceStatus
.dwControlsAccepted
= 0;
51 ServiceStatus
.dwWin32ExitCode
= 0;
52 ServiceStatus
.dwServiceSpecificExitCode
= 0;
53 ServiceStatus
.dwCheckPoint
= 0;
55 if (dwState
== SERVICE_START_PENDING
||
56 dwState
== SERVICE_STOP_PENDING
||
57 dwState
== SERVICE_PAUSE_PENDING
||
58 dwState
== SERVICE_CONTINUE_PENDING
)
59 ServiceStatus
.dwWaitHint
= 10000;
61 ServiceStatus
.dwWaitHint
= 0;
63 SetServiceStatus(ServiceStatusHandle
,
68 ServiceControlHandler(DWORD dwControl
,
73 TRACE("ServiceControlHandler() called\n");
77 case SERVICE_CONTROL_STOP
:
78 TRACE(" SERVICE_CONTROL_STOP received\n");
79 /* Stop listening to incoming RPC messages */
80 RpcMgmtStopServerListening(NULL
);
81 UpdateServiceStatus(SERVICE_STOPPED
);
84 case SERVICE_CONTROL_PAUSE
:
85 TRACE(" SERVICE_CONTROL_PAUSE received\n");
86 UpdateServiceStatus(SERVICE_PAUSED
);
89 case SERVICE_CONTROL_CONTINUE
:
90 TRACE(" SERVICE_CONTROL_CONTINUE received\n");
91 UpdateServiceStatus(SERVICE_RUNNING
);
94 case SERVICE_CONTROL_INTERROGATE
:
95 TRACE(" SERVICE_CONTROL_INTERROGATE received\n");
96 SetServiceStatus(ServiceStatusHandle
,
100 case SERVICE_CONTROL_SHUTDOWN
:
101 TRACE(" SERVICE_CONTROL_SHUTDOWN received\n");
102 UpdateServiceStatus(SERVICE_STOPPED
);
103 return ERROR_SUCCESS
;
106 TRACE(" Control %lu received\n", dwControl
);
107 return ERROR_CALL_NOT_IMPLEMENTED
;
118 hThread
= CreateThread(NULL
,
120 (LPTHREAD_START_ROUTINE
)RpcThreadRoutine
,
127 ERR("Can't create PortThread\n");
128 return GetLastError();
131 CloseHandle(hThread
);
133 /* Report a running server service */
134 SetServiceBits(ServiceStatusHandle
,
139 return ERROR_SUCCESS
;
145 ServiceMain(DWORD argc
, LPTSTR
*argv
)
149 UNREFERENCED_PARAMETER(argc
);
150 UNREFERENCED_PARAMETER(argv
);
152 TRACE("ServiceMain() called\n");
154 ServiceStatusHandle
= RegisterServiceCtrlHandlerExW(ServiceName
,
155 ServiceControlHandler
,
157 if (!ServiceStatusHandle
)
159 ERR("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError());
163 UpdateServiceStatus(SERVICE_START_PENDING
);
165 dwError
= ServiceInit();
166 if (dwError
!= ERROR_SUCCESS
)
168 ERR("Service stopped (dwError: %lu\n", dwError
);
169 UpdateServiceStatus(SERVICE_STOPPED
);
173 UpdateServiceStatus(SERVICE_RUNNING
);
178 DllMain(HINSTANCE hinstDLL
,
184 case DLL_PROCESS_ATTACH
:
185 DisableThreadLibraryCalls(hinstDLL
);
188 case DLL_PROCESS_DETACH
: