[Win32utils-devel] DeviceIoControl + IOCTL_DISK_GET_DRIVE_GEOMETRY problem

Heesob Park phasis at gmail.com
Tue May 6 21:38:13 EDT 2008


Hi,

2008/5/7 Berger, Daniel <Daniel.Berger at qwest.com>:
> Hi all,
>
> Ok, what am I doing wrong here?
>
> require 'windows/device_io'
> require 'windows/handle'
> require 'windows/error'
> include Windows::DeviceIO
> include Windows::Handle
> include Windows::Error
>
> fh = File.open('test.txt') # Assume you have this
>
> handle = get_osfhandle(fh.fileno)
>
> if handle == INVALID_HANDLE_VALUE
>   puts "get_osfhandle failed"
>   fh.close
>   exit
> end
>
> buf   = 0.chr * 24 # sizeof(DISK_GEOMETRY)
> bytes = [0].pack('L')
>
> bool = DeviceIoControl(
>   handle,
>   IOCTL_DISK_GET_DRIVE_GEOMETRY(), # 458752
>   nil,
>   0,
>   buf,
>   buf.size,
>   bytes,
>   0
> )
>
> # Fails here
> unless bool
>   puts "DeviceIoControl failed: " + get_last_error
>   fh.close
>   exit
> End
>
> fh.close
>
> Thanks,
>
> Dan
>
> PS - I've added several IOCTL macro methods to Windows::DeviceIO in CVS
> (part of windows-pr).
>
>
What do you want to do?
DeviceIoControl works not with file handle but with device handle.

Here is a working code:

require 'windows/file'
require 'windows/device_io'
require 'windows/handle'
require 'windows/error'
include Windows::File
include Windows::DeviceIO
include Windows::Handle
include Windows::Error

buf   = 0.chr * 24 # sizeof(DISK_GEOMETRY)
bytes = [0].pack('L')
handle = CreateFile("\\\\.\\c:",0,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0)
bool = DeviceIoControl(
  handle,
  IOCTL_DISK_GET_DRIVE_GEOMETRY(), # 458752
  nil,
  0,
  buf,
  buf.size,
  bytes,
  0
)

unless bool
  puts "DeviceIoControl failed: " + get_last_error
  fh.close
  exit
end



Regards,
Park Heesob


More information about the win32utils-devel mailing list