ReactOS  0.4.13-dev-99-g7e18b6d
services.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Service Control Manager
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: base/system/services/services.c
5  * PURPOSE: Main SCM controller
6  * COPYRIGHT: Copyright 2001-2005 Eric Kohl
7  * Copyright 2007 Ged Murphy <gedmurphy@reactos.org>
8  *
9  */
10 
11 /* INCLUDES *****************************************************************/
12 
13 #include "services.h"
14 
15 #include <wincon.h>
16 
17 #define NDEBUG
18 #include <debug.h>
19 
21 
22 /* GLOBALS ******************************************************************/
23 
24 /* Defined in include/reactos/services/services.h */
25 // #define SCM_START_EVENT L"SvcctrlStartEvent_A3752DX"
26 #define SCM_AUTOSTARTCOMPLETE_EVENT L"SC_AutoStartComplete"
27 
31 
32 
33 /* FUNCTIONS *****************************************************************/
34 
35 VOID
37 {
38 #if DBG
39  CHAR buffer[512];
40  va_list ap;
41 
42  va_start(ap, fmt);
43  vsprintf(buffer, fmt, ap);
44  va_end(ap);
45 
47 #endif
48 }
49 
50 
51 VOID
52 ScmLogEvent(DWORD dwEventId,
53  WORD wType,
54  WORD wStrings,
55  LPCWSTR *lpStrings)
56 {
57  HANDLE hLog;
58 
60  L"Service Control Manager");
61  if (hLog == NULL)
62  {
63  DPRINT1("ScmLogEvent: RegisterEventSourceW failed %lu\n", GetLastError());
64  return;
65  }
66 
67  if (!ReportEventW(hLog,
68  wType,
69  0,
70  dwEventId,
71  NULL,
72  wStrings,
73  0,
74  lpStrings,
75  NULL))
76  {
77  DPRINT1("ScmLogEvent: ReportEventW failed %lu\n", GetLastError());
78  }
79 
81 }
82 
83 
84 VOID
86 {
87  HANDLE hEvent = CreateEventW(NULL, TRUE, FALSE, L"LSA_RPC_SERVER_ACTIVE");
88  if (hEvent == NULL)
89  {
90  DPRINT1("Failed to create or open the notification event (Error %lu)\n", GetLastError());
91  }
92  else
93  {
94  DPRINT("Wait for the LSA server!\n");
96  DPRINT("LSA server running!\n");
98  }
99 
100  DPRINT("ScmWaitForLsa() done\n");
101 }
102 
103 
104 BOOL WINAPI
106 {
107  DPRINT1("ShutdownHandlerRoutine() called\n");
108 
109  if (dwCtrlType & (CTRL_SHUTDOWN_EVENT | CTRL_LOGOFF_EVENT))
110  {
111  DPRINT1("Shutdown event received!\n");
112  ScmShutdown = TRUE;
113 
116 
117  /* Set the shutdown event */
119  }
120 
121  return TRUE;
122 }
123 
124 
125 int WINAPI
127  HINSTANCE hPrevInstance,
128  LPWSTR lpCmdLine,
129  int nShowCmd)
130 {
131  HANDLE hScmStartEvent = NULL;
132  HANDLE hScmAutoStartCompleteEvent = NULL;
134  BOOL bCanDeleteNamedPipeCriticalSection = FALSE;
135  DWORD dwError;
136 
137  DPRINT("SERVICES: Service Control Manager\n");
138 
139  /* Make us critical */
141 
142  /* We are initializing ourselves */
144 
145  /* Create the start event */
146  hScmStartEvent = CreateEventW(NULL, TRUE, FALSE, SCM_START_EVENT);
147  if (hScmStartEvent == NULL)
148  {
149  DPRINT1("SERVICES: Failed to create the start event\n");
150  goto done;
151  }
152  DPRINT("SERVICES: Created start event with handle %p.\n", hScmStartEvent);
153 
154  /* Create the auto-start complete event */
155  hScmAutoStartCompleteEvent = CreateEventW(NULL, TRUE, FALSE, SCM_AUTOSTARTCOMPLETE_EVENT);
156  if (hScmAutoStartCompleteEvent == NULL)
157  {
158  DPRINT1("SERVICES: Failed to create the auto-start complete event\n");
159  goto done;
160  }
161  DPRINT("SERVICES: created auto-start complete event with handle %p.\n", hScmAutoStartCompleteEvent);
162 
163  /* Create the shutdown event */
165  if (hScmShutdownEvent == NULL)
166  {
167  DPRINT1("SERVICES: Failed to create the shutdown event\n");
168  goto done;
169  }
170 
171  /* Initialize our communication named pipe's critical section */
173  bCanDeleteNamedPipeCriticalSection = TRUE;
174 
175 // ScmInitThreadManager();
176 
178 
179  /* FIXME: more initialization */
180 
181  /* Create the 'Last Known Good' control set */
183  if (dwError != ERROR_SUCCESS)
184  {
185  DPRINT1("SERVICES: Failed to create the 'Last Known Good' control set (Error %lu)\n", dwError);
186  goto done;
187  }
188 
189  /* Create the services database */
190  dwError = ScmCreateServiceDatabase();
191  if (dwError != ERROR_SUCCESS)
192  {
193  DPRINT1("SERVICES: Failed to create SCM database (Error %lu)\n", dwError);
194  goto done;
195  }
196 
197  /* Update the services database */
199 
200  /* Register the Service Control Manager process with the ReactOS Subsystem */
202  {
203  DPRINT1("SERVICES: Could not register SCM process\n");
204  goto done;
205  }
206 
207  /*
208  * Acquire the user service start lock until
209  * auto-start services have been started.
210  */
211  dwError = ScmAcquireServiceStartLock(TRUE, &Lock);
212  if (dwError != ERROR_SUCCESS)
213  {
214  DPRINT1("SERVICES: Failed to acquire the service start lock (Error %lu)\n", dwError);
215  goto done;
216  }
217 
218  /* Start the RPC server */
220 
221  /* Signal start event */
222  SetEvent(hScmStartEvent);
223 
224  DPRINT("SERVICES: Initialized.\n");
225 
226  /* Register event handler (used for system shutdown) */
228 
229  /*
230  * Set our shutdown parameters: we want to shutdown after the maintained
231  * services (that inherit the default shutdown level of 640).
232  */
234 
235  /* Start auto-start services */
237 
238  /* Signal auto-start complete event */
239  SetEvent(hScmAutoStartCompleteEvent);
240 
241  /* FIXME: more to do ? */
242 
243  /* Release the service start lock */
245 
246  /* Initialization finished */
248 
249  DPRINT("SERVICES: Running.\n");
250 
251  /* Wait until the shutdown event gets signaled */
253 
254 done:
256 
257  /* Delete our communication named pipe's critical section */
258  if (bCanDeleteNamedPipeCriticalSection != FALSE)
260 
261  /* Close the shutdown event */
262  if (hScmShutdownEvent != NULL)
264 
265  /* Close the auto-start complete event */
266  if (hScmAutoStartCompleteEvent != NULL)
267  CloseHandle(hScmAutoStartCompleteEvent);
268 
269  /* Close the start event */
270  if (hScmStartEvent != NULL)
271  CloseHandle(hScmStartEvent);
272 
273  DPRINT("SERVICES: Finished.\n");
274 
275  ExitThread(0);
276  return 0;
277 }
278 
279 /* EOF */
VOID PrintString(LPCSTR fmt,...)
Definition: services.c:36
ULONG_PTR ServicesProcessId
Definition: register.c:20
VOID ScmAutoStartServices(VOID)
Definition: database.c:2061
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
#define ERROR_SUCCESS
Definition: deptool.c:10
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
static HANDLE hScmShutdownEvent
Definition: services.c:30
BOOL ScmInitialize
Definition: services.c:28
VOID ScmAutoShutdownServices(VOID)
Definition: database.c:2272
char CHAR
Definition: xmlstorage.h:175
VOID ScmWaitForLsa(VOID)
Definition: services.c:85
DWORD ScmCreateLastKnownGoodControlSet(VOID)
Definition: controlset.c:465
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
GLuint buffer
Definition: glext.h:5915
DWORD ScmInitializeSecurity(VOID)
Definition: security.c:288
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:597
static HANDLE hEvent
Definition: comm.c:54
BOOL WINAPI SetProcessShutdownParameters(IN DWORD dwLevel, IN DWORD dwFlags)
Definition: proc.c:979
VOID ScmGetBootAndSystemDriverState(VOID)
Definition: database.c:1184
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HINSTANCE hInstance
Definition: charmap.c:20
#define va_end(ap)
Definition: acmsvcex.h:90
DWORD ScmAcquireServiceStartLock(IN BOOL IsServiceController, OUT LPSC_RPC_LOCK lpLock)
Definition: lock.c:31
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
Definition: console.c:2111
smooth NULL
Definition: ftsmooth.c:416
char * va_list
Definition: acmsvcex.h:78
void DPRINT(...)
Definition: polytest.cpp:61
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:327
const char * LPCSTR
Definition: xmlstorage.h:183
VOID ScmLogEvent(DWORD dwEventId, WORD wType, WORD wStrings, LPCWSTR *lpStrings)
Definition: services.c:52
BOOL ScmShutdown
Definition: services.c:29
#define WINAPI
Definition: msvc.h:8
static HANDLE hLog
Definition: misc.cpp:15
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
VOID ScmStartRpcServer(VOID)
Definition: rpcserver.c:105
#define CTRL_LOGOFF_EVENT
Definition: wincon.h:69
DWORD ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock)
Definition: lock.c:82
static const WCHAR L[]
Definition: oid.c:1250
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG IN OUT PLONG IN LONG Increment IN PNDIS_RW_LOCK Lock
Definition: CrNtStubs.h:75
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
Definition: services.c:126
BOOL WINAPI ReportEventW(IN HANDLE hEventLog, IN WORD wType, IN WORD wCategory, IN DWORD dwEventID, IN PSID lpUserSid, IN WORD wNumStrings, IN DWORD dwDataSize, IN LPCWSTR *lpStrings, IN LPVOID lpRawData)
Definition: eventlog.c:1516
VOID ScmInitNamedPipeCriticalSection(VOID)
Definition: database.c:2331
VOID ScmDeleteNamedPipeCriticalSection(VOID)
Definition: database.c:2359
#define CTRL_SHUTDOWN_EVENT
Definition: wincon.h:70
#define SHUTDOWN_NORETRY
Definition: winbase.h:429
BOOL WINAPI ShutdownHandlerRoutine(DWORD dwCtrlType)
Definition: services.c:105
int __cdecl vsprintf(char *_Dest, const char *_Format, va_list _Args)
Definition: sprintf.c:733
#define va_start(ap, A)
Definition: acmsvcex.h:91
DWORD ScmCreateServiceDatabase(VOID)
Definition: database.c:987
BOOL WINAPI DeregisterEventSource(IN HANDLE hEventLog)
Definition: eventlog.c:473
#define DPRINT1
Definition: precomp.h:8
NTSYSAPI NTSTATUS __cdecl RtlSetProcessIsCritical(_In_ BOOLEAN NewValue, _Out_opt_ PBOOLEAN OldValue, _In_ BOOLEAN NeedBreaks)
void int int ULONGLONG int va_list * ap
Definition: winesup.h:32
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define SCM_AUTOSTARTCOMPLETE_EVENT
Definition: services.c:26
#define INFINITE
Definition: serial.h:102
#define SCM_START_EVENT
Definition: services.h:26
HANDLE WINAPI RegisterEventSourceW(IN LPCWSTR lpUNCServerName, IN LPCWSTR lpSourceName)
Definition: eventlog.c:1295
VOID ScmShutdownServiceDatabase(VOID)
Definition: database.c:1074
Definition: dsound.c:943
void WINAPI SHIM_OBJ_NAME() OutputDebugStringA(LPCSTR lpOutputString)
Definition: ignoredbgout.c:18
VOID ScmShutdownSecurity(VOID)
Definition: security.c:309
int WINAPI RegisterServicesProcess(DWORD ServicesProcessId)
Definition: logon.c:18
DWORD WINAPI GetCurrentProcessId(VOID)
Definition: proc.c:1188