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