https://git.reactos.org/?p=reactos.git;a=commitdiff;h=90f5e6b6c322aeb5ad7d47d29f2d6c55a961a36b

commit 90f5e6b6c322aeb5ad7d47d29f2d6c55a961a36b
Author:     Pierre Schweitzer <pie...@reactos.org>
AuthorDate: Sun Dec 30 12:25:18 2018 +0100
Commit:     Pierre Schweitzer <pie...@reactos.org>
CommitDate: Sun Dec 30 14:27:03 2018 +0100

    [SERVICES] Implement RI_ScQueryServiceTagInfo
---
 base/system/services/database.c  |  8 ++++++++
 base/system/services/rpcserver.c | 34 ++++++++++++++++++++++++++++++++--
 base/system/services/services.h  |  2 ++
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/base/system/services/database.c b/base/system/services/database.c
index ea91a5cb45..fc4dd2f561 100644
--- a/base/system/services/database.c
+++ b/base/system/services/database.c
@@ -145,6 +145,14 @@ ScmGetServiceImageByImagePath(LPWSTR lpImagePath)
 }
 
 
+DWORD
+ScmGetServiceNameFromTag(PTAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams, 
PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS *OutParams)
+{
+    UNIMPLEMENTED;
+    return ERROR_CALL_NOT_IMPLEMENTED;
+}
+
+
 static
 BOOL
 ScmIsSameServiceAccount(
diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c
index 5b243f7f89..b11db5ae0e 100644
--- a/base/system/services/rpcserver.c
+++ b/base/system/services/rpcserver.c
@@ -6586,8 +6586,38 @@ RI_ScQueryServiceTagInfo(
     PTAG_INFO_NAME_FROM_TAG_IN_PARAMS * lpInParams,
     PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS * lpOutParams)
 {
-    UNIMPLEMENTED;
-    return ERROR_CALL_NOT_IMPLEMENTED;
+    PMANAGER_HANDLE hManager;
+
+    /* Validate handle */
+    hManager = ScmGetServiceManagerFromHandle(hSCManager);
+    if (hManager == NULL)
+    {
+        return ERROR_INVALID_HANDLE;
+    }
+
+    /* FIXME: should check whether client is local */
+
+    /* Check access rights */
+    if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess,
+                                  SC_MANAGER_ENUMERATE_SERVICE))
+    {
+        return ERROR_ACCESS_DENIED;
+    }
+
+    /* Check parameters */
+    if (lpInParams == NULL || lpOutParams == NULL)
+    {
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Check info level */
+    if (dwInfoLevel != TagInfoLevelNameFromTag)
+    {
+        return ERROR_RETRY;
+    }
+
+    /* Call internal helper */
+    return ScmGetServiceNameFromTag(*lpInParams, lpOutParams);
 }
 
 
diff --git a/base/system/services/services.h b/base/system/services/services.h
index 74943372c6..4e6f1f1810 100644
--- a/base/system/services/services.h
+++ b/base/system/services/services.h
@@ -197,6 +197,8 @@ VOID ScmUnlockDatabase(VOID);
 VOID ScmInitNamedPipeCriticalSection(VOID);
 VOID ScmDeleteNamedPipeCriticalSection(VOID);
 
+DWORD ScmGetServiceNameFromTag(PTAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams,
+                               PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS *OutParams);
 
 /* driver.c */
 

Reply via email to