Return an error instead of STATUS_SUCCESS for functions which are not implemented...
[reactos.git] / reactos / drivers / storage / scsiport / scsiport.c
index 8fa4a7b..e37fa9e 100644 (file)
@@ -32,6 +32,7 @@
 #include <ddk/srb.h>
 #include <ddk/scsi.h>
 #include <ddk/ntddscsi.h>
+#include <ddk/ntddstor.h>
 #include <stdio.h>
 
 #define NDEBUG
@@ -478,7 +479,7 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension,
     }
   if (Srb == NULL)
     {
-      EndAddress = DeviceExtension->VirtualAddress + DeviceExtension->CommonBufferLength;
+      EndAddress = (PVOID)((ULONG_PTR)DeviceExtension->VirtualAddress + DeviceExtension->CommonBufferLength);
       if (VirtualAddress >= DeviceExtension->VirtualAddress && VirtualAddress < EndAddress)
         {
          Offset = (ULONG_PTR)VirtualAddress - (ULONG_PTR)DeviceExtension->VirtualAddress;
@@ -506,14 +507,14 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension,
     }
   else
     {
-      EndAddress = Srb->DataBuffer + Srb->DataTransferLength;
+      EndAddress = (PVOID)((ULONG_PTR)Srb->DataBuffer + Srb->DataTransferLength);
       if (VirtualAddress == NULL)
        {
          VirtualAddress = Srb->DataBuffer;
        }
       else if (VirtualAddress < Srb->DataBuffer || VirtualAddress >= EndAddress)
        {
-         EndAddress = Srb->SenseInfoBuffer + Srb->SenseInfoBufferLength;
+         EndAddress = (PVOID)((ULONG_PTR)Srb->SenseInfoBuffer + Srb->SenseInfoBufferLength);
          if (VirtualAddress < Srb->SenseInfoBuffer || VirtualAddress >= EndAddress)
            {
              PhysicalAddress.QuadPart = 0LL;
@@ -530,18 +531,18 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension,
        }
 
       BufferLength = PAGE_SIZE - (ULONG_PTR)VirtualAddress % PAGE_SIZE;
-      while (VirtualAddress + BufferLength < EndAddress)
+      while ((ULONG_PTR)VirtualAddress + BufferLength < (ULONG_PTR)EndAddress)
        {
-         NextPhysicalAddress = MmGetPhysicalAddress(VirtualAddress + BufferLength);
+         NextPhysicalAddress = MmGetPhysicalAddress((PVOID)((ULONG_PTR)VirtualAddress + BufferLength));
          if (PhysicalAddress.QuadPart + BufferLength != NextPhysicalAddress.QuadPart)
            {
              break;
            }
          BufferLength += PAGE_SIZE;
        }
-      if (VirtualAddress + BufferLength >= EndAddress)
+      if ((ULONG_PTR)VirtualAddress + BufferLength >= (ULONG_PTR)EndAddress)
        {
-         BufferLength = EndAddress - VirtualAddress;
+         BufferLength = (ULONG)((ULONG_PTR)EndAddress - (ULONG_PTR)VirtualAddress);
        }
     }
   if (Length != NULL)
@@ -1710,10 +1711,10 @@ ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject,
 {
   PIO_STACK_LOCATION Stack;
   PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
+  NTSTATUS Status = STATUS_SUCCESS;
 
   DPRINT("ScsiPortDeviceControl()\n");
 
-  Irp->IoStatus.Status = STATUS_SUCCESS;
   Irp->IoStatus.Information = 0;
 
 
@@ -1755,16 +1756,35 @@ ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject,
          DPRINT("Inquiry data size: %lu\n", Irp->IoStatus.Information);
        }
        break;
+      
+      case IOCTL_SCSI_PASS_THROUGH:
+        DPRINT("  IOCTL_SCSI_PASS_THROUGH\n");
+        Status = STATUS_NOT_IMPLEMENTED;
+        break;
+
+      case IOCTL_SCSI_PASS_THROUGH_DIRECT:
+        DPRINT("  IOCTL_SCSI_PASS_THROUGH_DIRECT\n");
+        Status = STATUS_NOT_IMPLEMENTED;
+        break;
+
+      case IOCTL_SCSI_MINIPORT:
+        DPRINT1("  IOCTL_SCSI_MINIPORT\n");
+        DPRINT1("  Signature: %.8s\n", ((PSRB_IO_CONTROL)Irp->AssociatedIrp.SystemBuffer)->Signature);
+        DPRINT1("  ControlCode: 0x%lX\n", ((PSRB_IO_CONTROL)Irp->AssociatedIrp.SystemBuffer)->ControlCode);
+        Status = STATUS_INVALID_DEVICE_REQUEST;
+        break;
 
       default:
        DPRINT1("  unknown ioctl code: 0x%lX\n",
               Stack->Parameters.DeviceIoControl.IoControlCode);
+        Status = STATUS_INVALID_DEVICE_REQUEST;
        break;
     }
 
+  Irp->IoStatus.Status = Status;
   IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-  return(STATUS_SUCCESS);
+  return Status;
 }
 
 static VOID
@@ -1786,7 +1806,7 @@ SpiAllocateSrbExtension(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
       if (index != 0xffffffff)
         {
          DeviceExtension->CurrentSrbExtensions++;
-          Srb->SrbExtension = DeviceExtension->VirtualAddress + index * DeviceExtension->SrbExtensionSize;
+          Srb->SrbExtension = (PVOID)((ULONG_PTR)DeviceExtension->VirtualAddress + index * DeviceExtension->SrbExtensionSize);
        }
     }
   DPRINT("%x\n", Srb->SrbExtension);
@@ -2888,8 +2908,15 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
 
                  if (Srb->SrbStatus == SRB_STATUS_BUSY)
                    {
+                      CompleteThisRequest = FALSE;
+                     Irp->Tail.Overlay.DriverContext[3] = Srb;
+
                      SpiRemoveActiveIrp(DeviceExtension, Irp, PrevIrp);
                       SpiFreeSrbExtension(DeviceExtension, OriginalSrb);
+
+                      Srb->OriginalRequest = LunExtension;
+                      Irp->Tail.Overlay.DriverContext[2] = 0;
+
                      InsertHeadList(&DeviceExtension->PendingIrpListHead, (PLIST_ENTRY)&Irp->Tail.Overlay.DriverContext[0]);
                      DeviceExtension->PendingIrpCount++;
                      LunExtension->PendingIrpCount++;
@@ -2915,6 +2942,7 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
                                    SenseInfoBuffer,
                                    sizeof(SENSE_DATA));
                      OriginalSrb->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID;
+                      OriginalSrb->SrbExtension = Srb->SrbExtension;
                      ExFreePool(Srb);
                      CompleteThisRequest = TRUE;
                    }
@@ -2933,7 +2961,7 @@ SpiProcessRequests(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
                          CompleteThisRequest = FALSE;
                          Irp->Tail.Overlay.DriverContext[3] = Srb;
                          SpiRemoveActiveIrp(DeviceExtension, Irp, PrevIrp);
-                         SpiFreeSrbExtension(DeviceExtension, Srb);
+                         SpiFreeSrbExtension(DeviceExtension, OriginalSrb);
 
                           Srb->OriginalRequest = LunExtension;
                           Irp->Tail.Overlay.DriverContext[2] = 0;