    # File lib/chef/mixin/command/windows.rb, line 31
            def popen4(cmd, args={}, &b)

              # By default, we are waiting before we yield the block.
              args[:waitlast] ||= false

              #XXX :user, :group, :environment support?

              Open3.popen3(cmd) do |stdin,stdout,stderr,cid|
                if b
                  if args[:waitlast]
                    b[cid, stdin, stdout, stderr]
                    # send EOF so that if the child process is reading from STDIN
                    # it will actually finish up and exit
                    stdin.close_write
                  else
                    o = StringIO.new
                    e = StringIO.new

                    stdin.close

                    stdout.sync = true
                    stderr.sync = true

                    line = stdout.gets(nil)
                    if line
                      o.write(line)
                    end
                    line = stderr.gets(nil)
                    if line
                      e.write(line)
                    end
                    o.rewind
                    e.rewind
                    b[cid, stdin, o, e]
                  end
                else
                  [cid, stdin, stdout, stderr]
                end
              end
              $?
            end