From: Eric Kohl Date: Sun, 25 Dec 2005 21:19:33 +0000 (+0000) Subject: Implement QueryServiceStatusEx. X-Git-Tag: backups/expat-rbuild@40467~804 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=1dbbdf4ea8757f1502ea50fc04e2415411341ad4 Implement QueryServiceStatusEx. svn path=/trunk/; revision=20331 --- diff --git a/reactos/subsys/system/services/rpcserver.c b/reactos/subsys/system/services/rpcserver.c index 78d66c0f3b8..bae5348eb59 100644 --- a/reactos/subsys/system/services/rpcserver.c +++ b/reactos/subsys/system/services/rpcserver.c @@ -2081,8 +2081,55 @@ ScmrQueryServiceStatusEx(handle_t BindingHandle, unsigned long cbBufSize, unsigned long *pcbBytesNeeded) /* out */ { - DPRINT1("ScmrQueryServiceStatusEx() is unimplemented\n"); - return ERROR_CALL_NOT_IMPLEMENTED; + LPSERVICE_STATUS_PROCESS lpStatus; + PSERVICE_HANDLE hSvc; + PSERVICE lpService; + + DPRINT("ScmrQueryServiceStatusEx() called\n"); + + if (ScmShutdown) + return ERROR_SHUTDOWN_IN_PROGRESS; + + if (InfoLevel != SC_STATUS_PROCESS_INFO) + return ERROR_INVALID_LEVEL; + + *pcbBytesNeeded = sizeof(SERVICE_STATUS_PROCESS); + + if (cbBufSize < sizeof(SERVICE_STATUS_PROCESS)) + return ERROR_INSUFFICIENT_BUFFER; + + hSvc = (PSERVICE_HANDLE)hService; + if (hSvc->Handle.Tag != SERVICE_TAG) + { + DPRINT1("Invalid handle tag!\n"); + return ERROR_INVALID_HANDLE; + } + + if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, + SERVICE_QUERY_STATUS)) + { + DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + return ERROR_ACCESS_DENIED; + } + + lpService = hSvc->ServiceEntry; + if (lpService == NULL) + { + DPRINT1("lpService == NULL!\n"); + return ERROR_INVALID_HANDLE; + } + + lpStatus = (LPSERVICE_STATUS_PROCESS)lpBuffer; + + /* Return service status information */ + RtlCopyMemory(lpStatus, + &lpService->Status, + sizeof(SERVICE_STATUS)); + + lpStatus->dwProcessId = lpService->ProcessId; /* FIXME */ + lpStatus->dwServiceFlags = 0; /* FIXME */ + + return ERROR_SUCCESS; }