[ros-diffs] [cwittich] 38660: -convert to unicode -fix a big memory leak

cwittich at svn.reactos.org cwittich at svn.reactos.org
Fri Jan 9 08:46:08 CET 2009


Author: cwittich
Date: Fri Jan  9 01:46:07 2009
New Revision: 38660

URL: http://svn.reactos.org/svn/reactos?rev=38660&view=rev
Log:
-convert to unicode
-fix a big memory leak

Modified:
    trunk/reactos/base/applications/mscutils/eventvwr/eventvwr.c

Modified: trunk/reactos/base/applications/mscutils/eventvwr/eventvwr.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mscutils/eventvwr/eventvwr.c?rev=38660&r1=38659&r2=38660&view=diff
==============================================================================
--- trunk/reactos/base/applications/mscutils/eventvwr/eventvwr.c [iso-8859-1] (original)
+++ trunk/reactos/base/applications/mscutils/eventvwr/eventvwr.c [iso-8859-1] Fri Jan  9 01:46:07 2009
@@ -24,45 +24,44 @@
  */
 
 #include "eventvwr.h"
-#include <windows.h>  // Standard windows include file
-#include <commctrl.h> // For ListView control APIs
-#include <tchar.h>    // For TCHAR and string functions.
+#include <windows.h>
+#include <commctrl.h>
 #include <stdio.h>
 #include <time.h>
 
 #if _MSC_VER
-    #pragma warning(disable: 4996)   // 'strdup' was declared deprecated
-    #define _CRT_SECURE_NO_DEPRECATE // all deprecated 'unsafe string functions
+    #pragma warning(disable: 4996)   /* 'strdup' was declared deprecated */
+    #define _CRT_SECURE_NO_DEPRECATE /* all deprecated unsafe string functions */
 #endif
 
-static const LPTSTR EVENT_SOURCE_APPLICATION = _TEXT("Application");
-static const LPTSTR EVENT_SOURCE_SECURITY    = _TEXT("Security");
-static const LPTSTR EVENT_SOURCE_SYSTEM      = _TEXT("System");
-static const TCHAR szWindowClass[]          = _TEXT("EVENTVWR"); // the main window class name
+static const LPWSTR EVENT_SOURCE_APPLICATION = L"Application";
+static const LPWSTR EVENT_SOURCE_SECURITY    = L"Security";
+static const LPWSTR EVENT_SOURCE_SYSTEM      = L"System";
+static const WCHAR szWindowClass[]          = L"EVENTVWR"; /* the main window class name*/
 
 //MessageFile message buffer size
 #define EVENT_MESSAGE_EVENTTEXT_BUFFER  1024*10
 #define EVENT_MESSAGE_FILE_BUFFER       1024*10
-#define EVENT_DLL_SEPARATOR             _TEXT(";")
-#define EVENT_MESSAGE_FILE              _TEXT("EventMessageFile")
-#define EVENT_CATEGORY_MESSAGE_FILE     _TEXT("CategoryMessageFile")
-#define EVENT_PARAMETER_MESSAGE_FILE    _TEXT("ParameterMessageFile")
+#define EVENT_DLL_SEPARATOR             L";"
+#define EVENT_MESSAGE_FILE              L"EventMessageFile"
+#define EVENT_CATEGORY_MESSAGE_FILE     L"CategoryMessageFile"
+#define EVENT_PARAMETER_MESSAGE_FILE    L"ParameterMessageFile"
 
 #define MAX_LOADSTRING 255
 
-// Global Variables:
-HINSTANCE hInst;                // current instance
-TCHAR szTitle[MAX_LOADSTRING];  // The title bar text
-
-// Globals
-HWND hwndMainWindow;         // Main window
-HWND hwndListView;           // ListView control
-HWND hwndStatus;             // Status bar
-
-LPTSTR lpSourceLogName = NULL;
-LPTSTR lpComputerName  = NULL;
-
-// Forward declarations of functions included in this code module:
+/* Globals */
+HINSTANCE hInst;                /* current instance */
+WCHAR szTitle[MAX_LOADSTRING];  /* The title bar text */
+HWND hwndMainWindow;            /* Main window */
+HWND hwndListView;              /* ListView control */
+HWND hwndStatus;                /* Status bar */
+PEVENTLOGRECORD *g_RecordPtrs = NULL;
+DWORD g_TotalRecords = 0;
+
+LPWSTR lpSourceLogName = NULL;
+LPWSTR lpComputerName  = NULL;
+
+/* Forward declarations of functions included in this code module: */
 ATOM MyRegisterClass(HINSTANCE hInstance);
 BOOL InitInstance(HINSTANCE, int);
 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
@@ -72,9 +71,9 @@
 
 
 int APIENTRY
