[Win32utils-devel] Yet another data structure + pack/unpack question (win32-service)

Heesob Park phasis at gmail.com
Wed Jun 21 02:12:36 EDT 2006


2006/6/21, Heesob Park <phasis at gmail.com>:
> Hi,
>
> 2006/6/21, Daniel Berger <djberg96 at gmail.com>:
> > Hi all,
> >
> > If you take a look at the service.rb file in the win32-service
> > repository (the new one in the toplevel repository path), I've got this
> > bit of code, which succeeds, but I can't seem to unpack the data
> > structure properly.  Did I pack it wrong to begin with?  I should know
> > this but I'm spacing out.
> >
> > proc_status       = [0,0,0,0,0,0,0,0,0,0].pack('LLLLLLLLLL')
> > enum_service      = [0.chr, 0.chr].pack('pp') + proc_status
> > service_buf       = enum_service * 1000
> > bytes_needed      = [0].pack('L')
> > services_returned = [0].pack('L')
> > resume_handle     = [0].pack('L')
> >
> > bool = EnumServicesStatusEx(
> >   handle_scm,
> >   SC_ENUM_PROCESS_INFO,
> >   SERVICE_WIN32 | SERVICE_DRIVER,
> >   SERVICE_STATE_ALL,
> >   service_buf,
> >   service_buf.size,
> >   bytes_needed,
> >   services_returned,
> >   resume_handle,
> >   group
> > )
> >
> > if bool
> >   num_services = services_returned.unpack('L').first
> >   index = 0
> >
> >   1.upto(num_services){ |num|
> >      info = service_buf[index, enum_service.size-1]
> >      service_name = info[0,4].pack('p') # boom!
> >      index += enum_service.size
> >   }
> > end
> >
> I guess you still don't understand the difference of C pointer and
> ruby buffer :)
>
> Try this:
>
> Strcpy  = Win32API.new('msvcrt', 'strcpy', 'PL', 'L')
>
>  1.upto(num_services){ |num|
>     info = service_buf[index, enum_service.size-1]
>     service_name = 0.chr * 256
>     Strcpy.call(service_name,info[0,4].unpack('L').first)
>     service_name = service_name.strip
>     index += enum_service.size
>  }
>
> But, the code still segfault for another bug.
>
And I found the bug.

proc_status       = [0,0,0,0,0,0,0,0,0,0].pack('LLLLLLLLLL')
should be
proc_status       = [0,0,0,0,0,0,0,0,0].pack('LLLLLLLLL')

Regards,

Park Heesob


More information about the win32utils-devel mailing list