[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/5] Replace RegisterEventSource with TraceLoggingRegister



- Added TraceLogging levels for Information and Error events.
- Replaced RegisterEventSource due to potential security issues.

Signed-off-by: david ambu <david.preetham@xxxxxxxxx>

* defined seperate macros for Info and Error logging
* use a switch on log level, rather than if/else

Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
 src/monitor/monitor.c | 290 ++++++++++++++++++++++--------------------
 1 file changed, 150 insertions(+), 140 deletions(-)

diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 77d7dd8..a9b69f3 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -40,6 +40,8 @@
 #include <powrprof.h>
 #include <malloc.h>
 #include <assert.h>
+#include <TraceLoggingProvider.h>
+#include <winmeta.h>
 
 #include <version.h>
 
@@ -56,7 +58,6 @@ typedef struct _MONITOR_CONTEXT {
     SERVICE_STATUS          Status;
     SERVICE_STATUS_HANDLE   Service;
     HKEY                    ParametersKey;
-    HANDLE                  EventLog;
     HANDLE                  StopEvent;
     HANDLE                  RequestEvent;
     HANDLE                  Timer;
@@ -96,17 +97,25 @@ MONITOR_CONTEXT MonitorContext;
 #define STORAGE_CLASS_GUID \
         "{4d36e97b-e325-11ce-bfc1-08002be10318}"
 
+TRACELOGGING_DEFINE_PROVIDER(g_xenbus_monitor,
+                             MONITOR_NAME,
+                             //{E8ADEEB7-6DD1-447E-A49B-A6571CC74039}
+                             (0xe8adeeb7, 0x6dd1, 0x447e, 0xa4, 0x9b, 0xa6, 
0x57, 0x1c, 0xc7, 0x40, 0x39)
+                            );
+
+typedef enum {
+    LOG_INFO,
+    LOG_ERROR
+} LOG_LEVEL;
+
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds 
/analyze:stacksize'1024'
 __Log(
+    _In_ LOG_LEVEL      Level,
     _In_ PCSTR          Format,
     ...
     )
 {
-#if DBG
-    PMONITOR_CONTEXT    Context = &MonitorContext;
-    const TCHAR         *Strings[1];
-#endif
     TCHAR               Buffer[MAXIMUM_BUFFER_SIZE];
     va_list             Arguments;
     size_t              Length;
@@ -133,24 +142,31 @@ __Log(
 
     OutputDebugString(Buffer);
 
-#if DBG
-    Strings[0] = Buffer;
-
-    if (Context->EventLog != NULL)
-        ReportEvent(Context->EventLog,
-                    EVENTLOG_INFORMATION_TYPE,
-                    0,
-                    MONITOR_LOG,
-                    NULL,
-                    ARRAYSIZE(Strings),
-                    0,
-                    Strings,
-                    NULL);
-#endif
+    switch (Level) {
+    case LOG_INFO:
+        TraceLoggingWrite(g_xenbus_monitor,
+            "Information",
+            TraceLoggingLevel(WINEVENT_LEVEL_INFO),
+            TraceLoggingString(Buffer, "Info")
+        );
+        break;
+    case LOG_ERROR:
+        TraceLoggingWrite(g_xenbus_monitor,
+            "Error",
+            TraceLoggingLevel(WINEVENT_LEVEL_ERROR),
+            TraceLoggingString(Buffer, "Error")
+        );
+        break;
+    default:
+        break;
+    }
 }
 
-#define Log(_Format, ...) \
-        __Log(__MODULE__ "|" __FUNCTION__ ": " _Format, __VA_ARGS__)
+#define LogInfo(_Format, ...) \
+        __Log(LOG_INFO, __MODULE__ "|" __FUNCTION__ ": " _Format, __VA_ARGS__)
+
+#define LogError(_Format, ...) \
+        __Log(LOG_ERROR, __MODULE__ "|" __FUNCTION__ ": " _Format, __VA_ARGS__)
 
 static PTSTR
 GetErrorMessage(
@@ -215,7 +231,7 @@ ReportStatus(
     BOOL                Success;
     HRESULT             Error;
 
-    Log("====> (%s)", ServiceStateName(CurrentState));
+    LogInfo("====> (%s)", ServiceStateName(CurrentState));
 
     Context->Status.dwCurrentState = CurrentState;
     Context->Status.dwWin32ExitCode = Win32ExitCode;
@@ -239,7 +255,7 @@ ReportStatus(
     if (!Success)
         goto fail1;
 
-    Log("<====");
+    LogInfo("<====");
 
     return;
 
@@ -249,7 +265,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 }
@@ -326,11 +342,11 @@ DoReboot(
     _In_ DWORD  Timeout
     )
 {
-    Log("waiting for pending install events...");
+    LogInfo("waiting for pending install events...");
 
     (VOID) CM_WaitNoPendingInstallEvents(INFINITE);
 
-    Log("initiating shutdown...");
+    LogInfo("initiating shutdown...");
 
 #pragma prefast(suppress:28159)
     (VOID) InitiateSystemShutdownEx(NULL,
@@ -366,7 +382,7 @@ GetPromptTimeout(
         Type != REG_DWORD)
         Value = 0;
 
-    Log("%u", Value);
+    LogInfo("%u", Value);
 
     return Value;
 }
@@ -445,18 +461,18 @@ GetDisplayName(
     return DisplayName;
 
 fail5:
-    Log("fail5");
+    LogError("fail5");
 
 fail4:
-    Log("fail4");
+    LogError("fail4");
 
     free(DisplayName);
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
     RegCloseKey(ServiceKey);
 
@@ -466,7 +482,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -531,7 +547,7 @@ DoPromptForReboot(
         WTS_CONNECTSTATE_CLASS  State = SessionInfo[Index].State;
         DWORD                   Response;
 
-        Log("[%u]: %s [%s]",
+        LogInfo("[%u]: %s [%s]",
             SessionId,
             Name,
             WTSStateName(State));
@@ -565,7 +581,7 @@ DoPromptForReboot(
     return ERROR_SUCCESS;
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
     *Prompt->PResponse = 0;
 
 fail1:
@@ -598,7 +614,7 @@ PromptForReboot(
         return;
     Context->RebootPrompted = TRUE;
 
-    Log("====> (%s)", DriverName);
+    LogInfo("====> (%s)", DriverName);
 
     Prompt = calloc(1, sizeof (REBOOT_PROMPT));
     if (Prompt == NULL) {
@@ -665,20 +681,20 @@ PromptForReboot(
     return;
 
 fail4:
-    Log("fail4");
+    LogError("fail4");
     free(DisplayName);
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -772,7 +788,7 @@ TryAutoReboot(
     if (RebootCount >= AutoReboot)
         goto prompt;
 
-    Log("AutoRebooting (reboot %u of %u)\n",
+    LogInfo("AutoRebooting (reboot %u of %u)\n",
         RebootCount,
         AutoReboot);
 
@@ -844,18 +860,18 @@ done:
     return;
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     free(DisplayName);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -878,7 +894,7 @@ RegEnumSubKeys(
     DWORD               Index;
     HRESULT             Error;
 
-    Log("====>");
+    LogInfo("====>");
 
     Error = RegQueryInfoKey(BaseKey,
                             NULL,
@@ -920,7 +936,7 @@ RegEnumSubKeys(
             goto fail3;
         }
 
-        Log("%s", SubKeyName);
+        LogInfo("%s", SubKeyName);
 
         if (!Callback(BaseKey, SubKeyName, Context))
             break;
@@ -931,12 +947,12 @@ RegEnumSubKeys(
     return ERROR_SUCCESS;
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     free(SubKeyName);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
     Error = GetLastError();
@@ -944,7 +960,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -1008,7 +1024,7 @@ CheckRequestSubKeys(
     BOOLEAN             Found;
     HRESULT             Error;
 
-    Log("====>");
+    LogInfo("====>");
 
     Found = FALSE;
 
@@ -1025,7 +1041,7 @@ CheckRequestSubKeys(
             (VOID) RegFlushKey(Context->ParametersKey);
     }
 
-    Log("<====");
+    LogInfo("<====");
 
     return;
 
@@ -1035,7 +1051,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 }
@@ -1048,7 +1064,7 @@ CheckRequestKey(
     PMONITOR_CONTEXT    Context = &MonitorContext;
     HRESULT             Error;
 
-    Log("====>");
+    LogInfo("====>");
 
     CheckRequestSubKeys();
 
@@ -1061,7 +1077,7 @@ CheckRequestKey(
     if (Error != ERROR_SUCCESS)
         goto fail1;
 
-    Log("<====");
+    LogInfo("<====");
 
     return;
 
@@ -1071,7 +1087,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 }
@@ -1086,7 +1102,7 @@ AcquireShutdownPrivilege(
     BOOL                Success;
     HRESULT             Error;
 
-    Log("====>");
+    LogInfo("====>");
 
     New.PrivilegeCount = 1;
 
@@ -1118,17 +1134,17 @@ AcquireShutdownPrivilege(
 
     CloseHandle(Token);
 
-    Log("<====");
+    LogInfo("<====");
 
     return TRUE;
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     CloseHandle(Token);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
     Error = GetLastError();
@@ -1136,7 +1152,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -1194,20 +1210,20 @@ GetRequestKeyName(
         goto fail4;
     }
 
-    Log("%s", *RequestKeyName);
+    LogInfo("%s", *RequestKeyName);
 
     return TRUE;
 
 fail4:
-    Log("fail4");
+    LogError("fail4");
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     free(*RequestKeyName);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
     Error = GetLastError();
@@ -1215,7 +1231,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -1321,37 +1337,37 @@ GetDialogParameters(
     return TRUE;
 
 fail10:
-    Log("fail10");
+    LogError("fail10");
 
 fail9:
-    Log("fail9");
+    LogError("fail9");
 
     free(Context->Question);
 
 fail8:
-    Log("fail8");
+    LogError("fail8");
 
 fail7:
-    Log("fail7");
+    LogError("fail7");
 
 fail6:
-    Log("fail6");
+    LogError("fail6");
 
     free(Context->Text);
 
 fail5:
-    Log("fail5");
+    LogError("fail5");
 
 fail4:
-    Log("fail4");
+    LogError("fail4");
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     free(Context->Title);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
     Error = GetLastError();
@@ -1359,7 +1375,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -1392,7 +1408,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -1494,24 +1510,24 @@ done:
     return TRUE;
 
 fail6:
-    Log("fail6");
+    LogError("fail6");
 
 fail5:
-    Log("fail5");
+    LogError("fail5");
 
 fail4:
-    Log("fail4");
+    LogError("fail4");
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     free(Value);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
-    Log("fail1");
+    LogError("fail1");
 
     return TRUE;
 }
@@ -1574,10 +1590,10 @@ RemoveAllStartOverrides(
     return TRUE;
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
-    Log("fail1");
+    LogError("fail1");
 
     return FALSE;
 }
@@ -1597,7 +1613,10 @@ MonitorMain(
     UNREFERENCED_PARAMETER(argc);
     UNREFERENCED_PARAMETER(argv);
 
-    Log("====>");
+    if (TraceLoggingRegister(g_xenbus_monitor) != ERROR_SUCCESS)
+        LogInfo("TraceLoggingRegister failed");
+
+    LogInfo("====>");
 
     (VOID) RemoveStartOverride("stornvme");
     (VOID) RemoveAllStartOverrides();
@@ -1620,11 +1639,6 @@ MonitorMain(
     if (Context->Service == NULL)
         goto fail3;
 
-    Context->EventLog = RegisterEventSource(NULL,
-                                            MONITOR_NAME);
-    if (Context->EventLog == NULL)
-        goto fail4;
-
     Context->Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
     Context->Status.dwServiceSpecificExitCode = 0;
 
@@ -1636,26 +1650,26 @@ MonitorMain(
                                      NULL);
 
     if (Context->StopEvent == NULL)
-        goto fail5;
+        goto fail4;
 
     Context->RequestEvent = CreateEvent(NULL,
                                         TRUE,
                                         FALSE,
                                         NULL);
     if (Context->RequestEvent == NULL)
-        goto fail6;
+        goto fail5;
 
     Context->ResponseEvent = CreateEvent(NULL,
                                          FALSE,
                                          FALSE,
                                          NULL);
     if (Context->ResponseEvent == NULL)
-        goto fail7;
+        goto fail6;
     Context->Response = 0;
 
     Success = GetRequestKeyName(&RequestKeyName);
     if (!Success)
-        goto fail8;
+        goto fail7;
 
     Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                            RequestKeyName,
@@ -1667,15 +1681,15 @@ MonitorMain(
                            &Context->RequestKey,
                            NULL);
     if (Error != ERROR_SUCCESS)
-        goto fail9;
+        goto fail8;
 
     Success = GetDialogParameters();
     if (!Success)
-        goto fail10;
+        goto fail9;
 
     Context->Timer = CreateWaitableTimer(NULL, FALSE, NULL);
     if (Context->Timer == NULL)
-        goto fail11;
+        goto fail10;
 
     DueTime.QuadPart = -10000LL * REBOOT_RETRY_DELAY;
 
@@ -1686,7 +1700,7 @@ MonitorMain(
                                NULL,
                                FALSE);
     if (!Success)
-        goto fail12;
+        goto fail11;
 
     SetEvent(Context->RequestEvent);
 
@@ -1701,12 +1715,12 @@ MonitorMain(
         Events[2] = Context->ResponseEvent;
         Events[3] = Context->Timer;
 
-        Log("waiting (%u)...", ARRAYSIZE(Events));
+        LogInfo("waiting (%u)...", ARRAYSIZE(Events));
         Object = WaitForMultipleObjects(ARRAYSIZE(Events),
                                         Events,
                                         FALSE,
                                         INFINITE);
-        Log("awake");
+        LogInfo("awake");
 
         switch (Object) {
         case WAIT_OBJECT_0:
@@ -1752,65 +1766,59 @@ done:
 
     ReportStatus(SERVICE_STOPPED, NO_ERROR, 0);
 
-    (VOID) DeregisterEventSource(Context->EventLog);
-
     RegCloseKey(Context->ParametersKey);
 
     (VOID) RemoveStartOverride("stornvme");
     (VOID) RemoveAllStartOverrides();
 
-    Log("<====");
+    LogInfo("<====");
 
+    TraceLoggingUnregister(g_xenbus_monitor);
     return;
 
-fail12:
-    Log("fail12");
+fail11:
+    LogError("fail11");
 
     CloseHandle(Context->Timer);
 
-fail11:
-    Log("fail11");
-
 fail10:
-    Log("fail10");
-
-    RegCloseKey(Context->RequestKey);
+    LogError("fail10");
 
 fail9:
-    Log("fail9");
+    LogError("fail9");
 
-    free(RequestKeyName);
+    RegCloseKey(Context->RequestKey);
 
 fail8:
-    Log("fail8");
+    LogError("fail8");
 
-    CloseHandle(Context->ResponseEvent);
+    free(RequestKeyName);
 
 fail7:
-    Log("fail7");
+    LogError("fail7");
 
-    CloseHandle(Context->RequestEvent);
+    CloseHandle(Context->ResponseEvent);
 
 fail6:
-    Log("fail6");
+    LogError("fail6");
 
-    CloseHandle(Context->StopEvent);
+    CloseHandle(Context->RequestEvent);
 
 fail5:
-    Log("fail5");
+    LogError("fail5");
 
-    ReportStatus(SERVICE_STOPPED, GetLastError(), 0);
-
-    (VOID) DeregisterEventSource(Context->EventLog);
+    CloseHandle(Context->StopEvent);
 
 fail4:
-    Log("fail4");
+    LogError("fail4");
+
+    ReportStatus(SERVICE_STOPPED, GetLastError(), 0);
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
     RegCloseKey(Context->ParametersKey);
 
@@ -1820,9 +1828,11 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
+
+    TraceLoggingUnregister(g_xenbus_monitor);
 }
 
 static BOOL
@@ -1835,7 +1845,7 @@ MonitorCreate(
     TCHAR       Path[MAX_PATH];
     HRESULT     Error;
 
-    Log("====>");
+    LogInfo("====>");
 
     if(!GetModuleFileName(NULL, Path, MAX_PATH))
         goto fail1;
@@ -1867,17 +1877,17 @@ MonitorCreate(
     CloseServiceHandle(Service);
     CloseServiceHandle(SCManager);
 
-    Log("<====");
+    LogInfo("<====");
 
     return TRUE;
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     CloseServiceHandle(SCManager);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
 fail1:
     Error = GetLastError();
@@ -1885,7 +1895,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -1903,7 +1913,7 @@ MonitorDelete(
     SERVICE_STATUS      Status;
     HRESULT             Error;
 
-    Log("====>");
+    LogInfo("====>");
 
     SCManager = OpenSCManager(NULL,
                               NULL,
@@ -1934,20 +1944,20 @@ MonitorDelete(
     CloseServiceHandle(Service);
     CloseServiceHandle(SCManager);
 
-    Log("<====");
+    LogInfo("<====");
 
     return TRUE;
 
 fail4:
-    Log("fail4");
+    LogError("fail4");
 
 fail3:
-    Log("fail3");
+    LogError("fail3");
 
     CloseServiceHandle(Service);
 
 fail2:
-    Log("fail2");
+    LogError("fail2");
 
     CloseServiceHandle(SCManager);
 
@@ -1957,7 +1967,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
@@ -1975,14 +1985,14 @@ MonitorEntry(
     };
     HRESULT             Error;
 
-    Log("%s (%s) ====>",
+    LogInfo("%s (%s) ====>",
         MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." 
BUILD_NUMBER_STR,
         DAY_STR "/" MONTH_STR "/" YEAR_STR);
 
     if (!StartServiceCtrlDispatcher(Table))
         goto fail1;
 
-    Log("%s (%s) <====",
+    LogInfo("%s (%s) <====",
         MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." 
BUILD_NUMBER_STR,
         DAY_STR "/" MONTH_STR "/" YEAR_STR);
 
@@ -1994,7 +2004,7 @@ fail1:
     {
         PTSTR   Message;
         Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
+        LogError("fail1 (%s)", Message);
         LocalFree(Message);
     }
 
-- 
2.51.2.windows.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.