-_tWinMain(HINSTANCE hInstance,
+wWinMain(HINSTANCE hInstance,
           HINSTANCE hPrevInstance,
-          LPTSTR    lpCmdLine,
+          LPWSTR    lpCmdLine,
           int       nCmdShow)
 {
     MSG msg;
@@ -84,18 +83,18 @@
     UNREFERENCED_PARAMETER(hPrevInstance);
     UNREFERENCED_PARAMETER(lpCmdLine);
 
-    // Whenever any of the common controls are used in your app,
-    // you must call InitCommonControlsEx() to register the classes
-    // for those controls.
+    /* Whenever any of the common controls are used in your app,
+     * you must call InitCommonControlsEx() to register the classes
+     * for those controls. */
     iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
     iccx.dwICC = ICC_LISTVIEW_CLASSES;
     InitCommonControlsEx(&iccx);
 
-    // Initialize global strings
-    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+    /* Initialize global strings */
+    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
     MyRegisterClass(hInstance);
 
-    // Perform application initialization:
+    /* Perform application initialization: */
     if (!InitInstance(hInstance, nCmdShow))
     {
         return FALSE;
@@ -103,10 +102,10 @@
 
     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_EVENTVWR));
 
-    // Main message loop:
-    while (GetMessage(&msg, NULL, 0, 0))
-    {
-        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
+    /* Main message loop: */
+    while (GetMessageW(&msg, NULL, 0, 0))
+    {
+        if (!TranslateAcceleratorW(msg.hwnd, hAccelTable, &msg))
         {
             TranslateMessage(&msg);
             DispatchMessage(&msg);
@@ -116,6 +115,18 @@
     return (int)msg.wParam;
 }
 
+static void FreeRecords(void)
+{
+    DWORD iIndex;
+
+    if (!g_RecordPtrs)
+        return;
+
+    for (iIndex = 0; iIndex < g_TotalRecords; iIndex++)
+        HeapFree(GetProcessHeap(), 0, (PEVENTLOGRECORD) g_RecordPtrs[iIndex]);
+    HeapFree(GetProcessHeap(), 0, (PEVENTLOGRECORD) g_RecordPtrs);
+    g_RecordPtrs = NULL;
+}
 
 VOID
 EventTimeToSystemTime(DWORD EventTime,
@@ -139,70 +150,69 @@
 
 
 void
-TrimNulls(LPTSTR s)
-{
-    TCHAR *c;
+TrimNulls(LPWSTR s)
+{
+    WCHAR *c;
 
     if (s != NULL)
     {
-        c = s + _tcslen(s) - 1;
-        while (c >= s && _istspace(*c))
+        c = s + wcslen(s) - 1;
+        while (c >= s && iswspace(*c))
             --c;
-        *++c = _TEXT('\0');
+        *++c = L'\0';
     }
 }
 
 
 BOOL
-GetEventMessageFileDLL(IN LPCTSTR lpLogName,
-                       IN LPCTSTR SourceName,
-                       IN LPCTSTR EntryName,
-                       OUT LPTSTR ExpandedName)
+GetEventMessageFileDLL(IN LPCWSTR lpLogName,
+                       IN LPCWSTR SourceName,
+                       IN LPCWSTR EntryName,
+                       OUT LPWSTR ExpandedName)
 {
     DWORD dwSize;
     BYTE szModuleName[MAX_PATH];
-    TCHAR szKeyName[MAX_PATH];
+    WCHAR szKeyName[MAX_PATH];
     HKEY hAppKey = NULL;
     HKEY hSourceKey = NULL;
-    BOOL bReturn = FALSE; // Return
-
-    _tcscpy(szKeyName, _TEXT("SYSTEM\\CurrentControlSet\\Services\\EventLog"));
-    _tcscat(szKeyName, _TEXT("\\"));
-    _tcscat(szKeyName, lpLogName);
-
-    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+    BOOL bReturn = FALSE;
+
+    wcscpy(szKeyName, L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\");
+    wcscat(szKeyName, lpLogName);
+
+    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
                      szKeyName,
                      0,
                      KEY_READ,
                      &hAppKey) == ERROR_SUCCESS)
     {
-        if (RegOpenKeyEx(hAppKey,
+        if (RegOpenKeyExW(hAppKey,
                          SourceName,
                          0,
                          KEY_READ,
                          &hSourceKey) == ERROR_SUCCESS)
         {
             dwSize = MAX_PATH;
-            if (RegQueryValueEx(hSourceKey,
+            if (RegQueryValueExW(hSourceKey,
                                 EntryName,
                                 NULL,
                                 NULL,
                                 (LPBYTE)szModuleName,
                                 &dwSize) == ERROR_SUCCESS)
             {
-                // Returns a string containing the requested substituted environment variable.
-                ExpandEnvironmentStrings((LPCTSTR)szModuleName, ExpandedName, MAX_PATH);
-
-                // Succesfull
+                /* Returns a string containing the requested substituted environment variable. */
+                ExpandEnvironmentStringsW((LPCWSTR)szModuleName, ExpandedName, MAX_PATH);
+
+                /* Succesfull */
                 bReturn = TRUE;
             }
         }
     }
     else
     {
-        MessageBox(NULL,
-                   _TEXT("Registry access failed!"),
-                   _TEXT("Event Log"),
+        MessageBoxW(NULL,
+                   L"Registry access failed!",
+                   L"Event Log",
                    MB_OK | MB_ICONINFORMATION);
     }
 
@@ -217,53 +227,53 @@
 
 
 BOOL
-GetEventCategory(IN LPCTSTR KeyName,
-                 IN LPCTSTR SourceName,
+GetEventCategory(IN LPCWSTR KeyName,
+                 IN LPCWSTR SourceName,
                  IN EVENTLOGRECORD *pevlr,
-                 OUT LPTSTR CategoryName)
+                 OUT LPWSTR CategoryName)
 {
     HANDLE hLibrary = NULL;
-    TCHAR szMessageDLL[MAX_PATH];
+    WCHAR szMessageDLL[MAX_PATH];
     LPVOID lpMsgBuf = NULL;
 
     if (GetEventMessageFileDLL (KeyName, SourceName, EVENT_CATEGORY_MESSAGE_FILE , szMessageDLL))
     {
-        hLibrary = LoadLibraryEx(szMessageDLL,
+        hLibrary = LoadLibraryExW(szMessageDLL,
                                  NULL,
                                  DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
         if (hLibrary != NULL)
         {
-            // Retrieve the message string.
-            if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
+            /* Retrieve the message string. */
+            if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                               hLibrary,
                               pevlr->EventCategory,
                               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                              (LPTSTR)&lpMsgBuf,
+                              (LPWSTR)&lpMsgBuf,
                               EVENT_MESSAGE_FILE_BUFFER,
                               NULL) != 0)
             {
                 if (lpMsgBuf)
                 {
-                    // Trim the string
-                    TrimNulls((LPTSTR)lpMsgBuf);
-
-                    // Copy the category name
-                    _tcscpy(CategoryName, (LPCTSTR)lpMsgBuf);
+                    /* Trim the string */
+                    TrimNulls((LPWSTR)lpMsgBuf);
+
+                    /* Copy the category name */
+                    wcscpy(CategoryName, (LPCWSTR)lpMsgBuf);
                 }
                 else
                 {
-                    _tcscpy(CategoryName, (LPCTSTR)lpMsgBuf);
+                    wcscpy(CategoryName, (LPCWSTR)lpMsgBuf);
                 }
             }
             else
             {
-                _tcscpy(CategoryName, _TEXT("None"));
+                wcscpy(CategoryName, L"None");
             }
 
             if (hLibrary != NULL)
                 FreeLibrary(hLibrary);
 
-            // Free the buffer allocated by FormatMessage
+            /* Free the buffer allocated by FormatMessage */
             if (lpMsgBuf)
                 LocalFree(lpMsgBuf);
 
@@ -271,37 +281,37 @@
         }
     }
 
-    _tcscpy(CategoryName, _TEXT("None"));
+    wcscpy(CategoryName, L"None");
 
     return FALSE;
 }
 
 
 BOOL
-GetEventMessage(IN LPCTSTR KeyName,
-                IN LPCTSTR SourceName,
+GetEventMessage(IN LPCWSTR KeyName,
+                IN LPCWSTR SourceName,
                 IN EVENTLOGRECORD *pevlr,
-                OUT LPTSTR EventText)
+                OUT LPWSTR EventText)
 {
     DWORD i;
     HANDLE hLibrary = NULL;
-    TCHAR SourceModuleName[1000];
-    TCHAR ParameterModuleName[1000];
-    LPTSTR lpMsgBuf = NULL;
-    TCHAR szStringIDNotFound[MAX_LOADSTRING];
-    LPTSTR szDll;
-    LPTSTR szMessage;
-    LPTSTR *szArguments;
+    WCHAR SourceModuleName[1000];
+    WCHAR ParameterModuleName[1000];
+    LPWSTR lpMsgBuf = NULL;
+    WCHAR szStringIDNotFound[MAX_LOADSTRING];
+    LPWSTR szDll;
+    LPWSTR szMessage;
+    LPWSTR *szArguments;
     BOOL bDone = FALSE;
 
     /* TODO : GetEventMessageFileDLL can return a comma separated list of DLLs */
-    if (GetEventMessageFileDLL (KeyName , SourceName, EVENT_MESSAGE_FILE , SourceModuleName))
-    {
-        // Get the event message
-        szMessage = (LPTSTR)((LPBYTE)pevlr + pevlr->StringOffset);
-
-        // Allocate space for parameters
-        szArguments = (LPTSTR*)malloc(sizeof(LPVOID) * pevlr->NumStrings);
+    if (GetEventMessageFileDLL (KeyName, SourceName, EVENT_MESSAGE_FILE, SourceModuleName))
+    {
+        /* Get the event message */
+        szMessage = (LPWSTR)((LPBYTE)pevlr + pevlr->StringOffset);
+
+        /* Allocate space for parameters */
+        szArguments = (LPWSTR*)malloc(sizeof(LPVOID) * pevlr->NumStrings);
         if (!szArguments)
         {
             return FALSE;
@@ -309,63 +319,63 @@
 
         for (i = 0; i < pevlr->NumStrings ; i++)
         {
-            if (_tcsstr(szMessage , _TEXT("%%")))
-            {
-                if (GetEventMessageFileDLL(KeyName , SourceName, EVENT_PARAMETER_MESSAGE_FILE, ParameterModuleName))
+            if (wcsstr(szMessage , L"%%"))
+            {
+                if (GetEventMessageFileDLL(KeyName, SourceName, EVENT_PARAMETER_MESSAGE_FILE, ParameterModuleName))
                 {
-                    // Not yet support for reading messages from parameter message DLL
+                    /* Not yet support for reading messages from parameter message DLL */
                 }
 
                 szArguments[i] = szMessage;
-                szMessage += _tcslen(szMessage) + 1;
+                szMessage += wcslen(szMessage) + 1;
             }
             else
             {
                 szArguments[i] = szMessage;
-                szMessage += _tcslen(szMessage) + 1;
+                szMessage += wcslen(szMessage) + 1;
             }
         }
 
-        szDll = _tcstok(SourceModuleName, EVENT_DLL_SEPARATOR);
+        szDll = wcstok(SourceModuleName, EVENT_DLL_SEPARATOR);
         while ((szDll != NULL) && (!bDone))
         {
-            hLibrary = LoadLibraryEx(szDll,
+            hLibrary = LoadLibraryExW(szDll,
                                      NULL,
                                      DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
             if (hLibrary == NULL)
             {
-                // The DLL could not be loaded try the next one (if any)
-                szDll = _tcstok(NULL, EVENT_DLL_SEPARATOR);
+                /* The DLL could not be loaded try the next one (if any) */
+                szDll = wcstok(NULL, EVENT_DLL_SEPARATOR);
             }
             else
             {
-                // Retrieve the message string.
-                if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
+                /* Retrieve the message string. */
+                if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |
                                   FORMAT_MESSAGE_ALLOCATE_BUFFER |
                                   FORMAT_MESSAGE_FROM_HMODULE |
                                   FORMAT_MESSAGE_ARGUMENT_ARRAY,
                                   hLibrary,
                                   pevlr->EventID,
                                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                                  (LPTSTR)&lpMsgBuf,
+                                  (LPWSTR)&lpMsgBuf,
                                   0,
                                   (va_list*)szArguments) == 0)
                 {
-                    // We haven't found the string , get next DLL (if any)
-                    szDll = _tcstok(NULL, EVENT_DLL_SEPARATOR);
+                    /* We haven't found the string , get next DLL (if any) */
+                    szDll = wcstok(NULL, EVENT_DLL_SEPARATOR);
                 }
                 else
                 {
                     if (lpMsgBuf)
                     {
-                        // The ID was found and the message was formated
+                        /* The ID was found and the message was formated */
                         bDone = TRUE;
 
-                        // Trim the string
-                        TrimNulls((LPTSTR)lpMsgBuf);
-
-                        // Copy the event text
-                        _tcscpy(EventText ,lpMsgBuf);
+                        /* Trim the string */
+                        TrimNulls((LPWSTR)lpMsgBuf);
+
+                        /* Copy the event text */
+                        wcscpy(EventText ,lpMsgBuf);
                     }
                 }
 
@@ -375,18 +385,18 @@
 
         if (!bDone)
         {
-            LoadString(hInst, IDC_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING);
-            wsprintf(EventText, szStringIDNotFound, (DWORD)(pevlr->EventID & 0xFFFF), SourceName);
+            LoadStringW(hInst, IDC_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING);
+            swprintf(EventText, szStringIDNotFound, (DWORD)(pevlr->EventID & 0xFFFF), SourceName);
         }
 
         free(szArguments);
 
-        // No more dlls to try , return result
+        /* No more dlls to try, return result */
         return bDone;
     }
 
-    LoadString(hInst, IDC_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING);
-    wsprintf(EventText, szStringIDNotFound, (DWORD)(pevlr->EventID & 0xFFFF), SourceName);
+    LoadStringW(hInst, IDC_EVENTSTRINGIDNOTFOUND, szStringIDNotFound, MAX_LOADSTRING);
+    swprintf(EventText, szStringIDNotFound, (DWORD)(pevlr->EventID & 0xFFFF), SourceName);
 
     return FALSE;
 }
@@ -394,52 +404,52 @@
 
 VOID
 GetEventType(IN WORD dwEventType,
-             OUT LPTSTR eventTypeText)
+             OUT LPWSTR eventTypeText)
 {
     switch (dwEventType)
     {
         case EVENTLOG_ERROR_TYPE:
-            LoadString(hInst, IDC_EVENTLOG_ERROR_TYPE, eventTypeText, MAX_LOADSTRING);
+            LoadStringW(hInst, IDC_EVENTLOG_ERROR_TYPE, eventTypeText, MAX_LOADSTRING);
             break;
         case EVENTLOG_WARNING_TYPE:
-            LoadString(hInst, IDC_EVENTLOG_WARNING_TYPE, eventTypeText, MAX_LOADSTRING);
+            LoadStringW(hInst, IDC_EVENTLOG_WARNING_TYPE, eventTypeText, MAX_LOADSTRING);
             break;
         case EVENTLOG_INFORMATION_TYPE:
-            LoadString(hInst, IDC_EVENTLOG_INFORMATION_TYPE, eventTypeText, MAX_LOADSTRING);
+            LoadStringW(hInst, IDC_EVENTLOG_INFORMATION_TYPE, eventTypeText, MAX_LOADSTRING);
             break;
         case EVENTLOG_AUDIT_SUCCESS:
-            LoadString(hInst, IDC_EVENTLOG_AUDIT_SUCCESS, eventTypeText, MAX_LOADSTRING);
+            LoadStringW(hInst, IDC_EVENTLOG_AUDIT_SUCCESS, eventTypeText, MAX_LOADSTRING);
             break;
         case EVENTLOG_AUDIT_FAILURE:
-            LoadString(hInst, IDC_EVENTLOG_AUDIT_FAILURE, eventTypeText, MAX_LOADSTRING);
+            LoadStringW(hInst, IDC_EVENTLOG_AUDIT_FAILURE, eventTypeText, MAX_LOADSTRING);
             break;
         case EVENTLOG_SUCCESS:
-            LoadString(hInst, IDC_EVENTLOG_SUCCESS, eventTypeText, MAX_LOADSTRING);
+            LoadStringW(hInst, IDC_EVENTLOG_SUCCESS, eventTypeText, MAX_LOADSTRING);
             break;
         default:
-            LoadString(hInst, IDC_EVENTLOG_UNKNOWN_TYPE, eventTypeText, MAX_LOADSTRING);
+            LoadStringW(hInst, IDC_EVENTLOG_UNKNOWN_TYPE, eventTypeText, MAX_LOADSTRING);
             break;
     }
 }
 
 BOOL
 GetEventUserName(EVENTLOGRECORD *pelr,
-                 OUT LPTSTR pszUser)
+                 OUT LPWSTR pszUser)
 {
     PSID lpSid;
-    TCHAR szName[1024];
-    TCHAR szDomain[1024];
+    WCHAR szName[1024];
+    WCHAR szDomain[1024];
     SID_NAME_USE peUse;
     DWORD cbName = 1024;
     DWORD cbDomain = 1024;
 
-    // Point to the SID.
+    /* Point to the SID. */
     lpSid = (PSID)((LPBYTE)pelr + pelr->UserSidOffset);
 
-    // User SID
+    /* User SID */
     if (pelr->UserSidLength > 0)
     {
-        if (LookupAccountSid(NULL,
+        if (LookupAccountSidW(NULL,
                              lpSid,
                              szName,
                              &cbName,
@@ -447,7 +457,7 @@
                              &cbDomain,
                              &peUse))
         {
-            _tcscpy(pszUser, szName);
+            wcscpy(pszUser, szName);
             return TRUE;
         }
     }
@@ -487,67 +497,66 @@
 
 
 BOOL
-QueryEventMessages(LPTSTR lpMachineName,
-                   LPTSTR lpLogName)
+QueryEventMessages(LPWSTR lpMachineName,
+                   LPWSTR lpLogName)
 {
     HWND hwndDlg;
     HANDLE hEventLog;
     EVENTLOGRECORD *pevlr;
-    BYTE bBuffer[MAX_PATH];
     DWORD dwRead, dwNeeded, dwThisRecord, dwTotalRecords, dwCurrentRecord = 1, dwRecordsToRead = 0, dwFlags;
-    LPTSTR lpSourceName;
-    LPTSTR lpComputerName;
-    LPTSTR lpEventStr;
-    LPTSTR lpData;
-    BOOL bResult = TRUE; // Read succeeded.
-
-    TCHAR szWindowTitle[MAX_PATH];
-    TCHAR szStatusText[MAX_PATH];
-    TCHAR szLocalDate[MAX_PATH];
-    TCHAR szLocalTime[MAX_PATH];
-    TCHAR szEventID[MAX_PATH];
-    TCHAR szEventTypeText[MAX_PATH];
-    TCHAR szCategoryID[MAX_PATH];
-    TCHAR szUsername[MAX_PATH];
-    TCHAR szEventText[EVENT_MESSAGE_FILE_BUFFER];
-    TCHAR szCategory[MAX_PATH];
+    LPWSTR lpSourceName;
+    LPWSTR lpComputerName;
+    LPWSTR lpEventStr;
+    LPWSTR lpData;
+    BOOL bResult = TRUE; /* Read succeeded. */
+
+    WCHAR szWindowTitle[MAX_PATH];
+    WCHAR szStatusText[MAX_PATH];
+    WCHAR szLocalDate[MAX_PATH];
+    WCHAR szLocalTime[MAX_PATH];
+    WCHAR szEventID[MAX_PATH];
+    WCHAR szEventTypeText[MAX_PATH];
+    WCHAR szCategoryID[MAX_PATH];
+    WCHAR szUsername[MAX_PATH];
+    WCHAR szEventText[EVENT_MESSAGE_FILE_BUFFER];
+    WCHAR szCategory[MAX_PATH];
 
     SYSTEMTIME time;
-    LVITEM lviEventItem;
+    LVITEMW lviEventItem;
 
     dwFlags = EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ;
 
     lpSourceLogName = lpLogName;
     lpComputerName = lpMachineName;
 
-    // Open the event log.
-    hEventLog = OpenEventLog(lpMachineName,
+    /* Open the event log. */
+    hEventLog = OpenEventLogW(lpMachineName,
                              lpLogName);
     if (hEventLog == NULL)
     {
-        MessageBox(NULL,
-                   _TEXT("Could not open the event log."),
-                   _TEXT("Event Log"),
+        MessageBoxW(NULL,
+                   L"Could not open the event log.",
+                   L"Event Log",
                    MB_OK | MB_ICONINFORMATION);
         return FALSE;
     }
 
-    // Disable listview redraw
+    /* Disable listview redraw */
     SendMessage(hwndListView, WM_SETREDRAW, FALSE, 0);
 
-    // Clear the list view
+    /* Clear the list view */
     (void)ListView_DeleteAllItems (hwndListView);
-
-    // Initialize the event record buffer.
-    pevlr = (EVENTLOGRECORD *)&bBuffer;
-
-    // Get the record number of the oldest event log record.
+    FreeRecords();
+
     GetOldestEventLogRecord(hEventLog, &dwThisRecord);
 
-    // Get the total number of event log records.
+    /* Get the total number of event log records. */
     GetNumberOfEventLogRecords (hEventLog , &dwTotalRecords);
-
-    //If we have at least 1000 records show the waiting dialog
+    g_TotalRecords = dwTotalRecords;
+
+    g_RecordPtrs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwTotalRecords * sizeof(PEVENTLOGRECORD));
+
+    /* If we have at least 1000 records show the waiting dialog */
     if (dwTotalRecords > 1000)
     {
         CreateThread(NULL,
@@ -560,20 +569,23 @@
 
     while (dwCurrentRecord < dwTotalRecords)
     {
-        pevlr = (EVENTLOGRECORD*)malloc(MAX_PATH);
+        pevlr = (EVENTLOGRECORD*) HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD) * dwTotalRecords);
+        g_RecordPtrs[dwCurrentRecord] = pevlr;
 
         bResult = ReadEventLog(hEventLog,  // Event log handle
                                dwFlags,    // Sequential read
                                0,          // Ignored for sequential read
                                pevlr,      // Pointer to buffer
-                               MAX_PATH,   // Size of buffer
+                               sizeof(EVENTLOGRECORD),   // Size of buffer
                                &dwRead,    // Number of bytes read
                                &dwNeeded); // Bytes in the next record
         if((!bResult) && (GetLastError () == ERROR_INSUFFICIENT_BUFFER))
         {
-            pevlr = (EVENTLOGRECORD*)malloc (dwNeeded);
-
-            ReadEventLog(hEventLog,  // event log handle
+            HeapFree(GetProcessHeap(), 0, pevlr);
+            pevlr = (EVENTLOGRECORD*) HeapAlloc(GetProcessHeap(), 0, dwNeeded);
+            g_RecordPtrs[dwCurrentRecord] = pevlr;
+
+            ReadEventLogW(hEventLog,  // event log handle
                          dwFlags,    // read flags
                          0,          // offset; default is 0
                          pevlr,      // pointer to buffer
@@ -584,21 +596,21 @@
 
         while (dwRead > 0)
         {
-            _tcscpy(szUsername , _TEXT("N/A"));
-            _tcscpy(szEventText , _TEXT("N/A"));
-            _tcscpy(szCategory , _TEXT("None"));
+            wcscpy(szUsername , L"N/A");
+            wcscpy(szEventText , L"N/A");
+            wcscpy(szCategory , L"None");
 
             // Get the event source name.
-            lpSourceName = (LPTSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD));
+            lpSourceName = (LPWSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD));
 
             // Get the computer name
-            lpComputerName = (LPTSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD) + (_tcslen(lpSourceName) + 1) * sizeof(TCHAR));
+            lpComputerName = (LPWSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD) + (wcslen(lpSourceName) + 1) * sizeof(WCHAR));
 
             // This ist the data section of the current event
-            lpData = (LPTSTR)((LPBYTE)pevlr + pevlr->DataOffset);
+            lpData = (LPWSTR)((LPBYTE)pevlr + pevlr->DataOffset);
 
             // This is the text of the current event
-            lpEventStr = (LPTSTR)((LPBYTE)pevlr + pevlr->StringOffset);
+            lpEventStr = (LPWSTR)((LPBYTE)pevlr + pevlr->StringOffset);
 
             // Compute the event type
             EventTimeToSystemTime(pevlr->TimeWritten, &time);
@@ -606,14 +618,14 @@
             // Get the username that generated the event
             GetEventUserName(pevlr, szUsername);
 
-            GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &time, NULL, szLocalDate, MAX_PATH);
-            GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &time, NULL, szLocalTime, MAX_PATH);
+            GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &time, NULL, szLocalDate, MAX_PATH);
+            GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &time, NULL, szLocalTime, MAX_PATH);
 
             GetEventType(pevlr->EventType, szEventTypeText);
             GetEventCategory(lpLogName, lpSourceName, pevlr, szCategory);
 
-            wsprintf(szEventID, _TEXT("%u"), (DWORD)(pevlr->EventID & 0xFFFF));
-            wsprintf(szCategoryID, _TEXT("%u"), (DWORD)(pevlr->EventCategory));
+            swprintf(szEventID, L"%u", (DWORD)(pevlr->EventID & 0xFFFF));
+            swprintf(szCategoryID, L"%u", (DWORD)(pevlr->EventCategory));
 
             lviEventItem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
             lviEventItem.iItem = 0;
@@ -665,24 +677,22 @@
 
         dwRecordsToRead--;
         dwCurrentRecord++;
-
-        pevlr = (EVENTLOGRECORD *)&bBuffer;
     }
 
     // All events loaded
     EndDialog(hwndDlg, 0);
 
-    wsprintf(szWindowTitle, _TEXT("%s - %s Log on \\\\%s"), szTitle, lpLogName, lpComputerName);
-    wsprintf(szStatusText, _TEXT("%s has %d event(s)"), lpLogName, dwTotalRecords);
+    swprintf(szWindowTitle, L"%s - %s Log on \\\\%s", szTitle, lpLogName, lpComputerName);
+    swprintf(szStatusText, L"%s has %d event(s)", lpLogName, dwTotalRecords);
 
     // Update the status bar
-    SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)szStatusText);
+    SendMessageW(hwndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)szStatusText);
 
     // Set the window title
-    SetWindowText(hwndMainWindow, szWindowTitle);
+    SetWindowTextW(hwndMainWindow, szWindowTitle);
 
     // Resume list view redraw
-    SendMessage(hwndListView, WM_SETREDRAW, TRUE, 0);
+    SendMessageW(hwndListView, WM_SETREDRAW, TRUE, 0);
 
     // Close the event log.
     CloseEventLog(hEventLog);
@@ -715,7 +725,7 @@
 ATOM
 MyRegisterClass(HINSTANCE hInstance)
 {
-    WNDCLASSEX wcex;
+    WNDCLASSEXW wcex;
 
     wcex.cbSize = sizeof(WNDCLASSEX);
 
@@ -731,7 +741,7 @@
     wcex.lpszClassName = szWindowClass;
     wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
-    return RegisterClassEx(&wcex);
+    return RegisterClassExW(&wcex);
 }
 
 
@@ -750,11 +760,11 @@
              int nCmdShow)
 {
     HIMAGELIST hSmall;
-    LVCOLUMN lvc = {0};
+    LVCOLUMNW lvc = {0};
 
     hInst = hInstance; // Store instance handle in our global variable
 
-    hwndMainWindow = CreateWindow(szWindowClass,
+    hwndMainWindow = CreateWindowW(szWindowClass,
                                   szTitle,
                                   WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
@@ -767,9 +777,9 @@
         return FALSE;
     }
 
-    hwndStatus = CreateWindowEx(0,                                  // no extended styles
-                                STATUSCLASSNAME,                    // status bar
-                                _TEXT("Done."),                     // no text
+    hwndStatus = CreateWindowExW(0,                                  // no extended styles
+                                STATUSCLASSNAMEW,                    // status bar
+                                L"Done.",                     // no text
                                 WS_CHILD | WS_BORDER | WS_VISIBLE,  // styles
                                 0, 0, 0, 0,                         // x, y, cx, cy
                                 hwndMainWindow,                     // parent window
@@ -780,9 +790,9 @@
     // Create our listview child window.  Note that I use WS_EX_CLIENTEDGE
     // and WS_BORDER to create the normal "sunken" look.  Also note that
     // LVS_EX_ styles cannot be set in CreateWindowEx().
-    hwndListView = CreateWindowEx(WS_EX_CLIENTEDGE,
-                                  WC_LISTVIEW,
-                                  _TEXT(""),
+    hwndListView = CreateWindowExW(WS_EX_CLIENTEDGE,
+                                  WC_LISTVIEWW,
+                                  L"",
                                   LVS_SHOWSELALWAYS | WS_CHILD | WS_VISIBLE | LVS_REPORT,
                                   0,
                                   0,
@@ -814,39 +824,39 @@
     // Now set up the listview with its columns.
     lvc.mask = LVCF_TEXT | LVCF_WIDTH;
     lvc.cx = 90;
-    lvc.pszText = _T("Type");
+    lvc.pszText = L"Type";
     (void)ListView_InsertColumn(hwndListView, 0, &lvc);
 
     lvc.cx = 70;
-    lvc.pszText = _T("Date");
+    lvc.pszText = L"Date";
     (void)ListView_InsertColumn(hwndListView, 1, &lvc);
 
     lvc.cx = 70;
-    lvc.pszText = _T("Time");
+    lvc.pszText = L"Time";
     (void)ListView_InsertColumn(hwndListView, 2, &lvc);
 
     lvc.cx = 150;
-    lvc.pszText = _T("Source");
+    lvc.pszText = L"Source";
     (void)ListView_InsertColumn(hwndListView, 3, &lvc);
 
     lvc.cx = 100;
-    lvc.pszText = _T("Category");
+    lvc.pszText = L"Category";
     (void)ListView_InsertColumn(hwndListView, 4, &lvc);
 
     lvc.cx = 60;
-    lvc.pszText = _T("Event");
+    lvc.pszText = L"Event";
     (void)ListView_InsertColumn(hwndListView, 5, &lvc);
 
     lvc.cx = 120;
-    lvc.pszText = _T("User");
+    lvc.pszText = L"User";
     (void)ListView_InsertColumn(hwndListView, 6, &lvc);
 
     lvc.cx = 100;
-    lvc.pszText = _T("Computer");
+    lvc.pszText = L"Computer";
     (void)ListView_InsertColumn(hwndListView, 7, &lvc);
 
     lvc.cx = 0;
-    lvc.pszText = _T("Event Data");
+    lvc.pszText = L"Event Data";
     (void)ListView_InsertColumn(hwndListView, 8, &lvc);
 
     ShowWindow(hwndMainWindow, nCmdShow);
@@ -955,9 +965,9 @@
                     break;
 
                 case IDM_HELP:
-                    MessageBox(NULL,
-                               _TEXT("Help not implemented yet!"),
-                               _TEXT("Event Log"),
+                    MessageBoxW(NULL,
+                               L"Help not implemented yet!",
+                               L"Event Log",
                                MB_OK | MB_ICONINFORMATION);
                                break;
 
@@ -987,8 +997,8 @@
                 SendMessage(hwndStatus, message, wParam, lParam);
             }
             break;
-
         case WM_DESTROY:
+            FreeRecords();
             PostQuitMessage(0);
             break;
 
@@ -1027,18 +1037,18 @@
 VOID
 DisplayEvent(HWND hDlg)
 {
-    TCHAR szEventType[MAX_PATH];
-    TCHAR szTime[MAX_PATH];
-    TCHAR szDate[MAX_PATH];
-    TCHAR szUser[MAX_PATH];
-    TCHAR szComputer[MAX_PATH];
-    TCHAR szSource[MAX_PATH];
-    TCHAR szCategory[MAX_PATH];
-    TCHAR szEventID[MAX_PATH];
-    TCHAR szEventText[EVENT_MESSAGE_EVENTTEXT_BUFFER];
-    TCHAR szEventData[MAX_PATH];
+    WCHAR szEventType[MAX_PATH];
+    WCHAR szTime[MAX_PATH];
+    WCHAR szDate[MAX_PATH];
+    WCHAR szUser[MAX_PATH];
+    WCHAR szComputer[MAX_PATH];
+    WCHAR szSource[MAX_PATH];
+    WCHAR szCategory[MAX_PATH];
+    WCHAR szEventID[MAX_PATH];
+    WCHAR szEventText[EVENT_MESSAGE_EVENTTEXT_BUFFER];
+    WCHAR szEventData[MAX_PATH];
     BOOL bEventData = FALSE;
-    LVITEM li;
+    LVITEMW li;
     EVENTLOGRECORD* pevlr;
     int iIndex;
 
@@ -1055,14 +1065,14 @@
 
     if (iIndex != -1)
     {
-        ListView_GetItemText(hwndListView, iIndex, 0, szEventType, sizeof(szEventType));
-        ListView_GetItemText(hwndListView, iIndex, 1, szDate, sizeof(szDate));
-        ListView_GetItemText(hwndListView, iIndex, 2, szTime, sizeof(szTime));
-        ListView_GetItemText(hwndListView, iIndex, 3, szSource, sizeof(szSource));
-        ListView_GetItemText(hwndListView, iIndex, 4, szCategory, sizeof(szCategory));
-        ListView_GetItemText(hwndListView, iIndex, 5, szEventID, sizeof(szEventID));
-        ListView_GetItemText(hwndListView, iIndex, 6, szUser, sizeof(szUser));
-        ListView_GetItemText(hwndListView, iIndex, 7, szComputer, sizeof(szComputer));
+        ListView_GetItemText(hwndListView, iIndex, 0, szEventType, sizeof(szEventType) * sizeof(WCHAR));
+        ListView_GetItemText(hwndListView, iIndex, 1, szDate, sizeof(szDate) * sizeof(WCHAR));
+        ListView_GetItemText(hwndListView, iIndex, 2, szTime, sizeof(szTime) * sizeof(WCHAR));
+        ListView_GetItemText(hwndListView, iIndex, 3, szSource, sizeof(szSource) * sizeof(WCHAR));
+        ListView_GetItemText(hwndListView, iIndex, 4, szCategory, sizeof(szCategory) * sizeof(WCHAR));
+        ListView_GetItemText(hwndListView, iIndex, 5, szEventID, sizeof(szEventID) * sizeof(WCHAR));
+        ListView_GetItemText(hwndListView, iIndex, 6, szUser, sizeof(szUser) * sizeof(WCHAR));
+        ListView_GetItemText(hwndListView, iIndex, 7, szComputer, sizeof(szComputer) * sizeof(WCHAR));
 
         bEventData = !(pevlr->DataLength == 0);
 
@@ -1081,22 +1091,22 @@
         EnableWindow(GetDlgItem(hDlg, IDC_BYTESRADIO), bEventData);
         EnableWindow(GetDlgItem(hDlg, IDC_WORDRADIO), bEventData);
 
-        SetDlgItemText(hDlg, IDC_EVENTDATESTATIC, szDate);
-        SetDlgItemText(hDlg, IDC_EVENTTIMESTATIC, szTime);
-        SetDlgItemText(hDlg, IDC_EVENTUSERSTATIC, szUser);
-        SetDlgItemText(hDlg, IDC_EVENTSOURCESTATIC, szSource);
-        SetDlgItemText(hDlg, IDC_EVENTCOMPUTERSTATIC, szComputer);
-        SetDlgItemText(hDlg, IDC_EVENTCATEGORYSTATIC, szCategory);
-        SetDlgItemText(hDlg, IDC_EVENTIDSTATIC, szEventID);
-        SetDlgItemText(hDlg, IDC_EVENTTYPESTATIC, szEventType);
-        SetDlgItemText(hDlg, IDC_EVENTTEXTEDIT, szEventText);
-        SetDlgItemText(hDlg, IDC_EVENTDATAEDIT, szEventData);
+        SetDlgItemTextW(hDlg, IDC_EVENTDATESTATIC, szDate);
+        SetDlgItemTextW(hDlg, IDC_EVENTTIMESTATIC, szTime);
+        SetDlgItemTextW(hDlg, IDC_EVENTUSERSTATIC, szUser);
+        SetDlgItemTextW(hDlg, IDC_EVENTSOURCESTATIC, szSource);
+        SetDlgItemTextW(hDlg, IDC_EVENTCOMPUTERSTATIC, szComputer);
+        SetDlgItemTextW(hDlg, IDC_EVENTCATEGORYSTATIC, szCategory);
+        SetDlgItemTextW(hDlg, IDC_EVENTIDSTATIC, szEventID);
+        SetDlgItemTextW(hDlg, IDC_EVENTTYPESTATIC, szEventType);
+        SetDlgItemTextW(hDlg, IDC_EVENTTEXTEDIT, szEventText);
+        SetDlgItemTextW(hDlg, IDC_EVENTDATAEDIT, szEventData);
     }
     else
     {
-        MessageBox(NULL,
-                   _TEXT("No Items in ListView"),
-                   _TEXT("Error"),
+        MessageBoxW(NULL,
+                   L"No Items in ListView",
+                   L"Error",
                    MB_OK | MB_ICONINFORMATION);
     }
 }
@@ -1164,9 +1174,9 @@
                     return (INT_PTR)TRUE;
 
                 case IDHELP:
-                    MessageBox(NULL,
-                               _TEXT("Help not implemented yet!"),
-                               _TEXT("Event Log"),
+                    MessageBoxW(NULL,
+                               L"Help not implemented yet!",
+                               L"Event Log",
                                MB_OK | MB_ICONINFORMATION);
                     return (INT_PTR)TRUE;
 



More information about the Ros-diffs mailing list