/usr/lib/ruby/vendor_ruby/childprocess/windows/handle.rb is in ruby-childprocess 0.5.9-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | module ChildProcess
module Windows
class Handle
class << self
private :new
def open(pid, access = PROCESS_ALL_ACCESS)
handle = Lib.open_process(access, false, pid)
if handle.null?
raise Error, Lib.last_error_message
end
h = new(handle, pid)
return h unless block_given?
begin
yield h
ensure
h.close
end
end
end
attr_reader :pointer
def initialize(pointer, pid)
unless pointer.kind_of?(FFI::Pointer)
raise TypeError, "invalid handle: #{pointer.inspect}"
end
if pointer.null?
raise ArgumentError, "handle is null: #{pointer.inspect}"
end
@pid = pid
@pointer = pointer
@closed = false
end
def exit_code
code_pointer = FFI::MemoryPointer.new :ulong
ok = Lib.get_exit_code(@pointer, code_pointer)
if ok
code_pointer.get_ulong(0)
else
close
raise Error, Lib.last_error_message
end
end
def send(signal)
case signal
when 0
exit_code == PROCESS_STILL_ALIVE
when WIN_SIGINT
Lib.generate_console_ctrl_event(CTRL_C_EVENT, @pid)
when WIN_SIGBREAK
Lib.generate_console_ctrl_event(CTRL_BREAK_EVENT, @pid)
when WIN_SIGKILL
ok = Lib.terminate_process(@pointer, @pid)
Lib.check_error ok
else
thread_id = FFI::MemoryPointer.new(:ulong)
module_handle = Lib.get_module_handle("kernel32")
proc_address = Lib.get_proc_address(module_handle, "ExitProcess")
thread = Lib.create_remote_thread(@pointer, 0, 0, proc_address, 0, 0, thread_id)
check_error thread
Lib.wait_for_single_object(thread, 5)
true
end
end
def close
return if @closed
Lib.close_handle(@pointer)
@closed = true
end
def wait(milliseconds = nil)
Lib.wait_for_single_object(@pointer, milliseconds || INFINITE)
end
end # Handle
end # Windows
end # ChildProcess
|