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

Daniel Berger djberg96 at gmail.com
Wed Jun 21 08:48:59 EDT 2006


Heesob Park wrote:
> 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.
>
> Regards,
>
> Park Heesob
> _______________________________________________
> win32utils-devel mailing list
> win32utils-devel at rubyforge.org
> http://rubyforge.org/mailman/listinfo/win32utils-devel
>
>   
Ok, thanks.  I guess part of the reason I got confused as to why you 
can't do this:

irb(main):016:0> bar = 'hello'
=> "hello"
irb(main):017:0> bar.unpack("l").pack("l").unpack("p")
ArgumentError: no associated pointer

Is Ruby attaching some metadata to the string that can only be gotten to 
if it's packed with 'p'?  I mean, why can't you go from address to object?

Thanks,

Dan


More information about the win32utils-devel mailing list