Piotr Caban : services: Fix SERVICE_STATUS initialization in svcctl_ControlService.

Alexandre Julliard julliard at winehq.org
Mon Dec 12 12:25:54 CST 2011


Module: wine
Branch: master
Commit: c11e163eb789d099b70261afd3303d8ff8e826ee
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c11e163eb789d099b70261afd3303d8ff8e826ee

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Dec 12 11:03:55 2011 +0100

services: Fix SERVICE_STATUS initialization in svcctl_ControlService.

---

 programs/services/rpc.c |   47 +++++++++++++++++++++++++++++++++--------------
 1 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 806e65d..5fe8585 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -1048,29 +1048,35 @@ DWORD __cdecl svcctl_ControlService(
 
     service_lock_exclusive(service->service_entry);
 
-    if (lpServiceStatus)
-    {
-        lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType;
-        lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState;
-        lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted;
-        lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode;
-        lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode;
-        lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint;
-        lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint;
-    }
-
+    result = ERROR_SUCCESS;
     switch (service->service_entry->status.dwCurrentState)
     {
     case SERVICE_STOPPED:
-        service_unlock(service->service_entry);
-        return ERROR_SERVICE_NOT_ACTIVE;
+        result = ERROR_SERVICE_NOT_ACTIVE;
+        break;
     case SERVICE_START_PENDING:
         if (dwControl==SERVICE_CONTROL_STOP)
             break;
         /* fall thru */
     case SERVICE_STOP_PENDING:
+        result = ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
+        break;
+    }
+
+    if (result != ERROR_SUCCESS)
+    {
+        if (lpServiceStatus)
+        {
+            lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType;
+            lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState;
+            lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted;
+            lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode;
+            lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode;
+            lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint;
+            lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint;
+        }
         service_unlock(service->service_entry);
-        return ERROR_SERVICE_CANNOT_ACCEPT_CTRL;
+        return result;
     }
 
     if (!service_accepts_control(service->service_entry, dwControl))
@@ -1096,6 +1102,19 @@ DWORD __cdecl svcctl_ControlService(
     {
         service_send_control(service->service_entry, control_pipe, dwControl, &result);
 
+        if (lpServiceStatus)
+        {
+            service_lock_shared(service->service_entry);
+            lpServiceStatus->dwServiceType = service->service_entry->status.dwServiceType;
+            lpServiceStatus->dwCurrentState = service->service_entry->status.dwCurrentState;
+            lpServiceStatus->dwControlsAccepted = service->service_entry->status.dwControlsAccepted;
+            lpServiceStatus->dwWin32ExitCode = service->service_entry->status.dwWin32ExitCode;
+            lpServiceStatus->dwServiceSpecificExitCode = service->service_entry->status.dwServiceSpecificExitCode;
+            lpServiceStatus->dwCheckPoint = service->service_entry->status.dwCheckPoint;
+            lpServiceStatus->dwWaitHint = service->service_entry->status.dwWaitHint;
+            service_unlock(service->service_entry);
+        }
+
         if (dwControl == SERVICE_CONTROL_STOP)
         {
             CloseHandle(control_mutex);




More information about the wine-cvs mailing list