[SCSIPORT] Better error messages when receiving unexpected IOCTLs of mount manager
[reactos.git] / reactos / drivers / storage / scsiport / scsiport.c
index 3747fb8..0585b0d 100644 (file)
 
 #include "precomp.h"
 
-#ifndef NDEBUG
+#include <ntddk.h>
+#include <stdio.h>
+#include <scsi.h>
+#include <ntddscsi.h>
+#include <ntdddisk.h>
+#include <mountdev.h>
+
 #define NDEBUG
-#endif
 #include <debug.h>
 
+#include "scsiport_int.h"
+
 ULONG InternalDebugLevel = 0x00;
 
 #undef ScsiPortMoveMemory
 
-/* TYPES *********************************************************************/
-
 /* GLOBALS *******************************************************************/
 
 static BOOLEAN
@@ -623,8 +628,8 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension,
 {
     PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
     SCSI_PHYSICAL_ADDRESS PhysicalAddress;
-    ULONG BufferLength = 0;
-    ULONG Offset;
+    SIZE_T BufferLength = 0;
+    ULONG_PTR Offset;
     PSCSI_SG_ADDRESS SGList;
     PSCSI_REQUEST_BLOCK_INFO SrbInfo;
 
@@ -673,7 +678,7 @@ ScsiPortGetPhysicalAddress(IN PVOID HwDeviceExtension,
         PhysicalAddress.QuadPart = (LONGLONG)(SP_UNINITIALIZED_VALUE);
     }
 
-    *Length = BufferLength;
+    *Length = (ULONG)BufferLength;
     return PhysicalAddress;
 }
 
@@ -1034,6 +1039,7 @@ ScsiPortInitialize(IN PVOID Argument1,
     KIRQL OldIrql;
     PCM_RESOURCE_LIST ResourceList;
     BOOLEAN Conflict;
+    SIZE_T BusConfigSize;
 
 
     DPRINT ("ScsiPortInitialize() called!\n");
@@ -1635,10 +1641,11 @@ CreatePortConfig:
       IoStartTimer(PortDeviceObject);
 
       /* Initialize bus scanning information */
+      BusConfigSize = FIELD_OFFSET(BUSES_CONFIGURATION_INFORMATION,
+                                   BusScanInfo[DeviceExtension->PortConfig->NumberOfBuses]);
       DeviceExtension->BusesConfig = ExAllocatePoolWithTag(PagedPool,
-          sizeof(PVOID) * DeviceExtension->PortConfig->NumberOfBuses
-          + sizeof(ULONG), TAG_SCSIPORT);
-
+                                                           BusConfigSize,
+                                                           TAG_SCSIPORT);
       if (!DeviceExtension->BusesConfig)
       {
           DPRINT1("Out of resources!\n");
@@ -1647,9 +1654,7 @@ CreatePortConfig:
       }
 
       /* Zero it */
-      RtlZeroMemory(DeviceExtension->BusesConfig,
-          sizeof(PVOID) * DeviceExtension->PortConfig->NumberOfBuses
-          + sizeof(ULONG));
+      RtlZeroMemory(DeviceExtension->BusesConfig, BusConfigSize);
 
       /* Store number of buses there */
       DeviceExtension->BusesConfig->NumberOfBuses = (UCHAR)DeviceExtension->BusNum;
