[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