Implement ReportEventAQ take 2

Mike Hearn mike at theoretic.com
Fri Nov 7 05:55:07 CST 2003


This time we use TRACE/WARN/ERR debug

Mike Hearn <mike at theoretic.com>
Implement ReportEventA/W

--- orig/dlls/advapi32/eventlog.c
+++ mod/dlls/advapi32/eventlog.c
@@ -1,7 +1,9 @@
 /*
  * Win32 advapi functions
  *
- * Copyright 1995 Sven Verdoolaege, 1998 Juergen Schmied
+ * Copyright 1995 Sven Verdoolaege
+ *           1998 Juergen Schmied
+ *           2003 Mike Hearn
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -29,7 +31,8 @@
 #include "wine/debug.h"
  
 WINE_DEFAULT_DEBUG_CHANNEL(advapi);
-
+WINE_DECLARE_DEBUG_CHANNEL(eventlog);
+
 /******************************************************************************
  * BackupEventLogA [ADVAPI32.@]
  */
@@ -257,8 +260,49 @@
 BOOL WINAPI ReportEventA ( HANDLE hEventLog, WORD wType, WORD wCategory, DWORD dwEventID,
     PSID lpUserSid, WORD wNumStrings, DWORD dwDataSize, LPCSTR *lpStrings, LPVOID lpRawData)
 {
-       FIXME("stub\n");
-       return TRUE;
+    LPCWSTR *wideStrArray;
+    LPCWSTR *wsArrayIndex;
+    UNICODE_STRING *usArray;
+    UNICODE_STRING *usIndex;
+    int i;
+    BOOL ret;
+
+    if (wNumStrings == 0) return TRUE;
+    if (!lpStrings) return TRUE;
+
+    /* we need to create widestrings by using the RtlCreateUnicodeString API, but we also need to convert
+       an entire array of them, while ensuring there are no memory leaks. We have two dynamic arrays,
+       one of the intermediate UNICODE_STRINGs, and another of the resultant widestrs.
+       We keep the UNICODE_STRINGs around because they need to be freed after the call to ReportEventW.
+
+       There is probably a better way to do this -mike
+    */
+
+    wideStrArray = HeapAlloc(GetProcessHeap(), 0, sizeof(LPCWSTR) * wNumStrings);
+    usArray = HeapAlloc(GetProcessHeap(), 0, sizeof(UNICODE_STRING) * wNumStrings);
+
+    wsArrayIndex = wideStrArray;
+    usIndex = usArray;
+    for (i = 0; i < wNumStrings; i++) {
+       RtlCreateUnicodeStringFromAsciiz(usIndex, *lpStrings);
+       *wsArrayIndex = (*usIndex).Buffer;
+       wsArrayIndex++;
+       usIndex++;
+       lpStrings++;
+    }
+
+    ret = ReportEventW(hEventLog, wType, wCategory, dwEventID, lpUserSid, wNumStrings, dwDataSize, wideStrArray, lpRawData);
+
+    usIndex = usArray;
+    for (i = 0; i < wNumStrings; i++) {
+       RtlFreeUnicodeString(usIndex);
+       usIndex++;
+    }
+
+    HeapFree(GetProcessHeap(), 0, wideStrArray);
+    HeapFree(GetProcessHeap(), 0, usArray);
+
+    return ret;
 }
  
 /******************************************************************************
@@ -280,6 +324,27 @@
                 DWORD dwEventID, PSID lpUserSid, WORD wNumStrings,
                 DWORD dwDataSize, LPCWSTR *lpStrings, LPVOID lpRawData )
 {
-       FIXME("stub\n");
-       return TRUE;
+    int i;
+    LPCWSTR str;
+
+    /* partial stub */
+
+    if (wNumStrings == 0) return TRUE;
+    if (!lpStrings) return TRUE;
+
+    str = *lpStrings;
+    for (i = 0; i < wNumStrings; i++) {
+       if (str) {
+           switch (wType) {
+               case EVENTLOG_SUCCESS: TRACE_(eventlog)("EVENT LOG: %s\n", debugstr_w(str)); break;
+               case EVENTLOG_ERROR_TYPE: ERR_(eventlog)("EVENT LOG: %s\n", debugstr_w(str)); break;
+               case EVENTLOG_WARNING_TYPE: WARN_(eventlog)("EVENT LOG: %s\n", debugstr_w(str)); break;
+               default:
+                 TRACE_(eventlog)("EVENT LOG: %s\n", debugstr_w(str)); break;
+           }
+       }
+       str = *(++lpStrings);
+    }
+    return TRUE;
+
 }
 





More information about the wine-patches mailing list