Hi,
The ioctl handler for IOCTL_DISK_GET_DRIVE_GEOMETRY on .\\c: in
mountmgr.sys doesn't work. The call returns incorrect values that change
at random intervals.
Since the ioctl is defined as METHOD_BUFFERED I think it should be
putting DRIVE_GEOMETRY data in IRP-AssociatedIrp.SystemBuffer. Instead
the handler puts the data in IRP-MdlAddress.StartVa. Then process_ioctl
in ntoskrnl.exe wipes out the output data with the random stuff in the
allocated SystemBuffer.
I am out of my depth with windows driver handling code, but a web search
(http://www.cmkrnl.com/arc-ioctlbuf.html) says that SystemBuffer should
be where the data is put. Indeed, when I change to SystemBuffer the user
call to DeviceIoControl gets the right values back.
Am I on the right track?
Thanks, Michael Ost
PS: here's a proposed patch...
--- wine-1.1.7/dlls/mountmgr.sys/device.c.ORIG 2009-03-23
14:04:30.0 -0700
+++ wine-1.1.7/dlls/mountmgr.sys/device.c 2009-03-25
17:06:24.0 -0700
@@ -607,7 +607,7 @@
info.TracksPerCylinder = 255;
info.SectorsPerTrack = 63;
info.BytesPerSector = 512;
-memcpy( irp-MdlAddress-StartVa, info, len );
+memcpy( irp-AssociatedIrp.SystemBuffer, info, len );
irp-IoStatus.Information = len;
irp-IoStatus.u.Status = STATUS_SUCCESS;
break;