# File lib/chef/shell_out/windows.rb, line 38
      def run_command

        #
        # Create pipes to capture stdout and stderr,
        #
        stdout_read, stdout_write = IO.pipe
        stderr_read, stderr_write = IO.pipe
        stdin_read, stdin_write = IO.pipe
        open_streams = [ stdout_read, stderr_read ]

        begin

          #
          # Set cwd, environment, appname, etc.
          #
          app_name, command_line = command_to_run
          create_process_args = {
            :app_name => app_name,
            :command_line => command_line,
            :startup_info => {
              :stdout => stdout_write,
              :stderr => stderr_write,
              :stdin => stdin_read
            },
            :environment => inherit_environment.map { |k,v| "#{k}=#{v}" },
            :close_handles => false
          }
          create_process_args[:cwd] = cwd if cwd

          #
          # Start the process
          #
          process = Process.create(create_process_args)
          begin

            #
            # Wait for the process to finish, consuming output as we go
            #
            start_wait = Time.now
            while true
              wait_status = WaitForSingleObject(process.process_handle, 0)
              case wait_status
                when WAIT_OBJECT_0
                  # Get process exit code
                  exit_code = [0].pack('l')
                  unless GetExitCodeProcess(process.process_handle, exit_code)
                    raise get_last_error
                  end
                  @status = ThingThatLooksSortOfLikeAProcessStatus.new
                  @status.exitstatus = exit_code.unpack('l').first

                  return self
                when WAIT_TIMEOUT
                  # Kill the process
                  if (Time.now - start_wait) > timeout
                    raise Chef::Exceptions::CommandTimeout, "command timed out:\n#{format_for_exception}"
                  end

                  consume_output(open_streams, stdout_read, stderr_read)
                else
                  raise "Unknown response from WaitForSingleObject(#{process.process_handle}, #{timeout*1000}): #{wait_status}"
              end

            end

          ensure
            CloseHandle(process.thread_handle)
            CloseHandle(process.process_handle)
          end

        ensure
          #
          # Consume all remaining data from the pipes until they are closed
          #
          stdout_write.close
          stderr_write.close

          while consume_output(open_streams, stdout_read, stderr_read)
          end
        end
      end