[STORPORT] Implement StorPortNotification() / EnablePassiveInitialization and call...
authorEric Kohl <eric.kohl@reactos.org>
Sat, 21 Oct 2017 21:58:42 +0000 (23:58 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 21 Oct 2017 21:58:42 +0000 (23:58 +0200)
CORE-13866

drivers/storage/port/storport/fdo.c
drivers/storage/port/storport/precomp.h
drivers/storage/port/storport/storport.c

index 70b6a30..9072971 100644 (file)
@@ -63,6 +63,17 @@ PortFdoStartMiniport(
         return Status;
     }
 
+    /* Call the HwPassiveInitRoutine function, if available */
+    if (DeviceExtension->HwPassiveInitRoutine != NULL)
+    {
+        DPRINT1("Calling HwPassiveInitRoutine()\n");
+        if (!DeviceExtension->HwPassiveInitRoutine(&DeviceExtension->Miniport.MiniportExtension->HwDeviceExtension))
+        {
+            DPRINT1("HwPassiveInitRoutine() failed\n");
+            return STATUS_UNSUCCESSFUL;
+        }
+    }
+
     return STATUS_SUCCESS;
 }
 
index bd2bc91..168c318 100644 (file)
@@ -100,7 +100,7 @@ typedef struct _FDO_DEVICE_EXTENSION
     PVOID UncachedExtensionVirtualBase;
     PHYSICAL_ADDRESS UncachedExtensionPhysicalBase;
     ULONG UncachedExtensionSize;
-
+    PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine;
 } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
 
 
index b105722..39c6564 100644 (file)
@@ -992,7 +992,53 @@ StorPortNotification(
     _In_ PVOID HwDeviceExtension,
     ...)
 {
-    DPRINT1("StorPortNotification()\n");
+    PMINIPORT_DEVICE_EXTENSION MiniportExtension = NULL;
+    PFDO_DEVICE_EXTENSION DeviceExtension = NULL;
+    PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine;
+    PBOOLEAN Result;
+    va_list ap;
+
+    DPRINT1("StorPortNotification(%x %p)\n",
+            NotificationType, HwDeviceExtension);
+
+    /* Get the miniport extension */
+    if (HwDeviceExtension != NULL)
+    {
+        MiniportExtension = CONTAINING_RECORD(HwDeviceExtension,
+                                              MINIPORT_DEVICE_EXTENSION,
+                                              HwDeviceExtension);
+        DPRINT1("HwDeviceExtension %p  MiniportExtension %p\n",
+                HwDeviceExtension, MiniportExtension);
+
+        DeviceExtension = MiniportExtension->Miniport->DeviceExtension;
+    }
+
+    va_start(ap, HwDeviceExtension);
+
+    switch (NotificationType)
+    {
+        case EnablePassiveInitialization:
+            DPRINT1("EnablePassiveInitialization\n");
+            HwPassiveInitRoutine = (PHW_PASSIVE_INITIALIZE_ROUTINE)va_arg(ap, PHW_PASSIVE_INITIALIZE_ROUTINE);
+            DPRINT1("HwPassiveInitRoutine %p\n", HwPassiveInitRoutine);
+            Result = (PBOOLEAN)va_arg(ap, PBOOLEAN);
+
+            *Result = FALSE;
+
+            if ((DeviceExtension != NULL) &&
+                (DeviceExtension->HwPassiveInitRoutine == NULL))
+            {
+                DeviceExtension->HwPassiveInitRoutine = HwPassiveInitRoutine;
+                *Result = TRUE;
+            }
+            break;
+
+        default:
+            DPRINT1("Unsupported Notification %lx\n", NotificationType);
+            break;
+    }
+
+    va_end(ap);
 }