[DISK]
[reactos.git] / reactos / drivers / storage / class / disk / disk.c
index eee8624..483fbeb 100644 (file)
 #include <ntddscsi.h>
 #include <mountdev.h>
 #include <mountmgr.h>
+#include <ntiologc.h>
 #include <include/class2.h>
 #include <stdio.h>
 
 #define NDEBUG
 #include <debug.h>
 
-#define IO_WRITE_CACHE_ENABLED  ((NTSTATUS)0x80040020L)
-#define IO_WRITE_CACHE_DISABLED ((NTSTATUS)0x80040022L)
 
 #ifdef POOL_TAGGING
 #ifdef ExAllocatePool
@@ -385,11 +384,6 @@ Return Value:
     InitializationData.ClassShutdownFlush = ScsiDiskShutdownFlush;
     InitializationData.ClassCreateClose = NULL;
 
-    //
-    // HACK! Please check below to the implementation of the function
-    //
-    DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = ScsiDiskFileSystemControl;
-
     //
     // Call the class init routine
     //
@@ -1519,6 +1513,15 @@ Return Value:
     ULONG transferByteCount = currentIrpStack->Parameters.Read.Length;
     LARGE_INTEGER startingOffset;
 
+    //
+    // HACK: How can we end here with null sector size?!
+    //
+
+    if (deviceExtension->DiskGeometry->Geometry.BytesPerSector == 0) {
+        DPRINT1("Hack! Received invalid sector size\n");
+        deviceExtension->DiskGeometry->Geometry.BytesPerSector = 512;
+    }
+
     //
     // Verify parameters of this request.
     // Check that ending sector is within partition and
@@ -1555,7 +1558,18 @@ Return Value:
             Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
         }
 
-        DPRINT1("STATUS_INVALID_PARAMETER\n");
+        if (startingOffset.QuadPart > deviceExtension->PartitionLength.QuadPart) {
+            DPRINT1("Reading beyond partition end! startingOffset: %I64d, PartitionLength: %I64d\n", startingOffset.QuadPart, deviceExtension->PartitionLength.QuadPart);
+        }
+
+        if (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1)) {
+            DPRINT1("Not reading sectors! TransferByteCount: %lu, BytesPerSector: %lu\n", transferByteCount, deviceExtension->DiskGeometry->Geometry.BytesPerSector);
+        }
+
+        if (Irp->IoStatus.Status == STATUS_DEVICE_NOT_READY) {
+            DPRINT1("Failing due to device not ready!\n");
+        }
+
         return STATUS_INVALID_PARAMETER;
     }
 
@@ -2234,6 +2248,11 @@ Return Value:
 
             PPARTITION_INFORMATION outputBuffer;
 
+            if (diskData->PartitionNumber == 0) {
+                DPRINT1("HACK: Handling partition 0 request!\n");
+                //ASSERT(FALSE);
+            }
+
             //
             // Update the geometry in case it has changed.
             //
@@ -2255,12 +2274,6 @@ Return Value:
             //
 
             diskData->DriveNotReady = FALSE;
-// HACK: ReactOS partition numbers must be wrong (>0 part)
-            if (diskData->PartitionType == 0 && (diskData->PartitionNumber > 0)) {
-
-                status = STATUS_INVALID_DEVICE_REQUEST;
-                break;
-            }
 
             outputBuffer =
                     (PPARTITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
@@ -5214,116 +5227,3 @@ Return Value:
 
 } // end UpdateDeviceObjects()
 
-//
-// This function is supposed only to support NTFS tools
-// from M. Russinovich. This is kind of huge hack and is
-// totally undocumented :-).
-//
-NTSTATUS
-NtfsRussinovichism(PDEVICE_OBJECT DeviceObject,
-                   PIRP Irp)
-{
-#define FSCTL_GET_VOLUME_INFORMATION 0x90064
-    typedef struct {   
-        LARGE_INTEGER       SerialNumber;   
-        LARGE_INTEGER       NumberOfSectors;   
-        LARGE_INTEGER       TotalClusters;   
-        LARGE_INTEGER       FreeClusters;   
-        LARGE_INTEGER       Reserved;   
-        ULONG               BytesPerSector;   
-        ULONG               BytesPerCluster;   
-        ULONG               BytesPerMFTRecord;   
-        ULONG               ClustersPerMFTRecord;   
-        LARGE_INTEGER       MFTLength;   
-        LARGE_INTEGER       MFTStart;   
-        LARGE_INTEGER       MFTMirrorStart;   
-        LARGE_INTEGER       MFTZoneStart;   
-        LARGE_INTEGER       MFTZoneEnd;   
-    } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
-
-    PIO_STACK_LOCATION Stack;
-    NTSTATUS Status;
-    PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
-    PDISK_DATA diskData;
-
-    DPRINT1("NtfsRussinovichism(%p, %p)\n", DeviceObject, Irp);
-
-    Stack = IoGetCurrentIrpStackLocation(Irp);
-
-    switch (Stack->Parameters.FileSystemControl.FsControlCode)
-    {
-        case FSCTL_GET_VOLUME_INFORMATION:
-            //
-            // Check we received something we understand
-            //
-            if (Stack->Parameters.FileSystemControl.OutputBufferLength < sizeof(NTFS_VOLUME_DATA_BUFFER) ||
-                Irp->UserBuffer == NULL)
-            {
-                DPRINT1("Invalid output! %d %p\n", Stack->Parameters.FileSystemControl.OutputBufferLength, Irp->UserBuffer);
-                Status = STATUS_INVALID_PARAMETER;
-                break;
-            }
-
-            //
-            // Now, quickly check we are supposed to have a NTFS volume
-            //
-            diskData = (PDISK_DATA)(deviceExtension + 1);
-            if (diskData->PartitionType != PARTITION_IFS)
-            {
-                DPRINT1("Invalid partition type! %x\n", diskData->PartitionType);
-                Status = STATUS_INVALID_PARAMETER;
-                break;
-            }
-
-            UNIMPLEMENTED;
-            Status = STATUS_NOT_IMPLEMENTED;
-            break;
-
-        default:
-            Status = STATUS_INVALID_DEVICE_REQUEST;
-            break;
-    }
-
-    return Status;
-#undef FSCTL_GET_VOLUME_INFORMATION
-}
-
-//
-// Hack: this function is not supposed to be implemented
-// Even though it's required to enable some M. Russinovich
-// to directly request disks so that they can dump NTFS data
-// without going through the driver.
-// We don't expect doing more from here, hence the limited
-// implementation and support.
-//
-NTSTATUS
-NTAPI
-ScsiDiskFileSystemControl(PDEVICE_OBJECT DeviceObject,
-                          PIRP Irp)
-{
-    PIO_STACK_LOCATION Stack;
-    NTSTATUS Status;
-
-    DPRINT1("ScsiDiskFileSystemControl(%p, %p)\n", DeviceObject, Irp);
-
-    Stack = IoGetCurrentIrpStackLocation(Irp);
-
-    switch (Stack->MinorFunction)
-    {
-        case IRP_MN_USER_FS_REQUEST:
-            Status = NtfsRussinovichism(DeviceObject, Irp);
-            break;
-
-        default:
-            DPRINT("MinorFunction %d\n", Stack->MinorFunction);
-            Status = STATUS_INVALID_DEVICE_REQUEST;
-            break;
-    }
-
-    Irp->IoStatus.Status = Status;
-    Irp->IoStatus.Information = 0;
-
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return Status;
-}