https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e917471e0457e949800f4246a6465b4fa735af48

commit e917471e0457e949800f4246a6465b4fa735af48
Author:     Eric Kohl <eric.k...@reactos.org>
AuthorDate: Mon Feb 12 14:58:02 2018 +0100
Commit:     Eric Kohl <eric.k...@reactos.org>
CommitDate: Mon Feb 12 14:58:02 2018 +0100

    [SERVICES] Fix the initial service status
    
    - The initial dwWin32ExitCode for a disabled service is 
ERROR_SERVICE_DISABLED and ERROR_SRVICE_NEVER_STARTED for non-disabled services.
    - The initial dwWaitHint is 2000 (2 seconds) for (user-mode) services and 0 
for drivers.
    - Move all driver-related code to driver.c.
---
 base/system/services/database.c  | 29 ++++++++++++++++-------------
 base/system/services/driver.c    | 27 +++++++++++++++++++++++++--
 base/system/services/rpcserver.c |  6 +++---
 base/system/services/services.h  |  7 ++++---
 4 files changed, 48 insertions(+), 21 deletions(-)

diff --git a/base/system/services/database.c b/base/system/services/database.c
index 19c4e05724..b450fe486d 100644
--- a/base/system/services/database.c
+++ b/base/system/services/database.c
@@ -559,7 +559,9 @@ ScmGetServiceEntryByResumeCount(DWORD dwResumeCount)
 
 DWORD
 ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
-                          PSERVICE* lpServiceRecord)
+                          PSERVICE *lpServiceRecord,
+                          DWORD dwServiceType,
+                          DWORD dwStartType)
 {
     PSERVICE lpService = NULL;
 
@@ -579,6 +581,9 @@ ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
     lpService->lpServiceName = lpService->szServiceName;
     lpService->lpDisplayName = lpService->lpServiceName;
 
+    /* Set the start type */
+    lpService->dwStartType = dwStartType;
+
     /* Set the resume count */
     lpService->dwResumeCount = ResumeCount++;
 
@@ -587,12 +592,15 @@ ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
                    &lpService->ServiceListEntry);
 
     /* Initialize the service status */
+    lpService->Status.dwServiceType = dwServiceType;
     lpService->Status.dwCurrentState = SERVICE_STOPPED;
     lpService->Status.dwControlsAccepted = 0;
-    lpService->Status.dwWin32ExitCode = ERROR_SERVICE_NEVER_STARTED;
+    lpService->Status.dwWin32ExitCode =
+        (dwStartType == SERVICE_DISABLED) ? ERROR_SERVICE_DISABLED : 
ERROR_SERVICE_NEVER_STARTED;
     lpService->Status.dwServiceSpecificExitCode = 0;
     lpService->Status.dwCheckPoint = 0;
-    lpService->Status.dwWaitHint = 2000; /* 2 seconds */
+    lpService->Status.dwWaitHint =
+        (dwServiceType & SERVICE_DRIVER) ? 0 : 2000; /* 2 seconds */
 
     return ERROR_SUCCESS;
 }
@@ -719,12 +727,12 @@ CreateServiceListEntry(LPCWSTR lpServiceName,
     DPRINT("Display name: %S\n", lpDisplayName);
 
     dwError = ScmCreateNewServiceRecord(lpServiceName,
-                                        &lpService);
+                                        &lpService,
+                                        dwServiceType,
+                                        dwStartType);
     if (dwError != ERROR_SUCCESS)
         goto done;
 
-    lpService->Status.dwServiceType = dwServiceType;
-    lpService->dwStartType = dwStartType;
     lpService->dwErrorControl = dwErrorControl;
     lpService->dwTag = dwTagId;
 
