IOCTL_DISK_GET_DRIVE_GEOMETRY in mountmgr.sys
Michael Ost
most at museresearch.com
Wed Mar 25 19:09:16 CDT 2009
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.000000000 -0700
+++ wine-1.1.7/dlls/mountmgr.sys/device.c 2009-03-25
17:06:24.000000000 -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;
More information about the wine-devel
mailing list