131: def send_query(query)
132: res = nil
133: filemap = 0
134: ptr = nil
135: id = DL::PtrData.malloc(DL.sizeof("L"))
136:
137: mapname = "PageantRequest%08x\000" % Win.getCurrentThreadId()
138: filemap = Win.createFileMapping(Win::INVALID_HANDLE_VALUE,
139: Win::NULL,
140: Win::PAGE_READWRITE, 0,
141: AGENT_MAX_MSGLEN, mapname)
142: if filemap == 0
143: raise Net::SSH::Exception,
144: "Creation of file mapping failed"
145: end
146:
147: ptr = Win.mapViewOfFile(filemap, Win::FILE_MAP_WRITE, 0, 0,
148: AGENT_MAX_MSGLEN)
149:
150: if ptr.nil? || ptr.null?
151: raise Net::SSH::Exception, "Mapping of file failed"
152: end
153:
154: ptr[0] = query
155:
156: cds = [AGENT_COPYDATA_ID, mapname.size + 1, mapname].
157: pack("LLp").to_ptr
158: succ = Win.sendMessageTimeout(@win, Win::WM_COPYDATA, Win::NULL,
159: cds, Win::SMTO_NORMAL, 5000, id)
160:
161: if succ > 0
162: retlen = 4 + ptr.to_s(4).unpack("N")[0]
163: res = ptr.to_s(retlen)
164: end
165:
166: return res
167: ensure
168: Win.unmapViewOfFile(ptr) unless ptr.nil? || ptr.null?
169: Win.closeHandle(filemap) if filemap != 0
170: end