From: Pierre Schweitzer Date: Sun, 30 Dec 2018 11:25:18 +0000 (+0100) Subject: [SERVICES] Implement RI_ScQueryServiceTagInfo X-Git-Tag: 0.4.13-dev~856 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=90f5e6b6c322aeb5ad7d47d29f2d6c55a961a36b [SERVICES] Implement RI_ScQueryServiceTagInfo --- 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 */