Daniel Berger
2006-Oct-23 01:34 UTC
[Win32utils-devel] Need some help with MMap#[] and MMap#[]=
Hi all,
At RubyConf this year I talked about win32-mmap with Patrick Hurley and
Ara Howard. Ara mentioned that Guy''s version of mmap (for Unix)
contains some string-like methods that let you access pieces of the view
like a string. Patrick and I came up with this (which requires the
latest windows-pr in cvs so that we can use a more flexible version of
memcpy, as well as some constants for VirtualAlloc):
def [](offset, length)
buf = 0.chr * length
memcpy(buf, @address + offset, length)
buf
end
def []=(offset, length, string)
memcpy(@address + offset, string, string.length)
end
This works as is but Ara also mentioned that some methods, such as
MMap#[]=, will autoexpand the allocation size if the offset + length is
greater than the initial allocation size. With the above implementation
the string gets chopped:
mmap = MMap.new(:file => ''test.txt'', :size => 3)
mmap[0,6] = "foobar" # only ''foo'' gets written
mmap.close
I thought this was doable with VirtualAlloc, but I can''t seem to get it
to work:
def []=(offset, length, string)
if offset + length > @size
diff = offset + length - size
addr = [@address + diff + 1].pack(''L'')
if VirtualAlloc(addr, diff, MEM_COMMIT|MEM_RESERVE,
PAGE_READWRITE) == 0
raise Error, get_last_error
end
end
memcpy(@address + offset, string, string.length)
end
When I try this, however, I get:
C:/ruby/lib/ruby/site_ruby/1.8/windows/memory.rb:82:in `call'': NULL
pointer given (ArgumentError)
from C:/ruby/lib/ruby/site_ruby/1.8/windows/memory.rb:82:in
`VirtualAlloc''
from C:/Documents and
Settings/djberge/workspace/win32-mmap/lib/win32/mmap.rb:309:in `[]=''
from test.rb:8
Am I using the right function? Do I have it declared correctly in
windows-pr? BTW, I also tried changed the function prototype for
VirtualAlloc from ''PLLL'' to just ''LLLL'' and
using the numeric address
directly, but that didn''t seem to help.
Any ideas?
Thanks,
Dan
PS - It was great to see the guys from win32utils-devel who showed up at
RubyConf!
