Failure command:
- Parse the actions parameter.
- Adjust the shutdown privilege in order to set the failure actions.

svn path=/trunk/; revision=71772
This commit is contained in:
Eric Kohl
2016-07-03 08:56:43 +00:00
parent f4bbaca31f
commit 7507c1b2fc
4 changed files with 118 additions and 3 deletions
+1 -1
View File
@@ -22,6 +22,6 @@ list(APPEND SOURCE
add_executable(sc ${SOURCE} sc.rc)
set_module_type(sc win32cui UNICODE)
add_importlibs(sc advapi32 msvcrt kernel32)
add_importlibs(sc advapi32 msvcrt kernel32 ntdll)
add_pch(sc sc.h SOURCE)
add_cd_file(TARGET sc DESTINATION reactos/system32 FOR all)
+11 -1
View File
@@ -126,6 +126,9 @@ SetFailure(
BOOL bResult = TRUE;
SERVICE_FAILURE_ACTIONS FailureActions;
LPCTSTR lpServiceName = NULL;
BOOLEAN Old = FALSE;
ZeroMemory(&FailureActions, sizeof(SERVICE_FAILURE_ACTIONS));
if (!ParseFailureArguments(ServiceArgs, ArgCount, &lpServiceName, &FailureActions))
{
@@ -145,7 +148,7 @@ SetFailure(
hService = OpenService(hManager,
lpServiceName,
SERVICE_CHANGE_CONFIG);
SERVICE_CHANGE_CONFIG | SERVICE_START);
if (hService == NULL)
{
_tprintf(_T("[SC] OpenService FAILED %lu:\n\n"), GetLastError());
@@ -153,6 +156,8 @@ SetFailure(
goto done;
}
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &Old);
if (!ChangeServiceConfig2(hService,
SERVICE_CONFIG_FAILURE_ACTIONS,
(LPBYTE)&FailureActions))
@@ -165,9 +170,14 @@ SetFailure(
_tprintf(_T("[SC] ChangeServiceConfig2 SUCCESS\n\n"));
done:
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, Old, FALSE, &Old);
if (bResult == FALSE)
ReportLastError();
if (FailureActions.lpsaActions != NULL)
HeapFree(GetProcessHeap(), 0, FailureActions.lpsaActions);
if (hService)
CloseServiceHandle(hService);
+101 -1
View File
@@ -160,6 +160,101 @@ ParseCreateConfigArguments(
}
BOOL
ParseFailureActions(
IN LPCTSTR lpActions,
OUT DWORD *pcActions,
OUT SC_ACTION **ppActions)
{
SC_ACTION *pActions = NULL;
LPTSTR pStringBuffer = NULL;
LPTSTR p;
INT nLength;
INT nCount = 0;
*pcActions = 0;
*ppActions = NULL;
nLength = _tcslen(lpActions);
/* Allocate the string buffer */
pStringBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 2) * sizeof(TCHAR));
if (pStringBuffer == NULL)
{
return FALSE;
}
/* Copy the actions string into the string buffer */
CopyMemory(pStringBuffer, lpActions, nLength * sizeof(TCHAR));
/* Replace all slashes by null characters */
p = pStringBuffer;
while (*p != 0 /*_T('\0')*/)
{
if (*p == _T('/'))
*p = 0; //_T('\0');
p++;
}
/* Count the arguments in the buffer */
p = pStringBuffer;
while (*p != 0 /*_T('\0')*/)
{
nCount++;
nLength = _tcslen(p);
p = (LPTSTR)((LONG_PTR)p + ((nLength + 1) * sizeof(TCHAR)));
}
/* Allocate the actions buffer */
pActions = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nCount / 2 * sizeof(SC_ACTION));
if (pActions == NULL)
{
HeapFree(GetProcessHeap(), 0, pStringBuffer);
return FALSE;
}
/* Parse the string buffer */
nCount = 0;
p = pStringBuffer;
while (*p != _T('\0'))
{
nLength = _tcslen(p);
if (nCount % 2 == 0)
{
/* Action */
if (_tcsicmp(p, _T("reboot")))
pActions[nCount / 2].Type = SC_ACTION_REBOOT;
else if (_tcsicmp(p, _T("restart")))
pActions[nCount / 2].Type = SC_ACTION_RESTART;
else if (_tcsicmp(p, _T("run")))
pActions[nCount / 2].Type = SC_ACTION_RUN_COMMAND;
else
break;
}
else
{
/* Delay */
pActions[nCount / 2].Delay = _tcstoul(p, NULL, 10);
if (pActions[nCount / 2].Delay == 0 && errno == ERANGE)
break;
}
p = (LPTSTR)((LONG_PTR)p + ((nLength + 1) * sizeof(TCHAR)));
nCount++;
}
/* Free the string buffer */
HeapFree(GetProcessHeap(), 0, pStringBuffer);
*pcActions = nCount / 2;
*ppActions = pActions;
return TRUE;
}
BOOL
ParseFailureArguments(
IN LPCTSTR *ServiceArgs,
@@ -220,7 +315,12 @@ ParseFailureArguments(
if (lpActions != NULL)
{
/* FIXME */
if (!ParseFailureActions(lpActions,
&pFailureActions->cActions,
&pFailureActions->lpsaActions))
{
return FALSE;
}
}
return (ArgCount == 0);
+5
View File
@@ -3,12 +3,17 @@
#include <stdarg.h>
#define WIN32_NO_STATUS
#include <windef.h>
#include <winbase.h>
#include <winsvc.h>
#include <sddl.h>
#include <tchar.h>
#include <ndk/rtlfuncs.h>
#include <ndk/setypes.h>
#define SCDBG
typedef struct