From 4cb29716d1ed5d293188709fa70119955022777e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 24 Oct 2010 13:48:11 +0000 Subject: [PATCH] [SERVICES] RControlService: Check the current state before sending a control request. svn path=/trunk/; revision=49259 --- reactos/base/system/services/rpcserver.c | 29 +++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 07f7aacd73d..30df18d071f 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -553,6 +553,7 @@ DWORD RControlService( DWORD pcbBytesNeeded = 0; DWORD dwServicesReturned = 0; DWORD dwControlsAccepted; + DWORD dwCurrentState; HKEY hServicesKey = NULL; DPRINT("RControlService() called\n"); @@ -655,8 +656,34 @@ DWORD RControlService( else { dwControlsAccepted = lpService->Status.dwControlsAccepted; + dwCurrentState = lpService->Status.dwCurrentState; - /* Check if the control code is acceptable */ + /* Check the current state before sending a control request */ + switch (dwCurrentState) + { + case SERVICE_STOP_PENDING: + case SERVICE_STOPPED: + return ERROR_SERVICE_CANNOT_ACCEPT_CTRL; + + case SERVICE_START_PENDING: + switch (dwControl) + { + case SERVICE_CONTROL_STOP: + break; + + case SERVICE_CONTROL_INTERROGATE: + RtlCopyMemory(lpServiceStatus, + &lpService->Status, + sizeof(SERVICE_STATUS)); + return ERROR_SUCCESS; + + default: + return ERROR_SERVICE_CANNOT_ACCEPT_CTRL; + } + break; + } + + /* Check if the control code is acceptable to the service */ switch (dwControl) { case SERVICE_CONTROL_STOP: -- 2.17.1