Author: ekohl
Date: Sat Jun 11 21:24:40 2016
New Revision: 71615

URL: http://svn.reactos.org/svn/reactos?rev=71615&view=rev
Log:
[SC]
Implement the qc, qdescription and qfailure commands.

Added:
    trunk/reactos/base/applications/sc/qc.c   (with props)
    trunk/reactos/base/applications/sc/qdescription.c   (with props)
    trunk/reactos/base/applications/sc/qfailure.c   (with props)
Modified:
    trunk/reactos/base/applications/sc/CMakeLists.txt
    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/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/CMakeLists.txt?rev=71615&r1=71614&r2=71615&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/CMakeLists.txt   [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/CMakeLists.txt   [iso-8859-1] Sat Jun 11 
21:24:40 2016
@@ -6,6 +6,9 @@
     create.c
     delete.c
     print.c
+    qc.c
+    qdescription.c
+    qfailure.c
     query.c
     sc.c
     sdset.c

Added: trunk/reactos/base/applications/sc/qc.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/qc.c?rev=71615
==============================================================================
--- trunk/reactos/base/applications/sc/qc.c     (added)
+++ trunk/reactos/base/applications/sc/qc.c     [iso-8859-1] Sat Jun 11 
21:24:40 2016
@@ -0,0 +1,190 @@
+/*
+ * PROJECT:     ReactOS Services
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        base/applications/sc/qc.c
+ * PURPOSE:     Show the service configuration
+ * COPYRIGHT:   Copyright 2016 Eric Kohl
+ *
+ */
+
+#include "sc.h"
+
+BOOL QueryConfig(LPCTSTR ServiceName)
+{
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    BOOL bResult = TRUE;
+    DWORD cbBytesNeeded = 0;
+    LPQUERY_SERVICE_CONFIG pServiceConfig = NULL;
+    LPWSTR lpPtr;
+    INT nLen, i;
+
+#ifdef SCDBG
+    _tprintf(_T("service to show configuration - %s\n\n"), ServiceName);
+#endif
+
+    hManager = OpenSCManager(NULL,
+                             NULL,
+                             SC_MANAGER_CONNECT);
+    if (hManager == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    hService = OpenService(hManager, ServiceName, SERVICE_QUERY_CONFIG);
+    if (hService == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    if (!QueryServiceConfig(hService,
+                            NULL,
+                            0,
+                            &cbBytesNeeded))
+    {
+        if (cbBytesNeeded == 0)
+        {
+            bResult = FALSE;
+            goto done;
+        }
+    }
+
+    pServiceConfig = HeapAlloc(GetProcessHeap(), 0, cbBytesNeeded);
+    if (pServiceConfig == NULL)
+    {
+        SetLastError(ERROR_OUTOFMEMORY);
+        bResult = FALSE;
+        goto done;
+    }
+
+    if (!QueryServiceConfig(hService,
+                            pServiceConfig,
+                            cbBytesNeeded,
+                            &cbBytesNeeded))
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    _tprintf(_T("SERVICE_NAME: %s\n"), ServiceName);
+    _tprintf(_T("        TYPE               : %-3lx "), 
pServiceConfig->dwServiceType);
+    switch (pServiceConfig->dwServiceType)
+    {
+        case SERVICE_KERNEL_DRIVER:
+            _tprintf(_T("KERNEL_DRIVER\n"));
+            break;
+
+        case SERVICE_FILE_SYSTEM_DRIVER:
+            _tprintf(_T("FILE_SYSTEM_DRIVER\n"));
+            break;
+
+        case SERVICE_WIN32_OWN_PROCESS:
+            _tprintf(_T("WIN32_OWN_PROCESS\n"));
+            break;
+
+        case SERVICE_WIN32_SHARE_PROCESS:
+            _tprintf(_T("WIN32_SHARE_PROCESS\n"));
+            break;
+
+        case SERVICE_WIN32_OWN_PROCESS + SERVICE_INTERACTIVE_PROCESS:
+            _tprintf(_T("WIN32_OWN_PROCESS (interactive)\n"));
+            break;
+
+        case SERVICE_WIN32_SHARE_PROCESS + SERVICE_INTERACTIVE_PROCESS:
+            _tprintf(_T("WIN32_SHARE_PROCESS (interactive)\n"));
+            break;
+
+        default:
+            _tprintf(_T("\n"));
+            break;
+    }
+
+    _tprintf(_T("        START_TYPE         : %-3lx "), 
pServiceConfig->dwStartType);
+    switch (pServiceConfig->dwStartType)
+    {
+        case SERVICE_BOOT_START:
+            _tprintf(_T("BOOT_START\n"));
+            break;
+
+        case SERVICE_SYSTEM_START:
+            _tprintf(_T("SYSTEM_START\n"));
+            break;
+
+        case SERVICE_AUTO_START:
+            _tprintf(_T("AUTO_START\n"));
+            break;
+
+        case SERVICE_DEMAND_START:
+            _tprintf(_T("DEMAND_START\n"));
+            break;
+
+        case SERVICE_DISABLED:
+            _tprintf(_T("DISABLED\n"));
+            break;
+
+        default:
+            _tprintf(_T("\n"));
+            break;
+    }
+
+    _tprintf(_T("        ERROR_CONTROL      : %-3lx "), 
pServiceConfig->dwErrorControl);
+    switch (pServiceConfig->dwErrorControl)
+    {
+        case SERVICE_ERROR_IGNORE:
+            _tprintf(_T("IGNORE\n"));
+            break;
+
+        case SERVICE_ERROR_NORMAL:
+            _tprintf(_T("NORMAL\n"));
+            break;
+
+        case SERVICE_ERROR_SEVERE:
+            _tprintf(_T("SEVERE\n"));
+            break;
+
+        case SERVICE_ERROR_CRITICAL:
+            _tprintf(_T("CRITICAL\n"));
+            break;
+
+        default:
+            _tprintf(_T("\n"));
+            break;
+    }
+
+    _tprintf(_T("        BINARY_PATH_NAME   : %s\n"), 
pServiceConfig->lpBinaryPathName);
+    _tprintf(_T("        LOAD_ORDER_GROUP   : %s\n"), 
pServiceConfig->lpLoadOrderGroup);
+    _tprintf(_T("        TAG                : %lu\n"), 
pServiceConfig->dwTagId);
+    _tprintf(_T("        DISPLAY_NAME       : %s\n"), 
pServiceConfig->lpDisplayName);
+    _tprintf(_T("        DEPENDENCIES       : "));
+    lpPtr = pServiceConfig->lpDependencies;
+    i = 0;
+    while (*lpPtr != _T('\0'))
+    {
+       nLen = _tcslen(lpPtr);
+       if (i != 0)
+           _tprintf(_T("\n                           : "));
+       _tprintf(_T("%s"), lpPtr);
+       lpPtr = lpPtr + nLen + 1;
+       i++;
+    }
+    _tprintf(_T("\n"));
+
+    _tprintf(_T("        SERVICE_START_NAME : %s\n"), 
pServiceConfig->lpServiceStartName);
+
+done:
+    if (bResult == FALSE)
+        ReportLastError();
+
+    if (pServiceConfig != NULL)
+        HeapFree(GetProcessHeap(), 0, pServiceConfig);
+
+    if (hService)
+        CloseServiceHandle(hService);
+
+    if (hManager)
+        CloseServiceHandle(hManager);
+
+    return bResult;
+}

Propchange: trunk/reactos/base/applications/sc/qc.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/base/applications/sc/qdescription.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/qdescription.c?rev=71615
==============================================================================
--- trunk/reactos/base/applications/sc/qdescription.c   (added)
+++ trunk/reactos/base/applications/sc/qdescription.c   [iso-8859-1] Sat Jun 11 
21:24:40 2016
@@ -0,0 +1,88 @@
+/*
+ * PROJECT:     ReactOS Services
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        base/applications/sc/qdescription.c
+ * PURPOSE:     Show the service description
+ * COPYRIGHT:   Copyright 2016 Eric Kohl
+ *
+ */
+
+#include "sc.h"
+
+BOOL QueryDescription(LPCTSTR ServiceName)
+{
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    BOOL bResult = TRUE;
+    DWORD cbBytesNeeded = 0;
+    LPSERVICE_DESCRIPTION pServiceDescription = NULL;
+
+#ifdef SCDBG
+    _tprintf(_T("service to show description - %s\n\n"), ServiceName);
+#endif
+
+    hManager = OpenSCManager(NULL,
+                             NULL,
+                             SC_MANAGER_CONNECT);
+    if (hManager == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    hService = OpenService(hManager, ServiceName, SERVICE_QUERY_CONFIG);
+    if (hService == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    if (!QueryServiceConfig2(hService,
+                             SERVICE_CONFIG_DESCRIPTION,
+                             NULL,
+                             0,
+                             &cbBytesNeeded))
+    {
+        if (cbBytesNeeded == 0)
+        {
+            bResult = FALSE;
+            goto done;
+        }
+    }
+
+    pServiceDescription = HeapAlloc(GetProcessHeap(), 0, cbBytesNeeded);
+    if (pServiceDescription == NULL)
+    {
+        SetLastError(ERROR_OUTOFMEMORY);
+        bResult = FALSE;
+        goto done;
+    }
+
+    if (!QueryServiceConfig2(hService,
+                             SERVICE_CONFIG_DESCRIPTION,
+                             (LPBYTE)pServiceDescription,
+                             cbBytesNeeded,
+                             &cbBytesNeeded))
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    _tprintf(_T("SERVICE_NAME: %s\n"), ServiceName);
+    _tprintf(_T("        DESCRIPTION        : %s\n"), 
pServiceDescription->lpDescription);
+
+done:
+    if (bResult == FALSE)
+        ReportLastError();
+
+    if (pServiceDescription != NULL)
+        HeapFree(GetProcessHeap(), 0, pServiceDescription);
+
+    if (hService)
+        CloseServiceHandle(hService);
+
+    if (hManager)
+        CloseServiceHandle(hManager);
+
+    return bResult;
+}

Propchange: trunk/reactos/base/applications/sc/qdescription.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/base/applications/sc/qfailure.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/qfailure.c?rev=71615
==============================================================================
--- trunk/reactos/base/applications/sc/qfailure.c       (added)
+++ trunk/reactos/base/applications/sc/qfailure.c       [iso-8859-1] Sat Jun 11 
21:24:40 2016
@@ -0,0 +1,118 @@
+/*
+ * PROJECT:     ReactOS Services
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        base/applications/sc/qfailure.c
+ * PURPOSE:     Show the service failure action
+ * COPYRIGHT:   Copyright 2016 Eric Kohl
+ *
+ */
+
+#include "sc.h"
+
+BOOL QueryFailure(LPCTSTR ServiceName)
+{
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    BOOL bResult = TRUE;
+    DWORD cbBytesNeeded = 0;
+    LPSERVICE_FAILURE_ACTIONS pServiceFailure = NULL;
+    INT i;
+
+#ifdef SCDBG
+    _tprintf(_T("service to show failure action - %s\n\n"), ServiceName);
+#endif
+
+    hManager = OpenSCManager(NULL,
+                             NULL,
+                             SC_MANAGER_CONNECT);
+    if (hManager == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    hService = OpenService(hManager, ServiceName, SERVICE_QUERY_CONFIG);
+    if (hService == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    if (!QueryServiceConfig2(hService,
+                             SERVICE_CONFIG_FAILURE_ACTIONS,
+                             NULL,
+                             0,
+                             &cbBytesNeeded))
+    {
+        if (cbBytesNeeded == 0)
+        {
+            bResult = FALSE;
+            goto done;
+        }
+    }
+
+    pServiceFailure = HeapAlloc(GetProcessHeap(), 0, cbBytesNeeded);
+    if (pServiceFailure == NULL)
+    {
+        SetLastError(ERROR_OUTOFMEMORY);
+        bResult = FALSE;
+        goto done;
+    }
+
+    if (!QueryServiceConfig2(hService,
+                             SERVICE_CONFIG_FAILURE_ACTIONS,
+                             (LPBYTE)pServiceFailure,
+                             cbBytesNeeded,
+                             &cbBytesNeeded))
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    _tprintf(_T("SERVICE_NAME: %s\n"), ServiceName);
+    _tprintf(_T("        RESET_PERIOD       : %lu seconds\n"), 
pServiceFailure->dwResetPeriod);
+    _tprintf(_T("        REBOOT_MESSAGE     : %s\n"), 
(pServiceFailure->lpRebootMsg) ? pServiceFailure->lpRebootMsg : _T(""));
+    _tprintf(_T("        COMMAND_LINE       : %s\n"), 
(pServiceFailure->lpCommand) ? pServiceFailure->lpCommand : _T(""));
+    _tprintf(_T("        FAILURE_ACTIONS    : "));
+    for (i = 0; i < pServiceFailure->cActions; i++)
+    {
+        if (i != 0)
+            _tprintf(_T("                             "));
+        switch (pServiceFailure->lpsaActions[i].Type)
+        {
+            case SC_ACTION_NONE:
+                continue;
+
+            case SC_ACTION_RESTART:
+                _tprintf(_T("RESTART -- Delay = %lu milliseconds.\n"), 
pServiceFailure->lpsaActions[i].Delay);
+                break;
+
+            case SC_ACTION_REBOOT:
+                _tprintf(_T("REBOOT -- Delay = %lu milliseconds.\n"), 
pServiceFailure->lpsaActions[i].Delay);
+                break;
+
+            case SC_ACTION_RUN_COMMAND:
+                _tprintf(_T("RUN_COMMAND -- Delay = %lu milliseconds.\n"), 
pServiceFailure->lpsaActions[i].Delay);
+                break;
+
+            default:
+                _tprintf(_T("\n"));
+                break;
+        }
+    }
+
+done:
+    if (bResult == FALSE)
+        ReportLastError();
+
+    if (pServiceFailure != NULL)
+        HeapFree(GetProcessHeap(), 0, pServiceFailure);
+
+    if (hService)
+        CloseServiceHandle(hService);
+
+    if (hManager)
+        CloseServiceHandle(hManager);
+
+    return bResult;
+}

Propchange: trunk/reactos/base/applications/sc/qfailure.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/base/applications/sc/sc.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/sc.c?rev=71615&r1=71614&r2=71615&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/sc.c     [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/sc.c     [iso-8859-1] Sat Jun 11 
21:24:40 2016
@@ -208,6 +208,42 @@
         else
             SdSetUsage();
     }
+    else if (!lstrcmpi(Command, _T("qc")))
+    {
+        if (ArgCount > 0)
+        {
+            ServiceName = *ServiceArgs++;
+            ArgCount--;
+
+            QueryConfig(ServiceName);
+        }
+        else
+            QueryConfigUsage();
+    }
+    else if (!lstrcmpi(Command, _T("qdescription")))
+    {
+        if (ArgCount > 0)
+        {
+            ServiceName = *ServiceArgs++;
+            ArgCount--;
+
+            QueryDescription(ServiceName);
+        }
+        else
+            QueryDescriptionUsage();
+    }
+    else if (!lstrcmpi(Command, _T("qfailure")))
+    {
+        if (ArgCount > 0)
+        {
+            ServiceName = *ServiceArgs++;
+            ArgCount--;
+
+            QueryFailure(ServiceName);
+        }
+        else
+            QueryFailureUsage();
+    }
     else
     {
         MainUsage();

Modified: trunk/reactos/base/applications/sc/sc.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/sc.h?rev=71615&r1=71614&r2=71615&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/sc.h     [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/sc.h     [iso-8859-1] Sat Jun 11 
21:24:40 2016
@@ -21,6 +21,9 @@
 LPSERVICE_STATUS_PROCESS QueryService(LPCTSTR ServiceName);
 BOOL SdShow(LPCTSTR ServiceName);
 BOOL SdSet(LPCTSTR ServiceName, LPCTSTR SecurityDescriptor);
+BOOL QueryConfig(LPCTSTR ServiceName);
+BOOL QueryDescription(LPCTSTR ServiceName);
+BOOL QueryFailure(LPCTSTR ServiceName);
 
 /* print and error functions */
 VOID PrintService(LPCTSTR ServiceName, LPSERVICE_STATUS_PROCESS pStatus, BOOL 
bExtended);
@@ -40,5 +43,8 @@
 VOID ControlUsage(VOID);
 VOID SdShowUsage(VOID);
 VOID SdSetUsage(VOID);
+VOID QueryConfigUsage(VOID);
+VOID QueryDescriptionUsage(VOID);
+VOID QueryFailureUsage(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.c?rev=71615&r1=71614&r2=71615&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/usage.c  [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/usage.c  [iso-8859-1] Sat Jun 11 
21:24:40 2016
@@ -36,9 +36,9 @@
 //    "\t  config         : Changes the configuration of a service 
(persistant).\n"
 //    "\t  description    : Changes the description of a service.\n"
 //    "\t  failure        : Changes the actions taken by a service upon 
failure.\n"
-//    "\t  qc             : Queries the configuration information for a 
service.\n"
-//    "\t  qdescription   : Queries the description for a service.\n"
-//    "\t  qfailure       : Queries the actions taken by a service upon 
failure.\n"
+    _T("\t  qc             : Queries the configuration information for a 
service.\n")
+    _T("\t  qdescription   : Queries the description for a service.\n")
+    _T("\t  qfailure       : Queries the actions taken by a service upon 
failure.\n")
     _T("\t  delete         : Deletes a service (from the registry).\n")
     _T("\t  create         : Creates a service. (adds it to the registry).\n")
     _T("\t  control        : Sends a control to a service.\n")
@@ -194,15 +194,39 @@
 VOID SdShowUsage(VOID)
 {
     _tprintf(_T("DESCRIPTION:\n")
-                _T("        Displays a service's security descriptor in SDDL 
format.\n")
-                _T("USAGE:\n")
-                _T("        sc <server> sdshow <service name>\n"));
+             _T("        Displays a service's security descriptor in SDDL 
format.\n")
+             _T("USAGE:\n")
+             _T("        sc <server> sdshow <service name>\n"));
 }
 
 VOID SdSetUsage(VOID)
 {
     _tprintf(_T("DESCRIPTION:\n")
-                _T("        Sets a service's security descriptor.\n")
-                _T("USAGE:\n")
-                _T("        sc <server> sdset <service name> <SD in SDDL 
format>\n"));
-}
+             _T("        Sets a service's security descriptor.\n")
+             _T("USAGE:\n")
+             _T("        sc <server> sdset <service name> <SD in SDDL 
format>\n"));
+}
+
+VOID QueryConfigUsage(VOID)
+{
+    _tprintf(_T("DESCRIPTION:\n")
+             _T("        Queries the configuration information for a 
service.\n")
+             _T("USAGE:\n")
+             _T("        sc <server> qc [service name] <bufferSize>\n"));
+}
+
+VOID QueryDescriptionUsage(VOID)
+{
+    _tprintf(_T("DESCRIPTION:\n")
+             _T("        Retrieves the description string of a service.\n")
+             _T("USAGE:\n")
+             _T("        sc <server> qdescription [service name] 
<bufferSize>\n"));
+}
+
+VOID QueryFailureUsage(VOID)
+{
+    _tprintf(_T("DESCRIPTION:\n")
+             _T("        Retrieves the actions performed on service 
failure.\n")
+             _T("USAGE:\n")
+             _T("        sc <server> qfailure [service name] <bufferSize>\n"));
+}


Reply via email to