From 21ffbe6393bf8d6d3b579788a7f53cdc751cb31e Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 28 Sep 2014 14:10:16 +0000 Subject: [PATCH 1/1] [SERVICES] Log service start, control and status change events. svn path=/trunk/; revision=64364 --- reactos/base/system/services/database.c | 32 ++++++++-- reactos/base/system/services/rpcserver.c | 79 +++++++++++++++++++++--- reactos/base/system/services/services.c | 7 ++- reactos/base/system/services/services.h | 4 +- 4 files changed, 104 insertions(+), 18 deletions(-) diff --git a/reactos/base/system/services/database.c b/reactos/base/system/services/database.c index e4202a7c856..4ae8473a2de 100644 --- a/reactos/base/system/services/database.c +++ b/reactos/base/system/services/database.c @@ -1456,6 +1456,19 @@ ScmWaitForServiceConnect(PSERVICE Service) return dwError; } } + else + { + if (dwProcessId != Service->lpImage->dwProcessId) + { +/* + LPWSTR Strings[3] + + ScmLogError(EVENT_SERVICE_DIFFERENT_PID_CONNECTED, + 3, + lpStrings); +*/ + } + } DPRINT("ScmWaitForServiceConnect() done\n"); @@ -1578,7 +1591,7 @@ ScmLoadService(PSERVICE Service, { PSERVICE_GROUP Group = Service->lpGroup; DWORD dwError = ERROR_SUCCESS; - LPCWSTR ErrorLogStrings[2]; + LPCWSTR lpErrorStrings[2]; WCHAR szErrorBuffer[32]; DPRINT("ScmLoadService() called\n"); @@ -1633,6 +1646,14 @@ ScmLoadService(PSERVICE Service, { Group->ServicesRunning = TRUE; } + + /* Log a successful service start */ + lpErrorStrings[0] = Service->lpDisplayName; + lpErrorStrings[1] = L"start"; + ScmLogEvent(EVENT_SERVICE_CONTROL_SUCCESS, + EVENTLOG_INFORMATION_TYPE, + 2, + lpErrorStrings); } else { @@ -1640,11 +1661,12 @@ ScmLoadService(PSERVICE Service, { /* Log a failed service start */ swprintf(szErrorBuffer, L"%lu", dwError); - ErrorLogStrings[0] = Service->lpServiceName; - ErrorLogStrings[1] = szErrorBuffer; - ScmLogError(EVENT_SERVICE_START_FAILED, + lpErrorStrings[0] = Service->lpServiceName; + lpErrorStrings[1] = szErrorBuffer; + ScmLogEvent(EVENT_SERVICE_START_FAILED, + EVENTLOG_ERROR_TYPE, 2, - ErrorLogStrings); + lpErrorStrings); } #if 0 diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 692628a29b8..08f53362b62 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -1085,6 +1085,7 @@ DWORD RControlService( DWORD dwControlsAccepted; DWORD dwCurrentState; HKEY hServicesKey = NULL; + LPCWSTR lpErrorStrings[2]; DPRINT("RControlService() called\n"); @@ -1242,6 +1243,39 @@ DWORD RControlService( sizeof(SERVICE_STATUS)); } + if (dwError == ERROR_SUCCESS) + { + if (dwControl != SERVICE_CONTROL_INTERROGATE) + { + /* Log a sucessful send control */ + lpErrorStrings[0] = lpService->lpDisplayName; + + switch(dwControl) + { + case SERVICE_CONTROL_STOP: + lpErrorStrings[1] = L"stop"; + break; + + case SERVICE_CONTROL_PAUSE: + lpErrorStrings[1] = L"pause"; + break; + + case SERVICE_CONTROL_CONTINUE: + lpErrorStrings[1] = L"continue"; + break; + + default: + lpErrorStrings[1] = L"other"; + break; + } + + ScmLogEvent(EVENT_SERVICE_CONTROL_SUCCESS, + EVENTLOG_INFORMATION_TYPE, + 2, + lpErrorStrings); + } + } + return dwError; } @@ -1691,20 +1725,47 @@ DWORD RSetServiceStatus( /* Unlock the service database */ ScmUnlockDatabase(); - /* Log a failed service stop */ if ((lpServiceStatus->dwCurrentState == SERVICE_STOPPED) && - (dwPreviousState != SERVICE_STOPPED)) + (dwPreviousState != SERVICE_STOPPED) && + (lpServiceStatus->dwWin32ExitCode != ERROR_SUCCESS)) + { + /* Log a failed service stop */ + swprintf(szErrorBuffer, L"%lu", lpServiceStatus->dwWin32ExitCode); + lpErrorStrings[0] = lpService->lpDisplayName; + lpErrorStrings[1] = szErrorBuffer; + + ScmLogEvent(EVENT_SERVICE_EXIT_FAILED, + EVENTLOG_ERROR_TYPE, + 2, + lpErrorStrings); + } + else if (lpServiceStatus->dwCurrentState != dwPreviousState && + (lpServiceStatus->dwCurrentState == SERVICE_STOPPED || + lpServiceStatus->dwCurrentState == SERVICE_RUNNING || + lpServiceStatus->dwCurrentState == SERVICE_PAUSED)) { - if (lpServiceStatus->dwWin32ExitCode != ERROR_SUCCESS) + /* Log a successful service status change */ + lpErrorStrings[0] = lpService->lpDisplayName; + + switch(lpServiceStatus->dwCurrentState) { - swprintf(szErrorBuffer, L"%lu", lpServiceStatus->dwWin32ExitCode); - lpErrorStrings[0] = lpService->lpDisplayName; - lpErrorStrings[1] = szErrorBuffer; + case SERVICE_STOPPED: + lpErrorStrings[1] = L"stopped"; + break; - ScmLogError(EVENT_SERVICE_EXIT_FAILED, - 2, - lpErrorStrings); + case SERVICE_RUNNING: + lpErrorStrings[1] = L"running"; + break; + + case SERVICE_PAUSED: + lpErrorStrings[1] = L"paused"; + break; } + + ScmLogEvent(EVENT_SERVICE_STATUS_SUCCESS, + EVENTLOG_INFORMATION_TYPE, + 2, + lpErrorStrings); } DPRINT("Set %S to %lu\n", lpService->lpDisplayName, lpService->Status.dwCurrentState); diff --git a/reactos/base/system/services/services.c b/reactos/base/system/services/services.c index a288baf5226..9290c5901ef 100644 --- a/reactos/base/system/services/services.c +++ b/reactos/base/system/services/services.c @@ -53,7 +53,8 @@ PrintString(LPCSTR fmt, ...) VOID -ScmLogError(DWORD dwEventId, +ScmLogEvent(DWORD dwEventId, + WORD wType, WORD wStrings, LPCWSTR *lpStrings) { @@ -68,10 +69,10 @@ ScmLogError(DWORD dwEventId, } if (!ReportEventW(hLog, - EVENTLOG_ERROR_TYPE, + wType, 0, dwEventId, - NULL, // Sid, + NULL, wStrings, 0, lpStrings, diff --git a/reactos/base/system/services/services.h b/reactos/base/system/services/services.h index 2eac8178db6..604e7e454d1 100644 --- a/reactos/base/system/services/services.h +++ b/reactos/base/system/services/services.h @@ -175,6 +175,7 @@ DWORD ScmSetServiceGroup(PSERVICE lpService, /* lock.c */ + DWORD ScmAcquireServiceStartLock(IN BOOL IsServiceController, OUT LPSC_RPC_LOCK lpLock); DWORD ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock); @@ -190,7 +191,8 @@ VOID ScmStartRpcServer(VOID); /* services.c */ VOID PrintString(LPCSTR fmt, ...); -VOID ScmLogError(DWORD dwEventId, +VOID ScmLogEvent(DWORD dwEventId, + WORD wType, WORD wStrings, LPCWSTR *lpStrings); VOID ScmWaitForLsa(VOID); -- 2.17.1