I'm porting some code from Linux to Windows which relies on direct
access to a CD's block device.  This "just works" on Linux if I
File.open("/dev/cdrom"), but I can't see how to make it work on Windows.

While manually running a dl/imported CreateFile works and gives me a
valid handle, just running File.open("\\\\.\\D:", "r") crashes the
interpreter (1.9.3-p0), as does IO.sysopen.

Is there a built-in way to turn an open handle into a File object?  I
blindly tried IO.for_fd, but that fails and I got no further.

Here's the code I've tried (and yes, there is a CD in the drive :-) ):

    require 'dl/import'
    DriveTypes = [:unknown, :no_root_dir,
      :removable, :fixed, :remote, :cdrom, :ramdisk]

    module Kernel32
      def self.stdcall(fn); extern fn, :stdcall; end
      extend DL::Importer
      dlload "kernel32.dll"

      stdcall "uint GetDriveType( void * )"
      stdcall "long CreateFile( void *, long, long, void *, long, long,
long )"
      stdcall "int  CloseHandle( long )"
    end

    case DriveTypes[Kernel32.GetDriveType( "D:\\" )]
    when :cdrom
      handle = Kernel32.CreateFile( "\\\\.\\D:", 0, 3, 0, 3, 128, 0 )
      if handle == -1
        puts "O NOES"
      else
        puts "Ok"
        Kernel32.CloseHandle( handle )
      end
    else
      puts "Not a CD"
    end

This prints "Ok", so I know that the handle I'm getting back is at least
valid from Windows' point of view.

--
Alex

-- 
Posted via http://www.ruby-forum.com/.