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