mountmgr.sys: Handle IOCTL_DISK_GET_DRIVE_GEOMETRY_EX.
authorAndré Hentschel <nerv@dawncrow.de>
Wed, 9 Mar 2011 19:45:18 +0000 (20:45 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 10 Mar 2011 15:30:15 +0000 (16:30 +0100)
dlls/mountmgr.sys/device.c
include/winioctl.h

index c4b4b72a509390ab3c3df05142e7e2da94e2c0d1..8b91be6333fee1d1efabfe3879857afec1d7e9e3 100644 (file)
@@ -895,6 +895,26 @@ static NTSTATUS WINAPI harddisk_ioctl( DEVICE_OBJECT *device, IRP *irp )
         irp->IoStatus.u.Status = STATUS_SUCCESS;
         break;
     }
+    case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX:
+    {
+        DISK_GEOMETRY_EX info;
+        DWORD len = min( sizeof(info), irpsp->Parameters.DeviceIoControl.OutputBufferLength );
+
+        FIXME("The DISK_PARTITION_INFO and DISK_DETECTION_INFO structures will not be filled\n");
+
+        info.Geometry.Cylinders.QuadPart = 10000;
+        info.Geometry.MediaType = (dev->devnum.DeviceType == FILE_DEVICE_DISK) ? FixedMedia : RemovableMedia;
+        info.Geometry.TracksPerCylinder = 255;
+        info.Geometry.SectorsPerTrack = 63;
+        info.Geometry.BytesPerSector = 512;
+        info.DiskSize.QuadPart = info.Geometry.Cylinders.QuadPart * info.Geometry.TracksPerCylinder *
+                                 info.Geometry.SectorsPerTrack * info.Geometry.BytesPerSector;
+        info.Data[0]  = 0;
+        memcpy( irp->MdlAddress->StartVa, &info, len );
+        irp->IoStatus.Information = len;
+        irp->IoStatus.u.Status = STATUS_SUCCESS;
+        break;
+    }
     case IOCTL_STORAGE_GET_DEVICE_NUMBER:
     {
         DWORD len = min( sizeof(dev->devnum), irpsp->Parameters.DeviceIoControl.OutputBufferLength );
index d1c337690b4230cceb4721d88bc8164d17a55ad1..7f04d5905aad305ae3250509a8bc9037154f08be 100644 (file)
 #define SMART_GET_VERSION               CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
 #define SMART_SEND_DRIVE_COMMAND        CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 #define SMART_RCV_DRIVE_DATA            CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
 #define IOCTL_VOLUME_BASE ((DWORD)'V')
 #define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS      CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
@@ -325,6 +326,12 @@ typedef struct _DISK_GEOMETRY {
     DWORD               BytesPerSector;
 } DISK_GEOMETRY, *PDISK_GEOMETRY;
 
+typedef struct _DISK_GEOMETRY_EX {
+    DISK_GEOMETRY       Geometry;
+    LARGE_INTEGER       DiskSize;
+    BYTE                Data[1];
+} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
+
 typedef struct _PARTITION_INFORMATION {
     LARGE_INTEGER       StartingOffset;
     LARGE_INTEGER       PartitionLength;