Page 1 of 1

Need help with Windows DDK -> DeviceIoControl()

Posted: Tue Jul 26, 2005 6:35 pm
by Straker
Hi All.

Ok - I have spent days on this and am not getting far.

I am trying to use IOCTL_STORAGE_QUERY_PROPERTY (defined in ntddstor.h) as a parameter to DeviceIoControl.

This previous forum thread shows using DeviceIoControl with a different value yet it was predefined by Hi-Toro (next to last post):

viewtopic.php?t=2643&highlight=deviceiocontrol

Specifically, this line:
#IOCTL_DISK_GET_DRIVE_GEOMETRY = $70000
However, all of these values are defined by a CTL_CODE "macro" (whatever that is), because the header file (winioctl.h) shows this:
#define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
So my question is:

How did Hi-Toro arrive at the correct value in purebasic based upon the Windows DDK definition?

The parameter I am trying to use, IOCTL_STORAGE_QUERY_PROPERTY, is defined in ntddstor.h as:
#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
Can anyone help me determine the value of IOCTL_STORAGE_QUERY_PROPERTY?

Thanks, but I am stumped.
:(

Posted: Tue Jul 26, 2005 9:49 pm
by KarLKoX

Code: Select all

#FILE_DEVICE_DISK = $00000007
#IOCTL_DISK_BASE  = #FILE_DEVICE_DISK
#METHOD_BUFFERED  = 0
#FILE_ANY_ACCESS  = 0

Procedure CTL_CODE(DeviceType, Function, Method, Access)
  procedurereturn ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
EndProcedure

IOCTL_DISK_GET_DRIVE_GEOMETRY = CTL_CODE(#IOCTL_DISK_BASE, $0000, #METHOD_BUFFERED, #FILE_ANY_ACCESS)

Posted: Tue Jul 26, 2005 10:43 pm
by Straker
Thanks KarLKoX!

I think that did it. Below is the code modified to meet my needs:

Code: Select all

#FILE_DEVICE_MASS_STORAGE = $0000002D
#IOCTL_STORAGE_BASE  = #FILE_DEVICE_MASS_STORAGE
#METHOD_BUFFERED  = 0
#FILE_ANY_ACCESS  = 0

Procedure CTL_CODE(DeviceType, Function, Method, Access)
  ProcedureReturn ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
EndProcedure

IOCTL_STORAGE_QUERY_PROPERTY = CTL_CODE(#IOCTL_STORAGE_BASE, $0500, #METHOD_BUFFERED, #FILE_ANY_ACCESS)
BTW, it returns 2954240 (dec) or $2D1400

Thanks again!