@@ -1836,6 +1841,8 @@ ScsiPortLogError(IN PVOID HwDeviceExtension,
   //PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
 
   DPRINT1("ScsiPortLogError() called\n");
+  DPRINT1("PathId: 0x%02x  TargetId: 0x%02x  Lun: 0x%02x  ErrorCode: 0x%08lx  UniqueId: 0x%08lx\n",
+          PathId, TargetId, Lun, ErrorCode, UniqueId);
 
   //DeviceExtension = CONTAINING_RECORD(HwDeviceExtension, SCSI_PORT_DEVICE_EXTENSION, MiniPortDeviceExtension);
 
@@ -2350,10 +2357,13 @@ SpiGetPciConfigData(IN PDRIVER_OBJECT DriverObject,
             if (DataSize == 0)
                 return FALSE;
 
-            /* If result is PCI_INVALID_VENDORID, then this device has no more
-               "Functions" */
-            if (PciConfig.VendorID == PCI_INVALID_VENDORID)
-                break;
+            /* Check if result is PCI_INVALID_VENDORID or too small */
+            if ((DataSize < sizeof(ULONG)) ||
+                (PciConfig.VendorID == PCI_INVALID_VENDORID))
+            {
+                /* Continue to try the next function */
+                continue;
+            }
 
             sprintf (VendorIdString, "%04hx", PciConfig.VendorID);
             sprintf (DeviceIdString, "%04hx", PciConfig.DeviceID);
@@ -2619,6 +2629,7 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject,
 
     case SRB_FUNCTION_EXECUTE_SCSI:
     case SRB_FUNCTION_IO_CONTROL:
+        DPRINT("  SRB_FUNCTION_EXECUTE_SCSI or SRB_FUNCTION_IO_CONTROL\n");
         /* Mark IRP as pending in all cases */
         IoMarkIrpPending(Irp);
 
@@ -2867,7 +2878,23 @@ ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject,
           break;
 
       default:
-          DPRINT1("  unknown ioctl code: 0x%lX\n", Stack->Parameters.DeviceIoControl.IoControlCode);
+          if (DEVICE_TYPE_FROM_CTL_CODE(Stack->Parameters.DeviceIoControl.IoControlCode) == MOUNTDEVCONTROLTYPE)
+          {
+            switch (Stack->Parameters.DeviceIoControl.IoControlCode)
+            {
+            case IOCTL_MOUNTDEV_QUERY_DEVICE_NAME:
+                DPRINT1("Got unexpected IOCTL_MOUNTDEV_QUERY_DEVICE_NAME\n");
+                break;
+            case IOCTL_MOUNTDEV_QUERY_UNIQUE_ID:
+                DPRINT1("Got unexpected IOCTL_MOUNTDEV_QUERY_UNIQUE_ID\n");
+                break;
+            default:
+                DPRINT1("  got ioctl intended for the mount manager: 0x%lX\n", Stack->Parameters.DeviceIoControl.IoControlCode);
+                break;
+            }
+          } else {
+            DPRINT1("  unknown ioctl code: 0x%lX\n", Stack->Parameters.DeviceIoControl.IoControlCode);
+          }
           Status = STATUS_NOT_IMPLEMENTED;
           break;
     }
@@ -3274,7 +3301,7 @@ SpiAdapterControl(PDEVICE_OBJECT DeviceObject,
             break;
 
         ScatterGatherList->Length = Srb->DataTransferLength - TotalLength;
-        ScatterGatherList->PhysicalAddress = IoMapTransfer(NULL,
+        ScatterGatherList->PhysicalAddress = IoMapTransfer(DeviceExtension->AdapterObject,
                                                            Irp->MdlAddress,
                                                            MapRegisterBase,
                                                            DataVA + TotalLength,
@@ -4006,7 +4033,7 @@ SpiGetInquiryData(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
         BusData = &AdapterBusInfo->BusData[Bus];
 
         /* Calculate and save an offset of the inquiry data */
-        BusData->InquiryDataOffset = (PUCHAR)InquiryData - Buffer;
+        BusData->InquiryDataOffset = (ULONG)((PUCHAR)InquiryData - Buffer);
 
         /* Get a pointer to the LUN information structure */
         LunInfo = DeviceExtension->BusesConfig->BusScanInfo[Bus]->LunInfo;
@@ -4032,7 +4059,7 @@ SpiGetInquiryData(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
             InquiryData->InquiryDataLength = INQUIRYDATABUFFERSIZE;
             InquiryData->DeviceClaimed = LunInfo->DeviceClaimed;
             InquiryData->NextInquiryDataOffset =
-                (PUCHAR)InquiryData + InquiryDataSize - Buffer;
+                (ULONG)((PUCHAR)InquiryData + InquiryDataSize - Buffer);
 
             /* Copy data in it */
             RtlCopyMemory(InquiryData->InquiryData,
@@ -4582,7 +4609,11 @@ ScsiPortIsr(IN PKINTERRUPT Interrupt,
         return FALSE;
 
     /* Call miniport's HwInterrupt routine */
-    DeviceExtension->HwInterrupt(&DeviceExtension->MiniPortDeviceExtension);
+    if (DeviceExtension->HwInterrupt(&DeviceExtension->MiniPortDeviceExtension) == FALSE)
+    {
+        /* This interrupt doesn't belong to us */
+        return FALSE;
+    }
 
     /* If flag of notification is set - queue a DPC */
     if (DeviceExtension->InterruptData.Flags & SCSI_PORT_NOTIFICATION_NEEDED)
@@ -5278,7 +5309,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
                          L"\\Registry\\Machine\\Hardware\\DeviceMap\\Scsi");
   InitializeObjectAttributes(&ObjectAttributes,
                             &KeyName,
-                            OBJ_CASE_INSENSITIVE | OBJ_OPENIF,
+                            OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_KERNEL_HANDLE,
                             0,
                             NULL);
   Status = ZwCreateKey(&ScsiKey,
@@ -5305,7 +5336,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
                       NameBuffer);
   InitializeObjectAttributes(&ObjectAttributes,
                             &KeyName,
-                            0,
+                            OBJ_KERNEL_HANDLE,
                             ScsiKey,
                             NULL);
   Status = ZwCreateKey(&ScsiPortKey,
@@ -5353,7 +5384,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
                         0,
                         REG_SZ,
                         DriverName,
-                        (wcslen(DriverName) + 1) * sizeof(WCHAR));
+                        (ULONG)((wcslen(DriverName) + 1) * sizeof(WCHAR)));
   if (!NT_SUCCESS(Status))
     {
       DPRINT("ZwSetValueKey('Driver') failed (Status %lx)\n", Status);
@@ -5546,7 +5577,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
                                         0,
                                         REG_SZ,
                                         NameBuffer,
-                                        (wcslen(NameBuffer) + 1) * sizeof(WCHAR));
+                                        (ULONG)((wcslen(NameBuffer) + 1) * sizeof(WCHAR)));
                  if (!NT_SUCCESS(Status))
                    {
                      DPRINT("ZwSetValueKey('Identifier') failed (Status %lx)\n", Status);
@@ -5595,7 +5626,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
                                         0,
                                         REG_SZ,
                                         TypeName,
-                                        (wcslen(TypeName) + 1) * sizeof(WCHAR));
+                                        (ULONG)((wcslen(TypeName) + 1) * sizeof(WCHAR)));
                  if (!NT_SUCCESS(Status))
                    {
                      DPRINT("ZwSetValueKey('Type') failed (Status %lx)\n", Status);
@@ -6395,5 +6426,4 @@ ScsiPortConvertPhysicalAddressToUlong(IN SCSI_PHYSICAL_ADDRESS Address)
   return(Address.u.LowPart);
 }
 
-
 /* EOF */