From 90f5e6b6c322aeb5ad7d47d29f2d6c55a961a36b Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 30 Dec 2018 12:25:18 +0100 Subject: [PATCH 1/1] [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 ea91a5cb457..fc4dd2f561d 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 5b243f7f895..b11db5ae0e9 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 74943372c6f..4e6f1f18101 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 */ -- 2.17.1