@@ -1801,13 +1809,8 @@ ScmLoadService(PSERVICE Service,
 
     if (Service->Status.dwServiceType & SERVICE_DRIVER)
     {
-        /* Load driver */
-        dwError = ScmLoadDriver(Service);
-        if (dwError == ERROR_SUCCESS)
-        {
-            Service->Status.dwCurrentState = SERVICE_RUNNING;
-            Service->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
-        }
+        /* Start the driver */
+        dwError = ScmStartDriver(Service);
     }
     else // if (Service->Status.dwServiceType & (SERVICE_WIN32 | 
SERVICE_INTERACTIVE_PROCESS))
     {
diff --git a/base/system/services/driver.c b/base/system/services/driver.c
index de8bfc1aa3..819183e5c0 100644
--- a/base/system/services/driver.c
+++ b/base/system/services/driver.c
@@ -19,6 +19,7 @@
 
 /* FUNCTIONS ****************************************************************/
 
+static
 DWORD
 ScmLoadDriver(PSERVICE lpService)
 {
@@ -70,7 +71,7 @@ done:
     return RtlNtStatusToDosError(Status);
 }
 
-
+static
 DWORD
 ScmUnloadDriver(PSERVICE lpService)
 {
@@ -123,6 +124,7 @@ done:
 }
 
 
+static
 DWORD
 ScmGetDriverStatus(PSERVICE lpService,
                    LPSERVICE_STATUS lpServiceStatus)
@@ -285,6 +287,27 @@ ScmGetDriverStatus(PSERVICE lpService,
 }
 
 
+DWORD
+ScmStartDriver(PSERVICE pService)
+{
+    DWORD dwError;
+
+    DPRINT("ScmStartDriver(%p)\n", pService);
+
+    dwError = ScmLoadDriver(pService);
+    if (dwError == ERROR_SUCCESS)
+    {
+        pService->Status.dwCurrentState = SERVICE_RUNNING;
+        pService->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+        pService->Status.dwWin32ExitCode = ERROR_SUCCESS;
+    }
+
+    DPRINT("ScmStartDriver returns %lu\n", dwError);
+
+    return dwError;
+}
+
+
 DWORD
 ScmControlDriver(PSERVICE lpService,
                  DWORD dwControl,
@@ -328,7 +351,7 @@ ScmControlDriver(PSERVICE lpService,
             dwError = ERROR_INVALID_SERVICE_CONTROL;
     }
 
-done:;
+done:
     DPRINT("ScmControlDriver() done (Erorr: %lu)\n", dwError);
 
     return dwError;
diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c
index f1ce146a92..a4718aa15f 100644
--- a/base/system/services/rpcserver.c
+++ b/base/system/services/rpcserver.c
@@ -2279,13 +2279,13 @@ RCreateServiceW(
 
     /* Allocate a new service entry */
     dwError = ScmCreateNewServiceRecord(lpServiceName,
-                                        &lpService);
+                                        &lpService,
+                                        dwServiceType,
+                                        dwStartType);
     if (dwError != ERROR_SUCCESS)
         goto done;
 
     /* Fill the new service entry */
-    lpService->Status.dwServiceType = dwServiceType;
-    lpService->dwStartType = dwStartType;
     lpService->dwErrorControl = dwErrorControl;
 
     /* Fill the display name */
diff --git a/base/system/services/services.h b/base/system/services/services.h
index 1d20f120d1..0f03849967 100644
--- a/base/system/services/services.h
+++ b/base/system/services/services.h
@@ -168,7 +168,9 @@ PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName);
 PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName);
 PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount);
 DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName,
-                                PSERVICE *lpServiceRecord);
+                                PSERVICE *lpServiceRecord,
+                                DWORD dwServiceType,
+                                DWORD dwStartType);
 VOID ScmDeleteServiceRecord(PSERVICE lpService);
 DWORD ScmMarkServiceForDelete(PSERVICE pService);
 
@@ -185,8 +187,7 @@ VOID ScmDeleteNamedPipeCriticalSection(VOID);
 
 /* driver.c */
 
-DWORD ScmLoadDriver(PSERVICE lpService);
-DWORD ScmUnloadDriver(PSERVICE lpService);
+DWORD ScmStartDriver(PSERVICE lpService);
 DWORD ScmControlDriver(PSERVICE lpService,
                        DWORD dwControl,
                        LPSERVICE_STATUS lpServiceStatus);

Reply via email to