DeviceIoControl

Laurent Pinchart laurent.pinchart at skynet.be
Thu Apr 4 02:02:58 CST 2002


>
>
>in fact DeviceIOControl is used in two completly separate ways:
>1/ control VxD
>2/ control "device" handles on specific types
>
>the control on VxD is needed for Win 9x support. In that case the HIWORD
>of the iocontrol code is always 0. So, in that case, a lookup is made in
>the list of known VxD:s if wae can handle the request.
>
Ok. I read the "Calling DeviceIoControl on Windows 95/98/Me" MSDN page, 
and I now understand what it's about.

>the control on "device" handles is done when the high word of the
>control code is non 0. 
>
>as of today (but it's a bit hacky) handles to "device" and VxD:s are
>viewed (in the server) as very simple objects. They only provide a 
>
>clientID (a DWORD). all the calls to DeviceIOControl start by getting
>
>this client ID. 
>
>If the value has the bit 0x10000 set, it means it's a VxD. The low word
>of the client id then identifies the standard ID of the VxD.
>
You're refering to both VxDs and WDM (.sys) drivers, right ?

How does the server find the correct low word of the client ID ? The 
driver I want to implement has a device type of 0xef00 (value passed to 
IoCreateDevice). I added a field to the VxD table with id set to 0xef00. 
Does wine, when I call CreateFile( "\\\\.\\MyDevice", ... ), check that 
table and set the client ID low word to the proper value ?

>If the 0x20000 bit is set, it's in fact a handle a device. Driver A:
>through Z: are mapped to 0 to 25 values (in the low word)
>
>Otherwise, it's a handle to the old DOS named devices (with their old
>IDs too)
>
I think we should handler those cases in a new device handler (which 
would just test if the device is a CDROM for now).

>So, back to DeviceIoControl when the high word of the io control code is
>0. We expect device handle in that case (but don't test the 0x20000 bit for
>error reporting), and then try to check if the device (from it's driver
>letter) is a CDROM, and if so apply the io control on it. Support of io
>
>control on other types of device (hard disks, storage...) isn't done at the moment.
>
You mean when the high word is not 0, right ?

I'll add a check for the 0x10000 and 0x20000 bits, and will dispatch the 
call to either a VxD or a device handler. Is that ok ?Can I use the same 
VxD list as for (HIWORD(dwIoControlCode) == 0 ) ?

Laurent Pinchart





More information about the wine-devel mailing list