def send_query( query )
res = nil
filemap = 0
ptr = nil
id = DL::PtrData.malloc( DL.sizeof("L") )
mapname = "PageantRequest%08x\000" % Win.getCurrentThreadId()
filemap = Win.createFileMapping(Win::INVALID_HANDLE_VALUE,
Win::NULL,
Win::PAGE_READWRITE, 0,
AGENT_MAX_MSGLEN, mapname)
if filemap == 0
raise Net::SSH::Exception,
"Creation of file mapping failed"
end
ptr = Win.mapViewOfFile( filemap, Win::FILE_MAP_WRITE, 0, 0,
AGENT_MAX_MSGLEN )
if ptr.nil? || ptr.null?
raise Net::SSH::Exception, "Mapping of file failed"
end
ptr[0] = query
cds = [AGENT_COPYDATA_ID, mapname.size + 1, mapname].
pack("LLp").to_ptr
succ = Win.sendMessageTimeout( @win, Win::WM_COPYDATA, Win::NULL,
cds, Win::SMTO_NORMAL, 5000, id )
if succ > 0
retlen = 4 + ptr.to_s(4).unpack("N")[0]
res = ptr.to_s(retlen)
end
return res
ensure
Win.unmapViewOfFile( ptr ) unless ptr.nil? || ptr.null?
Win.closeHandle( filemap ) if filemap != 0
end