diff --git a/reactos/base/system/services/database.c b/reactos/base/system/services/database.c index 0714a56e573..2440c6ab90f 100644 --- a/reactos/base/system/services/database.c +++ b/reactos/base/system/services/database.c @@ -38,7 +38,7 @@ LIST_ENTRY ServiceListHead; static RTL_RESOURCE DatabaseLock; static DWORD ResumeCount = 1; -/* The critical section synchronizes service controls commands */ +/* The critical section synchronizes service control requests */ static CRITICAL_SECTION ControlServiceCriticalSection; static DWORD PipeTimeout = 30000; /* 30 Seconds */ @@ -777,6 +777,7 @@ ScmCheckDriver(PSERVICE Service) } else // if (Service->Status.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER) { + ASSERT(Service->Status.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER); RtlInitUnicodeString(&DirName, L"\\FileSystem"); } @@ -897,6 +898,7 @@ ScmControlService(PSERVICE Service, DPRINT("ScmControlService() called\n"); + /* Acquire the service control critical section, to synchronize requests */ EnterCriticalSection(&ControlServiceCriticalSection); /* Calculate the total length of the start command line */ @@ -1715,8 +1717,6 @@ VOID ScmAutoStartServices(VOID) { DWORD dwError = ERROR_SUCCESS; - SC_RPC_LOCK Lock = NULL; - PLIST_ENTRY GroupEntry; PLIST_ENTRY ServiceEntry; PSERVICE_GROUP CurrentGroup; @@ -1725,27 +1725,15 @@ ScmAutoStartServices(VOID) HKEY hKey; ULONG i; + /* + * This function MUST be called ONLY at initialization time. + * Therefore, no need to acquire the user service start lock. + */ + ASSERT(ScmInitialize); + /* Acquire the service control critical section, to synchronize starts */ EnterCriticalSection(&ControlServiceCriticalSection); - /* - * Acquire the user service start lock while the service is starting, if - * needed (i.e. if we are not starting it during the initialization phase). - * If we don't success, bail out. - */ - if (!ScmInitialize) - { - /* - * Actually this code is never executed since we are called - * at initialization time, so that ScmInitialize == TRUE. - * But keep the code here if someday we are called later on - * for whatever reason... - */ - dwError = ScmAcquireServiceStartLock(TRUE, &Lock); - if (dwError != ERROR_SUCCESS) goto done; - } - - /* Clear 'ServiceVisited' flag (or set if not to start in Safe Mode) */ ServiceEntry = ServiceListHead.Flink; while (ServiceEntry != &ServiceListHead) @@ -1906,11 +1894,7 @@ ScmAutoStartServices(VOID) ServiceEntry = ServiceEntry->Flink; } - - /* Release the service start lock, if needed, and the critical section */ - if (Lock) ScmReleaseServiceStartLock(&Lock); - -done: + /* Release the critical section */ LeaveCriticalSection(&ControlServiceCriticalSection); } diff --git a/reactos/base/system/services/driver.c b/reactos/base/system/services/driver.c index a22ed98820c..405474b1471 100644 --- a/reactos/base/system/services/driver.c +++ b/reactos/base/system/services/driver.c @@ -145,6 +145,7 @@ ScmGetDriverStatus(PSERVICE lpService, } else // if (lpService->Status.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER) { + ASSERT(lpService->Status.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER); RtlInitUnicodeString(&DirName, L"\\FileSystem"); } diff --git a/reactos/base/system/services/services.c b/reactos/base/system/services/services.c index 5385a6beb9f..a7bbb973905 100644 --- a/reactos/base/system/services/services.c +++ b/reactos/base/system/services/services.c @@ -82,50 +82,11 @@ ScmLogError(DWORD dwEventId, } -BOOL -ScmCreateControlEvent(PHANDLE Event, - LPCWSTR Name, - DWORD dwDesiredAccess) -{ - /* - * This function creates a generic non-inheritable event - * and return a handle to the caller. The caller must - * close this handle afterwards. - */ - - HANDLE hEvent; - - hEvent = CreateEventW(NULL, TRUE, FALSE, Name); - if (hEvent == NULL) - { - if (GetLastError() == ERROR_ALREADY_EXISTS) - { - hEvent = OpenEventW(dwDesiredAccess, FALSE, Name); - } - } - - if (hEvent) - { - DPRINT("SERVICES: Created event %S with handle %x\n", Name, hEvent); - *Event = hEvent; - return TRUE; - } - else - { - DPRINT1("SERVICES: Failed to create event %S (Error %lu)\n", Name, GetLastError()); - return FALSE; - } -} - - VOID ScmWaitForLsa(VOID) { - HANDLE hEvent; - - if (!ScmCreateControlEvent(&hEvent, - LSA_RPC_SERVER_ACTIVE, - SYNCHRONIZE)) + HANDLE hEvent = CreateEventW(NULL, TRUE, FALSE, LSA_RPC_SERVER_ACTIVE); + if (hEvent == NULL) { DPRINT1("Failed to create the notification event (Error %lu)\n", GetLastError()); } @@ -134,7 +95,6 @@ ScmWaitForLsa(VOID) DPRINT("Wait for the LSA server!\n"); WaitForSingleObject(hEvent, INFINITE); DPRINT("LSA server running!\n"); - CloseHandle(hEvent); } @@ -357,9 +317,8 @@ wWinMain(HINSTANCE hInstance, ScmInitialize = TRUE; /* Create the start event */ - if (!ScmCreateControlEvent(&hScmStartEvent, - SCM_START_EVENT, - EVENT_ALL_ACCESS)) + hScmStartEvent = CreateEventW(NULL, TRUE, FALSE, SCM_START_EVENT); + if (hScmStartEvent == NULL) { DPRINT1("SERVICES: Failed to create the start event\n"); goto done; @@ -367,9 +326,8 @@ wWinMain(HINSTANCE hInstance, DPRINT("SERVICES: Created start event with handle %p.\n", hScmStartEvent); /* Create the auto-start complete event */ - if (!ScmCreateControlEvent(&hScmAutoStartCompleteEvent, - SCM_AUTOSTARTCOMPLETE_EVENT, - EVENT_ALL_ACCESS)) + hScmAutoStartCompleteEvent = CreateEventW(NULL, TRUE, FALSE, SCM_AUTOSTARTCOMPLETE_EVENT); + if (hScmAutoStartCompleteEvent = NULL) { DPRINT1("SERVICES: Failed to create the auto-start complete event\n"); goto done; @@ -380,7 +338,7 @@ wWinMain(HINSTANCE hInstance, hScmShutdownEvent = CreateEventW(NULL, TRUE, FALSE, NULL); if (hScmShutdownEvent == NULL) { - DPRINT1("SERVICES: Failed to create shutdown event\n"); + DPRINT1("SERVICES: Failed to create the shutdown event\n"); goto done; } diff --git a/reactos/dll/win32/advapi32/service/scm.c b/reactos/dll/win32/advapi32/service/scm.c index 29ecebe13e2..92f71691cdc 100644 --- a/reactos/dll/win32/advapi32/service/scm.c +++ b/reactos/dll/win32/advapi32/service/scm.c @@ -1673,28 +1673,14 @@ WaitForSCManager(VOID) TRACE("WaitForSCManager() called\n"); /* Try to open the existing event */ - hEvent = OpenEventW(SYNCHRONIZE, - FALSE, - SCM_START_EVENT); + hEvent = OpenEventW(SYNCHRONIZE, FALSE, SCM_START_EVENT); if (hEvent == NULL) { - if (GetLastError() != ERROR_FILE_NOT_FOUND) - return; + if (GetLastError() != ERROR_FILE_NOT_FOUND) return; /* Try to create a new event */ - hEvent = CreateEventW(NULL, - TRUE, - FALSE, - SCM_START_EVENT); - if (hEvent == NULL) - { - /* Try to open the existing event again */ - hEvent = OpenEventW(SYNCHRONIZE, - FALSE, - SCM_START_EVENT); - if (hEvent == NULL) - return; - } + hEvent = CreateEventW(NULL, TRUE, FALSE, SCM_START_EVENT); + if (hEvent == NULL) return; } /* Wait for 3 minutes */