https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e917471e0457e949800f42...
commit e917471e0457e949800f4246a6465b4fa735af48 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Mon Feb 12 14:58:02 2018 +0100 Commit: Eric Kohl eric.kohl@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);