Author: ekohl Date: Thu Jun 16 21:18:59 2016 New Revision: 71651
URL: http://svn.reactos.org/svn/reactos?rev=71651&view=rev Log: [SC] Add GetKeyName command.
Modified: trunk/reactos/base/applications/sc/name.c trunk/reactos/base/applications/sc/sc.c trunk/reactos/base/applications/sc/sc.h trunk/reactos/base/applications/sc/usage.c
Modified: trunk/reactos/base/applications/sc/name.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/name.c... ============================================================================== --- trunk/reactos/base/applications/sc/name.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/sc/name.c [iso-8859-1] Thu Jun 16 21:18:59 2016 @@ -73,3 +73,68 @@
return bResult; } + +BOOL GetKeyName(LPCTSTR ServiceName) +{ + SC_HANDLE hManager = NULL; + BOOL bResult = TRUE; + DWORD BufferSize = 0; + LPTSTR pBuffer = NULL; + + hManager = OpenSCManager(NULL, + NULL, + SC_MANAGER_CONNECT); + if (hManager == NULL) + { + _tprintf(_T("[SC] OpenSCManager FAILED %lu:\n\n"), GetLastError()); + bResult = FALSE; + goto done; + } + + if (!GetServiceKeyName(hManager, + ServiceName, + NULL, + &BufferSize)) + { + if (BufferSize == 0) + { + _tprintf(_T("[SC] GetServiceKeyName FAILED %lu:\n\n"), GetLastError()); + bResult = FALSE; + goto done; + } + } + + pBuffer = HeapAlloc(GetProcessHeap(), 0, (BufferSize + 1) * sizeof(TCHAR)); + if (pBuffer == NULL) + { + SetLastError(ERROR_OUTOFMEMORY); + _tprintf(_T("[SC] HeapAlloc FAILED %lu:\n\n"), GetLastError()); + bResult = FALSE; + goto done; + } + + BufferSize++; + if (!GetServiceKeyName(hManager, + ServiceName, + pBuffer, + &BufferSize)) + { + _tprintf(_T("[SC] GetServiceKeyName FAILED %lu:\n\n"), GetLastError()); + bResult = FALSE; + goto done; + } + + _tprintf(_T("[SC] GetServiceKeyName SUCCESS Name = %s\n"), pBuffer); + +done: + if (bResult == FALSE) + ReportLastError(); + + if (pBuffer != NULL) + HeapFree(GetProcessHeap(), 0, pBuffer); + + if (hManager) + CloseServiceHandle(hManager); + + return bResult; +}
Modified: trunk/reactos/base/applications/sc/sc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/sc.c?r... ============================================================================== --- trunk/reactos/base/applications/sc/sc.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/sc/sc.c [iso-8859-1] Thu Jun 16 21:18:59 2016 @@ -284,6 +284,18 @@ else GetDisplayNameUsage(); } + else if (!lstrcmpi(Command, _T("GetKeyName"))) + { + if (ArgCount > 0) + { + ServiceName = *ServiceArgs++; + ArgCount--; + + GetKeyName(ServiceName); + } + else + GetKeyNameUsage(); + } else { MainUsage();
Modified: trunk/reactos/base/applications/sc/sc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/sc.h?r... ============================================================================== --- trunk/reactos/base/applications/sc/sc.h [iso-8859-1] (original) +++ trunk/reactos/base/applications/sc/sc.h [iso-8859-1] Thu Jun 16 21:18:59 2016 @@ -46,6 +46,7 @@ BOOL QueryFailure(LPCTSTR ServiceName); BOOL SetFailure(LPCTSTR *ServiceArgs, INT ArgCount); BOOL GetDisplayName(LPCTSTR ServiceName); +BOOL GetKeyName(LPCTSTR ServiceName);
/* print and error functions */ VOID PrintService(LPCTSTR ServiceName, LPSERVICE_STATUS_PROCESS pStatus, BOOL bExtended); @@ -85,5 +86,6 @@ VOID SetConfigUsage(VOID); VOID SetFailureUsage(VOID); VOID GetDisplayNameUsage(VOID); +VOID GetKeyNameUsage(VOID);
#endif /* _SC_PCH_ */
Modified: trunk/reactos/base/applications/sc/usage.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/usage.... ============================================================================== --- trunk/reactos/base/applications/sc/usage.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/sc/usage.c [iso-8859-1] Thu Jun 16 21:18:59 2016 @@ -44,8 +44,8 @@ _T("\t control : Sends a control to a service.\n") _T("\t sdshow : Displays a service's security descriptor.\n") _T("\t sdset : Sets a service's security descriptor.\n") - _T("\t GetDisplayName : Gets the DisplayName for a service.\n")); -// "\t GetKeyName : Gets the ServiceKeyName for a service.\n") + _T("\t GetDisplayName : Gets the DisplayName for a service.\n") + _T("\t GetKeyName : Gets the ServiceKeyName for a service.\n")); // "\t EnumDepend : Enumerates Service Dependencies.\n") // "\n") // "\tService Name Independant Commands:\n") @@ -266,7 +266,16 @@ VOID GetDisplayNameUsage(VOID) { _tprintf(_T("DESCRIPTION:\n") - _T(" Gets the display name associated with a particular service\n") + _T(" Gets the display name associated with a particular service.\n") _T("USAGE:\n") _T(" sc <server> GetDisplayName <service key name> <bufsize>\n")); } + +VOID GetKeyNameUsage(VOID) +{ + _tprintf(_T("DESCRIPTION:\n") + _T(" Gets the key name associated with a particular service, using the\n") + _T(" display name as input.\n") + _T("USAGE:\n") + _T(" sc <server> GetKeyName <service display name> <bufsize>\n")); +}