https://git.reactos.org/?p=reactos.git;a=commitdiff;h=eb2934df0e721b734dd337025724b426fea970af

commit eb2934df0e721b734dd337025724b426fea970af
Author:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
AuthorDate: Thu Apr 12 02:32:37 2018 +0200
Commit:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
CommitDate: Thu Apr 12 02:32:37 2018 +0200

    [EVENTVWR] Enhancements to the event log viewer.
    
    - Initialize hwndMainWindow as it can be used before it is properly
      initialized with an existing window handle.
    - Transform ShowLastWin32Error() to a more generic ShowWin32Error().
    - Use iswdigit() instead of isdigit().
    - Add extra heap buffer cleanup.
    - Split OpenUserEventLog() in two: OpenUserEventLog() that displays
      an open-file dialog, and OpenUserEventLogFile() that does the real
      work of allocating internal structures and opening the log file using
      the event-log service. We also check that the file really exists
      before proceeding further.
    - Force treeview repaint when *children* items are inserted, because
      otherwise the expand/collapse buttons do not display next to parent
      items (this problem happens on Windows too).
    - Reshuffle the resource string IDs.
---
 base/applications/mscutils/eventvwr/eventvwr.c | 153 +++++++++++++++----------
 base/applications/mscutils/eventvwr/resource.h |  62 +++++-----
 2 files changed, 124 insertions(+), 91 deletions(-)

diff --git a/base/applications/mscutils/eventvwr/eventvwr.c 
b/base/applications/mscutils/eventvwr/eventvwr.c
index 53838f8022..c184bb2a6a 100644
--- a/base/applications/mscutils/eventvwr/eventvwr.c
+++ b/base/applications/mscutils/eventvwr/eventvwr.c
@@ -77,7 +77,7 @@ BYTE bSplit = 0;                            /* Splitter state:
                                              * 2: Horizontal splitting.
                                              */
 
-HWND hwndMainWindow;                        /* Main window */
+HWND hwndMainWindow = NULL;                 /* Main window */
 HWND hwndTreeView;                          /* TreeView control */
 HWND hwndListView;                          /* ListView control */          // 
NOTE: Used by evtdetctl.c
 HWND hwndEventDetails;                      /* Event details pane */
@@ -90,7 +90,7 @@ HTREEITEM htiSystemLogs = NULL, htiAppLogs = NULL, 
htiUserLogs = NULL;
 
 /* Global event records cache for the current active event log filter */
 DWORD g_TotalRecords = 0;
-PEVENTLOGRECORD *g_RecordPtrs = NULL;
+PEVENTLOGRECORD* g_RecordPtrs = NULL;
 
 /* Lists of event logs and event log filters */
 LIST_ENTRY EventLogList;
@@ -129,6 +129,32 @@ INT_PTR EventLogProperties(HINSTANCE, HWND, 
PEVENTLOGFILTER);
 INT_PTR CALLBACK EventDetails(HWND, UINT, WPARAM, LPARAM);
 
 
