[Win32utils-devel] Need a little help with the pure Ruby win32-eventlog

Heesob Park phasis at gmail.com
Tue May 16 23:51:08 EDT 2006


Hi,

2006/5/17, Daniel Berger <djberg96 at gmail.com>:
> Hi all,
>
> I'm working on the EventLog#read method for the pure Ruby version of
> win32-eventlog, but I'm stuck on the get_description private method.
>
> Here are the problems:
>
> * I don't think I'm advancing the EVENTLOGRECORD properly between
> iterations.  Take a look at the end of the "while dwread > 0" loop.  I
> get some records, but not all of them.
>
> * I'm not sure how to properly populate or pack/unpack the va_list,
> which is later passed to the FormatMessage() function.
>
> Please take a look.
>
> Thanks,
>
> Dan

Here is the patch:

--- eventlog.rb	2006-05-17 10:40:34.000000000 +0900
+++ eventlog.rb.new	2006-05-17 12:46:18.978361600 +0900
@@ -227,6 +227,7 @@
                struct.event_type     = event_type
                struct.user           = user
                struct.category       = buf[26,2].unpack('S').first
+               struct.description 	 = desc

                if block_given?
                   yield struct
@@ -239,9 +240,9 @@
                end

                length = buf[0,4].unpack('L').first # Length
-
-               dwread -= buf.strip.length
-               buf += 0.chr * length
+
+               dwread -= length
+               buf = buf[length..-1]
             end

             buf = 0.chr * BUFFER_SIZE
@@ -254,19 +255,20 @@
       private

       # TODO: finish
-      def get_description(rec, event_source)
-         str     = rec[36,4].unpack('L').first # StringOffset
+      def get_description(rec, event_source)
+         str     = [rec].pack('P').unpack('L').first +
rec[36,4].unpack('L').first # StringOffset
          num     = rec[24,2].unpack('S').first # NumStrings
          hkey    = [0].pack('L')
          key     = BASE_KEY + "#{@source}\\#{event_source}"
          va_list = []
+         buf = 0.chr * 1024

          # TODO: Fix this loop
          0.upto(num){
             va_list.push(str)
             str += str.size + 1
          }
-
+         	va_list_ptr = va_list.pack('L*')
          if RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, hkey) == 0
             value = 'EventMessageFile'
             file  = 0.chr * MAX_SIZE
@@ -284,9 +286,7 @@
                   hmodule  = LoadLibraryEx(file, 0, LOAD_LIBRARY_AS_DATAFILE)
                   event_id = rec[20,4].unpack('L').first
                   if hmodule != 0
-                     buf = 0.chr * 260
                      FormatMessage(
-                        FORMAT_MESSAGE_ALLOCATE_BUFFER |
                         FORMAT_MESSAGE_FROM_HMODULE |
                         FORMAT_MESSAGE_FROM_SYSTEM |
                         FORMAT_MESSAGE_ARGUMENT_ARRAY,
@@ -295,7 +295,7 @@
                         0,
                         buf,
                         buf.size,
-                        va_list # TODO: unpack this properly
+                        va_list_ptr
                      )
                      FreeLibrary(hmodule)
                   end
@@ -304,6 +304,6 @@

             RegCloseKey(hkey)
          end
+         buf.strip
       end


Regards,

Park Heesob



More information about the win32utils-devel mailing list