+/* MAIN FUNCTIONS 
*************************************************************/
+
+VOID
+ShowWin32Error(IN DWORD dwError)
+{
+    LPWSTR lpMessageBuffer;
+
+    if (dwError == ERROR_SUCCESS)
+        return;
+
+    if (!FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                        FORMAT_MESSAGE_FROM_SYSTEM |
+                        FORMAT_MESSAGE_IGNORE_INSERTS,
+                        NULL,
+                        dwError,
+                        LANG_USER_DEFAULT,
+                        (LPWSTR)&lpMessageBuffer,
+                        0, NULL))
+    {
+        return;
+    }
+
+    MessageBoxW(hwndMainWindow, lpMessageBuffer, szTitle, MB_OK | 
MB_ICONERROR);
+    LocalFree(lpMessageBuffer);
+}
+
 int APIENTRY
 wWinMain(HINSTANCE hInstance,
          HINSTANCE hPrevInstance,
@@ -158,6 +184,9 @@ wWinMain(HINSTANCE hInstance,
 
     msg.wParam = (WPARAM)-1;
 
+    /* Store the instance handle in the global variable */
+    hInst = hInstance;
+
     /* Initialize global strings */
     LoadStringW(hInstance, IDS_APP_TITLE, szTitle, ARRAYSIZE(szTitle));
     LoadStringW(hInstance, IDS_APP_TITLE_EX, szTitleTemplate, 
ARRAYSIZE(szTitleTemplate));
@@ -235,32 +264,6 @@ Quit:
 
 /* GENERIC HELPER FUNCTIONS 
***************************************************/
 
-VOID
-ShowLastWin32Error(VOID)
-{
-    DWORD dwError;
-    LPWSTR lpMessageBuffer;
-
-    dwError = GetLastError();
-    if (dwError == ERROR_SUCCESS)
-        return;
-
-    if (!FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-                        FORMAT_MESSAGE_FROM_SYSTEM |
-                        FORMAT_MESSAGE_IGNORE_INSERTS,
-                        NULL,
-                        dwError,
-                        LANG_USER_DEFAULT,
-                        (LPWSTR)&lpMessageBuffer,
-                        0, NULL))
-    {
-        return;
-    }
-
-    MessageBoxW(hwndMainWindow, lpMessageBuffer, szTitle, MB_OK | 
MB_ICONERROR);
-    LocalFree(lpMessageBuffer);
-}
-
 VOID
 EventTimeToSystemTime(IN DWORD EventTime,
                       OUT PSYSTEMTIME pSystemTime)
@@ -475,10 +478,10 @@ ApplyParameterStringsToMessage(
         while ((pTempMessage = wcschr(pTempMessage, L'%')))
         {
             pTempMessage++;
-            if (isdigit(*pTempMessage))
+            if (iswdigit(*pTempMessage))
             {
                 dwParamCount++;
-                while (isdigit(*++pTempMessage)) ;
+                while (iswdigit(*++pTempMessage)) ;
             }
         }
     }
@@ -487,10 +490,10 @@ ApplyParameterStringsToMessage(
         while ((pTempMessage = wcsstr(pTempMessage, L"%%")))
         {
             pTempMessage += 2;
-            if (isdigit(*pTempMessage))
+            if (iswdigit(*pTempMessage))
             {
                 dwParamCount++;
-                while (isdigit(*++pTempMessage)) ;
+                while (iswdigit(*++pTempMessage)) ;
             }
         }
     }
@@ -520,12 +523,12 @@ ApplyParameterStringsToMessage(
         while ((pTempMessage = wcschr(pTempMessage, L'%')) && (i < 
dwParamCount))
         {
             pTempMessage++;
-            if (isdigit(*pTempMessage))
+            if (iswdigit(*pTempMessage))
             {
                 pParamData[i].pStartingAddress = pTempMessage-1;
                 pParamData[i].pParameterID = (DWORD)_wtol(pTempMessage);
 
-                while (isdigit(*++pTempMessage)) ;
+                while (iswdigit(*++pTempMessage)) ;
 
                 pParamData[i].pEndingAddress = pTempMessage;
                 i++;
@@ -537,12 +540,12 @@ ApplyParameterStringsToMessage(
         while ((pTempMessage = wcsstr(pTempMessage, L"%%")) && (i < 
dwParamCount))
         {
             pTempMessage += 2;
-            if (isdigit(*pTempMessage))
+            if (iswdigit(*pTempMessage))
             {
                 pParamData[i].pStartingAddress = pTempMessage-2;
                 pParamData[i].pParameterID = (DWORD)_wtol(pTempMessage);
 
-                while (isdigit(*++pTempMessage)) ;
+                while (iswdigit(*++pTempMessage)) ;
 
                 pParamData[i].pEndingAddress = pTempMessage;
                 i++;
@@ -847,6 +850,8 @@ AllocEventLog(IN PCWSTR ComputerName OPTIONAL,
     EventLog->LogName = HeapAlloc(GetProcessHeap(), 0, cchName * 
sizeof(WCHAR));
     if (!EventLog->LogName)
     {
+        if (EventLog->ComputerName)
+            HeapFree(GetProcessHeap(), 0, EventLog->ComputerName);
         HeapFree(GetProcessHeap(), 0, EventLog);
         return NULL;
     }
@@ -863,6 +868,9 @@ EventLog_Free(IN PEVENTLOG EventLog)
     if (EventLog->LogName)
         HeapFree(GetProcessHeap(), 0, EventLog->LogName);
 
+    if (EventLog->ComputerName)
+        HeapFree(GetProcessHeap(), 0, EventLog->ComputerName);
+
     if (EventLog->FileName)
         HeapFree(GetProcessHeap(), 0, EventLog->FileName);
 
@@ -1164,7 +1172,7 @@ GetEventMessage(IN LPCWSTR KeyName,
         lpMsgBuf = szMessage;
         while ((lpMsgBuf = wcsstr(lpMsgBuf, L"%%")))
         {
-            if (isdigit(lpMsgBuf[2]))
+            if (iswdigit(lpMsgBuf[2]))
             {
                 RtlMoveMemory(lpMsgBuf, lpMsgBuf+1, ((szStringArray + cch) - 
lpMsgBuf - 1) * sizeof(WCHAR));
             }
@@ -1493,7 +1501,7 @@ EnumEventsThread(IN LPVOID lpParameter)
 
     if (hEventLog == NULL)
     {
-        ShowLastWin32Error();
+        ShowWin32Error(GetLastError());
         goto Cleanup;
     }
 
@@ -1517,7 +1525,7 @@ EnumEventsThread(IN LPVOID lpParameter)
     g_RecordPtrs = HeapAlloc(hProcessHeap, HEAP_ZERO_MEMORY, dwTotalRecords * 
sizeof(*g_RecordPtrs));
     if (!g_RecordPtrs)
     {
-        // ShowLastWin32Error();
+        // ShowWin32Error(GetLastError());
         goto Quit;
     }
     g_TotalRecords = dwTotalRecords;
@@ -1890,26 +1898,31 @@ GetSelectedFilter(OUT HTREEITEM* phti OPTIONAL)
 
 
 VOID
-OpenUserEventLog(VOID)
+OpenUserEventLogFile(IN LPCWSTR lpszFileName)
 {
+    WIN32_FIND_DATAW FindData;
+    HANDLE hFind;
     PEVENTLOG EventLog;
     PEVENTLOGFILTER EventLogFilter;
+    SIZE_T cchFileName;
     HTREEITEM hItem = NULL;
-    WCHAR szFileName[MAX_PATH];
 
-    ZeroMemory(szFileName, sizeof(szFileName));
-
-    sfn.lpstrFile = szFileName;
-    sfn.nMaxFile  = ARRAYSIZE(szFileName);
-
-    if (!GetOpenFileNameW(&sfn))
+    /* Check whether the file actually exists */
+    hFind = FindFirstFileW(lpszFileName, &FindData);
+    if (hFind == INVALID_HANDLE_VALUE)
+    {
+        ShowWin32Error(GetLastError());
         return;
-    sfn.lpstrFile[sfn.nMaxFile-1] = UNICODE_NULL;
+    }
+    FindClose(hFind);
 
     /* Allocate a new event log entry */
-    EventLog = AllocEventLog(NULL, sfn.lpstrFile, FALSE);
+    EventLog = AllocEventLog(NULL, lpszFileName, FALSE);
     if (EventLog == NULL)
+    {
+        ShowWin32Error(ERROR_NOT_ENOUGH_MEMORY);
         return;
+    }
 
     /* Allocate a new event log filter entry for this event log */
     EventLogFilter = AllocEventLogFilter(// LogName,
@@ -1918,7 +1931,8 @@ OpenUserEventLog(VOID)
                                          1, &EventLog);
     if (EventLogFilter == NULL)
     {
-        HeapFree(GetProcessHeap(), 0, EventLog);
+        ShowWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+        EventLog_Free(EventLog);
         return;
     }
 
@@ -1927,12 +1941,13 @@ OpenUserEventLog(VOID)
     InsertTailList(&EventLogFilterList, &EventLogFilter->ListEntry);
 
     /* Retrieve and cache the event log file */
-    EventLog->FileName = HeapAlloc(GetProcessHeap(), 0, sfn.nMaxFile * 
sizeof(WCHAR));
+    cchFileName = wcslen(lpszFileName) + 1;
+    EventLog->FileName = HeapAlloc(GetProcessHeap(), 0, cchFileName * 
sizeof(WCHAR));
     if (EventLog->FileName)
-        StringCchCopyW(EventLog->FileName, sfn.nMaxFile, sfn.lpstrFile);
+        StringCchCopyW(EventLog->FileName, cchFileName, lpszFileName);
 
     hItem = TreeViewAddItem(hwndTreeView, htiUserLogs,
-                            szFileName,
+                            (LPWSTR)lpszFileName,
                             2, 3, (LPARAM)EventLogFilter);
 
     /* Select the event log */
@@ -1942,9 +1957,27 @@ OpenUserEventLog(VOID)
         TreeView_SelectItem(hwndTreeView, hItem);
         TreeView_EnsureVisible(hwndTreeView, hItem);
     }
+    InvalidateRect(hwndTreeView, NULL, FALSE);
     SetFocus(hwndTreeView);
 }
 
+VOID
+OpenUserEventLog(VOID)
+{
+    WCHAR szFileName[MAX_PATH];
+
+    ZeroMemory(szFileName, sizeof(szFileName));
+
+    sfn.lpstrFile = szFileName;
+    sfn.nMaxFile  = ARRAYSIZE(szFileName);
+
+    if (!GetOpenFileNameW(&sfn))
+        return;
+    sfn.lpstrFile[sfn.nMaxFile-1] = UNICODE_NULL;
+
+    OpenUserEventLogFile(sfn.lpstrFile);
+}
+
 VOID
 SaveEventLog(IN PEVENTLOGFILTER EventLogFilter)
 {
@@ -1973,12 +2006,12 @@ SaveEventLog(IN PEVENTLOGFILTER EventLogFilter)
 
     if (!hEventLog)
     {
-        ShowLastWin32Error();
+        ShowWin32Error(GetLastError());
         return;
     }
 
     if (!BackupEventLogW(hEventLog, szFileName))
-        ShowLastWin32Error();
+        ShowWin32Error(GetLastError());
 
     CloseEventLog(hEventLog);
 }
@@ -2013,6 +2046,7 @@ CloseUserEventLog(IN PEVENTLOGFILTER EventLogFilter, IN 
HTREEITEM hti)
     // // TreeView_Expand(hwndTreeView, htiUserLogs, TVE_EXPAND);
     // TreeView_SelectItem(hwndTreeView, hItem);
     // TreeView_EnsureVisible(hwndTreeView, hItem);
+    InvalidateRect(hwndTreeView, NULL, FALSE);
     SetFocus(hwndTreeView);
 }
 
@@ -2062,13 +2096,13 @@ ClearEvents(IN PEVENTLOGFILTER EventLogFilter)
 
     if (!hEventLog)
     {
-        ShowLastWin32Error();
+        ShowWin32Error(GetLastError());
         return FALSE;
     }
 
     Success = ClearEventLogW(hEventLog, sfn.lpstrFile);
     if (!Success)
-        ShowLastWin32Error();
+        ShowWin32Error(GetLastError());
 
     CloseEventLog(hEventLog);
     return Success;
@@ -2254,7 +2288,7 @@ BuildLogListAndFilterList(IN LPCWSTR lpComputerName)
                                              1, &EventLog);
         if (EventLogFilter == NULL)
         {
-            HeapFree(GetProcessHeap(), 0, EventLog);
+            EventLog_Free(EventLog);
             continue;
         }
 
@@ -2369,6 +2403,7 @@ Quit:
         TreeView_SelectItem(hwndTreeView, hItemDefault);
         TreeView_EnsureVisible(hwndTreeView, hItemDefault);
     }
+    InvalidateRect(hwndTreeView, NULL, FALSE);
     SetFocus(hwndTreeView);
 
     return;
@@ -2418,8 +2453,6 @@ InitInstance(HINSTANCE hInstance,
     LVCOLUMNW lvc = {0};
     WCHAR szTemp[256];
 
-    hInst = hInstance; // Store instance handle in our global variable
-
     /* Create the main window */
     hwndMainWindow = CreateWindowW(szWindowClass,
                                    szTitle,
diff --git a/base/applications/mscutils/eventvwr/resource.h 
b/base/applications/mscutils/eventvwr/resource.h
index d36afe2af5..525cce9c55 100644
--- a/base/applications/mscutils/eventvwr/resource.h
+++ b/base/applications/mscutils/eventvwr/resource.h
@@ -80,39 +80,39 @@
 
 
 /* String IDs */
-#define IDS_COPYRIGHT                 102
-#define IDS_APP_TITLE                 103
-#define IDS_APP_TITLE_EX              104
-#define IDS_STATUS_MSG                105
-#define IDS_LOADING_WAIT              106
-#define IDS_NO_ITEMS                  107
-#define IDS_EVENTLOG_SYSTEM           108
-#define IDS_EVENTLOG_APP              109
-#define IDS_EVENTLOG_USER             110
-#define IDS_EVENTSTRINGIDNOTFOUND     209
-#define IDS_CLEAREVENTS_MSG           210
-#define IDS_SAVE_FILTER               211
+#define IDS_COPYRIGHT                   100
+#define IDS_APP_TITLE                   101
+#define IDS_APP_TITLE_EX                102
+#define IDS_STATUS_MSG                  103
+#define IDS_LOADING_WAIT                104
+#define IDS_NO_ITEMS                    105
+#define IDS_EVENTLOG_SYSTEM             106
+#define IDS_EVENTLOG_APP                107
+#define IDS_EVENTLOG_USER               108
+#define IDS_EVENTSTRINGIDNOTFOUND       109
+#define IDS_CLEAREVENTS_MSG             110
+#define IDS_SAVE_FILTER                 111
 
-#define IDS_EVENTLOG_ERROR_TYPE       251
-#define IDS_EVENTLOG_WARNING_TYPE     252
-#define IDS_EVENTLOG_INFORMATION_TYPE 253
-#define IDS_EVENTLOG_AUDIT_SUCCESS    254
-#define IDS_EVENTLOG_AUDIT_FAILURE    255
-#define IDS_EVENTLOG_SUCCESS          256
-#define IDS_EVENTLOG_UNKNOWN_TYPE     257
+#define IDS_EVENTLOG_ERROR_TYPE         200
+#define IDS_EVENTLOG_WARNING_TYPE       201
+#define IDS_EVENTLOG_INFORMATION_TYPE   202
+#define IDS_EVENTLOG_AUDIT_SUCCESS      203
+#define IDS_EVENTLOG_AUDIT_FAILURE      204
+#define IDS_EVENTLOG_SUCCESS            205
+#define IDS_EVENTLOG_UNKNOWN_TYPE       206
 
-#define IDS_BYTES_FORMAT              260
+#define IDS_BYTES_FORMAT                210
 
-#define IDS_COLUMNTYPE      300
-#define IDS_COLUMNDATE      301
-#define IDS_COLUMNTIME      302
-#define IDS_COLUMNSOURCE    303
-#define IDS_COLUMNCATEGORY  304
-#define IDS_COLUMNEVENT     305
-#define IDS_COLUMNUSER      306
-#define IDS_COLUMNCOMPUTER  307
+#define IDS_COLUMNTYPE      220
+#define IDS_COLUMNDATE      221
+#define IDS_COLUMNTIME      222
+#define IDS_COLUMNSOURCE    223
+#define IDS_COLUMNCATEGORY  224
+#define IDS_COLUMNEVENT     225
+#define IDS_COLUMNUSER      226
+#define IDS_COLUMNCOMPUTER  227
 
-#define IDS_COPY          400
+#define IDS_COPY            240
 
-#define IDS_NONE          320
-#define IDS_NOT_AVAILABLE 321
+#define IDS_NONE            250
+#define IDS_NOT_AVAILABLE   251

Reply via email to