2 * PROJECT: ReactOS Storport Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Storport driver main file
5 * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
8 /* INCLUDES *******************************************************************/
16 /* GLOBALS ********************************************************************/
21 /* FUNCTIONS ******************************************************************/
25 PortAddDriverInitData(
26 PDRIVER_OBJECT_EXTENSION DriverExtension
,
27 PHW_INITIALIZATION_DATA HwInitializationData
)
29 PDRIVER_INIT_DATA InitData
;
31 DPRINT1("PortAddDriverInitData()\n");
33 InitData
= ExAllocatePoolWithTag(NonPagedPool
,
34 sizeof(DRIVER_INIT_DATA
),
37 return STATUS_NO_MEMORY
;
39 RtlCopyMemory(&InitData
->HwInitData
,
41 sizeof(HW_INITIALIZATION_DATA
));
43 InsertHeadList(&DriverExtension
->InitDataListHead
,
46 return STATUS_SUCCESS
;
52 PortDeleteDriverInitData(
53 PDRIVER_OBJECT_EXTENSION DriverExtension
)
55 PDRIVER_INIT_DATA InitData
;
56 PLIST_ENTRY ListEntry
;
58 DPRINT1("PortDeleteDriverInitData()\n");
60 ListEntry
= DriverExtension
->InitDataListHead
.Flink
;
61 while (ListEntry
!= &DriverExtension
->InitDataListHead
)
63 InitData
= CONTAINING_RECORD(ListEntry
,
67 RemoveEntryList(&InitData
->Entry
);
69 ExFreePoolWithTag(InitData
,
72 ListEntry
= DriverExtension
->InitDataListHead
.Flink
;
77 PHW_INITIALIZATION_DATA
78 PortGetDriverInitData(
79 PDRIVER_OBJECT_EXTENSION DriverExtension
,
80 INTERFACE_TYPE InterfaceType
)
82 PDRIVER_INIT_DATA InitData
;
83 PLIST_ENTRY ListEntry
;
85 DPRINT1("PortGetDriverInitData()\n");
87 ListEntry
= DriverExtension
->InitDataListHead
.Flink
;
88 while (ListEntry
!= &DriverExtension
->InitDataListHead
)
90 InitData
= CONTAINING_RECORD(ListEntry
,
93 if (InitData
->HwInitData
.AdapterInterfaceType
== InterfaceType
)
94 return &InitData
->HwInitData
;
96 ListEntry
= ListEntry
->Flink
;
106 PFDO_DEVICE_EXTENSION DeviceExtension
,
107 STOR_SPINLOCK SpinLock
,
109 PSTOR_LOCK_HANDLE LockHandle
)
111 DPRINT1("PortAcquireSpinLock(%p %lu %p %p)\n",
112 DeviceExtension
, SpinLock
, LockContext
, LockHandle
);
114 LockHandle
->Lock
= SpinLock
;
118 case DpcLock
: /* 1, */
119 DPRINT1("DpcLock\n");
122 case StartIoLock
: /* 2 */
123 DPRINT1("StartIoLock\n");
126 case InterruptLock
: /* 3 */
127 DPRINT1("InterruptLock\n");
128 if (DeviceExtension
->Interrupt
== NULL
)
129 LockHandle
->Context
.OldIrql
= 0;
131 LockHandle
->Context
.OldIrql
= KeAcquireInterruptSpinLock(DeviceExtension
->Interrupt
);
140 PFDO_DEVICE_EXTENSION DeviceExtension
,
141 PSTOR_LOCK_HANDLE LockHandle
)
143 DPRINT1("PortReleaseSpinLock(%p %p)\n",
144 DeviceExtension
, LockHandle
);
146 switch (LockHandle
->Lock
)
148 case DpcLock
: /* 1, */
149 DPRINT1("DpcLock\n");
152 case StartIoLock
: /* 2 */
153 DPRINT1("StartIoLock\n");
156 case InterruptLock
: /* 3 */
157 DPRINT1("InterruptLock\n");
158 if (DeviceExtension
->Interrupt
!= NULL
)
159 KeReleaseInterruptSpinLock(DeviceExtension
->Interrupt
,
160 LockHandle
->Context
.OldIrql
);
170 _In_ PDRIVER_OBJECT DriverObject
,
171 _In_ PDEVICE_OBJECT PhysicalDeviceObject
)
173 PDRIVER_OBJECT_EXTENSION DriverObjectExtension
;
174 PFDO_DEVICE_EXTENSION DeviceExtension
= NULL
;
175 WCHAR NameBuffer
[80];
176 UNICODE_STRING DeviceName
;
177 PDEVICE_OBJECT Fdo
= NULL
;
178 KLOCK_QUEUE_HANDLE LockHandle
;
181 DPRINT1("PortAddDevice(%p %p)\n",
182 DriverObject
, PhysicalDeviceObject
);
184 ASSERT(DriverObject
);
185 ASSERT(PhysicalDeviceObject
);
188 L
"\\Device\\RaidPort%lu",
190 RtlInitUnicodeString(&DeviceName
, NameBuffer
);
193 DPRINT1("Creating device: %wZ\n", &DeviceName
);
195 /* Create the port device */
196 Status
= IoCreateDevice(DriverObject
,
197 sizeof(FDO_DEVICE_EXTENSION
),
199 FILE_DEVICE_CONTROLLER
,
200 FILE_DEVICE_SECURE_OPEN
,
203 if (!NT_SUCCESS(Status
))
205 DPRINT1("IoCreateDevice() failed (Status 0x%08lx)\n", Status
);
209 DPRINT1("Created device: %wZ (%p)\n", &DeviceName
, Fdo
);
211 /* Initialize the device */
212 Fdo
->Flags
|= DO_DIRECT_IO
;
213 Fdo
->Flags
|= DO_POWER_PAGABLE
;
215 /* Initialize the device extension */
216 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)Fdo
->DeviceExtension
;
217 RtlZeroMemory(DeviceExtension
, sizeof(FDO_DEVICE_EXTENSION
));
219 DeviceExtension
->ExtensionType
= FdoExtension
;
221 DeviceExtension
->Device
= Fdo
;
222 DeviceExtension
->PhysicalDevice
= PhysicalDeviceObject
;
224 DeviceExtension
->PnpState
= dsStopped
;
226 KeInitializeSpinLock(&DeviceExtension
->PdoListLock
);
227 InitializeListHead(&DeviceExtension
->PdoListHead
);
229 /* Attach the FDO to the device stack */
230 Status
= IoAttachDeviceToDeviceStackSafe(Fdo
,
231 PhysicalDeviceObject
,
232 &DeviceExtension
->LowerDevice
);
233 if (!NT_SUCCESS(Status
))
235 DPRINT1("IoAttachDeviceToDeviceStackSafe() failed (Status 0x%08lx)\n", Status
);
240 /* Insert the FDO to the drivers FDO list */
241 DriverObjectExtension
= IoGetDriverObjectExtension(DriverObject
,
243 ASSERT(DriverObjectExtension
->ExtensionType
== DriverExtension
);
245 DeviceExtension
->DriverExtension
= DriverObjectExtension
;
247 KeAcquireInStackQueuedSpinLock(&DriverObjectExtension
->AdapterListLock
,
250 InsertHeadList(&DriverObjectExtension
->AdapterListHead
,
251 &DeviceExtension
->AdapterListEntry
);
252 DriverObjectExtension
->AdapterCount
++;
254 KeReleaseInStackQueuedSpinLock(&LockHandle
);
256 /* The device has been initialized */
257 Fdo
->Flags
&= ~DO_DEVICE_INITIALIZING
;
259 DPRINT1("PortAddDevice() done (Status 0x%08lx)\n", Status
);
269 _In_ PDRIVER_OBJECT DriverObject
)
271 PDRIVER_OBJECT_EXTENSION DriverExtension
;
273 DPRINT1("PortUnload(%p)\n",
276 DriverExtension
= IoGetDriverObjectExtension(DriverObject
,
278 if (DriverExtension
!= NULL
)
280 PortDeleteDriverInitData(DriverExtension
);
289 IN PDEVICE_OBJECT DeviceObject
,
292 DPRINT1("PortDispatchCreate(%p %p)\n",
295 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
296 Irp
->IoStatus
.Information
= FILE_OPENED
;
298 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
300 return STATUS_SUCCESS
;
308 IN PDEVICE_OBJECT DeviceObject
,
311 DPRINT1("PortDispatchClose(%p %p)\n",
314 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
315 Irp
->IoStatus
.Information
= 0;
317 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
319 return STATUS_SUCCESS
;
326 PortDispatchDeviceControl(
327 IN PDEVICE_OBJECT DeviceObject
,
330 DPRINT1("PortDispatchDeviceControl(%p %p)\n",
333 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
334 Irp
->IoStatus
.Information
= 0;
336 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
338 return STATUS_SUCCESS
;
346 IN PDEVICE_OBJECT DeviceObject
,
349 PFDO_DEVICE_EXTENSION DeviceExtension
;
351 DPRINT1("PortDispatchScsi(%p %p)\n",
354 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
355 DPRINT1("ExtensionType: %u\n", DeviceExtension
->ExtensionType
);
357 switch (DeviceExtension
->ExtensionType
)
360 return PortFdoScsi(DeviceObject
,
364 return PortPdoScsi(DeviceObject
,
368 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
369 Irp
->IoStatus
.Information
= 0;
370 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
371 return STATUS_UNSUCCESSFUL
;
374 return STATUS_SUCCESS
;
381 PortDispatchSystemControl(
382 IN PDEVICE_OBJECT DeviceObject
,
385 DPRINT1("PortDispatchSystemControl(%p %p)\n",
388 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
389 Irp
->IoStatus
.Information
= 0;
391 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
393 return STATUS_SUCCESS
;
401 IN PDEVICE_OBJECT DeviceObject
,
404 PFDO_DEVICE_EXTENSION DeviceExtension
;
406 DPRINT1("PortDispatchPnp(%p %p)\n",
409 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
410 DPRINT1("ExtensionType: %u\n", DeviceExtension
->ExtensionType
);
412 switch (DeviceExtension
->ExtensionType
)
415 return PortFdoPnp(DeviceObject
,
419 return PortPdoPnp(DeviceObject
,
423 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
424 Irp
->IoStatus
.Information
= 0;
425 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
426 return STATUS_UNSUCCESSFUL
;
435 IN PDEVICE_OBJECT DeviceObject
,
438 DPRINT1("PortDispatchPower(%p %p)\n",
441 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
442 Irp
->IoStatus
.Information
= 0;
444 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
446 return STATUS_SUCCESS
;
450 /* PUBLIC FUNCTIONS ***********************************************************/
458 _In_ PDRIVER_OBJECT DriverObject
,
459 _In_ PUNICODE_STRING RegistryPath
)
461 DPRINT1("DriverEntry(%p %p)\n", DriverObject
, RegistryPath
);
462 return STATUS_SUCCESS
;
472 StorPortAllocateRegistryBuffer(
473 _In_ PVOID HwDeviceExtension
,
476 DPRINT1("StorPortAllocateRegistryBuffer()\n");
489 _In_ PVOID HwDeviceExtension
,
490 _In_ ULONG RequestsToComplete
)
492 DPRINT1("StorPortBuzy()\n");
504 StorPortCompleteRequest(
505 _In_ PVOID HwDeviceExtension
,
509 _In_ UCHAR SrbStatus
)
511 DPRINT1("StorPortCompleteRequest()\n");
522 StorPortConvertPhysicalAddressToUlong(
523 _In_ STOR_PHYSICAL_ADDRESS Address
)
525 DPRINT1("StorPortConvertPhysicalAddressToUlong()\n");
527 return Address
.u
.LowPart
;
535 STOR_PHYSICAL_ADDRESS
537 StorPortConvertUlongToPhysicalAddress(
538 _In_ ULONG_PTR UlongAddress
)
540 STOR_PHYSICAL_ADDRESS Address
;
542 DPRINT1("StorPortConvertUlongToPhysicalAddress()\n");
544 Address
.QuadPart
= UlongAddress
;
555 _In_ ULONG DebugPrintLevel
,
556 _In_ PCHAR DebugMessage
,
561 va_start(ap
, DebugMessage
);
562 vDbgPrintExWithPrefix("STORMINI: ", 0x58, DebugPrintLevel
, DebugMessage
, ap
);
574 _In_ PVOID HwDeviceExtension
,
578 _In_ ULONG RequestsToComplete
)
580 DPRINT1("StorPortDeviceBusy()\n");
593 _In_ PVOID HwDeviceExtension
,
598 DPRINT1("StorPortDeviceReady()\n");
609 StorPortExtendedFunction(
610 _In_ STORPORT_FUNCTION_CODE FunctionCode
,
611 _In_ PVOID HwDeviceExtension
,
614 DPRINT1("StorPortExtendedFunction(%d %p ...)\n",
615 FunctionCode
, HwDeviceExtension
);
617 return STATUS_NOT_IMPLEMENTED
;
627 StorPortFreeDeviceBase(
628 _In_ PVOID HwDeviceExtension
,
629 _In_ PVOID MappedAddress
)
631 DPRINT1("StorPortFreeDeviceBase(%p %p)\n",
632 HwDeviceExtension
, MappedAddress
);
642 StorPortFreeRegistryBuffer(
643 _In_ PVOID HwDeviceExtension
,
646 DPRINT1("StorPortFreeRegistryBuffer()\n");
658 _In_ PVOID DeviceExtension
,
659 _In_ ULONG BusDataType
,
660 _In_ ULONG SystemIoBusNumber
,
661 _In_ ULONG SlotNumber
,
662 _Out_
_When_(Length
!= 0, _Out_writes_bytes_(Length
)) PVOID Buffer
,
665 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
666 PBUS_INTERFACE_STANDARD Interface
;
669 DPRINT1("StorPortGetBusData(%p %lu %lu %lu %p %lu)\n",
670 DeviceExtension
, BusDataType
, SystemIoBusNumber
, SlotNumber
, Buffer
, Length
);
672 /* Get the miniport extension */
673 MiniportExtension
= CONTAINING_RECORD(DeviceExtension
,
674 MINIPORT_DEVICE_EXTENSION
,
676 DPRINT1("DeviceExtension %p MiniportExtension %p\n",
677 DeviceExtension
, MiniportExtension
);
679 Interface
= &MiniportExtension
->Miniport
->DeviceExtension
->BusInterface
;
681 if (BusDataType
== 4)
684 ReturnLength
= Interface
->GetBusData(Interface
->Context
,
689 DPRINT1("ReturnLength: %lu\n", ReturnLength
);
701 StorPortGetDeviceBase(
702 _In_ PVOID HwDeviceExtension
,
703 _In_ INTERFACE_TYPE BusType
,
704 _In_ ULONG SystemIoBusNumber
,
705 _In_ STOR_PHYSICAL_ADDRESS IoAddress
,
706 _In_ ULONG NumberOfBytes
,
707 _In_ BOOLEAN InIoSpace
)
709 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
710 PHYSICAL_ADDRESS TranslatedAddress
;
714 DPRINT1("StorPortGetDeviceBase(%p %lu %lu 0x%I64x %lu %u)\n",
715 HwDeviceExtension
, BusType
, SystemIoBusNumber
, IoAddress
.QuadPart
, NumberOfBytes
, InIoSpace
);
717 /* Get the miniport extension */
718 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
719 MINIPORT_DEVICE_EXTENSION
,
721 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
722 HwDeviceExtension
, MiniportExtension
);
724 if (!TranslateResourceListAddress(MiniportExtension
->Miniport
->DeviceExtension
,
732 DPRINT1("Checkpoint!\n");
736 DPRINT1("Translated Address: 0x%I64x\n", TranslatedAddress
.QuadPart
);
741 DPRINT1("Translated Address: %p\n", (PVOID
)(ULONG_PTR
)TranslatedAddress
.QuadPart
);
742 return (PVOID
)(ULONG_PTR
)TranslatedAddress
.QuadPart
;
745 /* In memory space */
746 MappedAddress
= MmMapIoSpace(TranslatedAddress
,
749 DPRINT1("Mapped Address: %p\n", MappedAddress
);
751 Status
= AllocateAddressMapping(&MiniportExtension
->Miniport
->DeviceExtension
->MappedAddressList
,
756 if (!NT_SUCCESS(Status
))
758 DPRINT1("Checkpoint!\n");
759 MappedAddress
= NULL
;
762 DPRINT1("Mapped Address: %p\n", MappedAddress
);
763 return MappedAddress
;
773 StorPortGetLogicalUnit(
774 _In_ PVOID HwDeviceExtension
,
779 DPRINT1("StorPortGetLogicalUnit()\n");
789 STOR_PHYSICAL_ADDRESS
791 StorPortGetPhysicalAddress(
792 _In_ PVOID HwDeviceExtension
,
793 _In_opt_ PSCSI_REQUEST_BLOCK Srb
,
794 _In_ PVOID VirtualAddress
,
797 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
798 PFDO_DEVICE_EXTENSION DeviceExtension
;
799 STOR_PHYSICAL_ADDRESS PhysicalAddress
;
802 DPRINT1("StorPortGetPhysicalAddress(%p %p %p %p)\n",
803 HwDeviceExtension
, Srb
, VirtualAddress
, Length
);
805 /* Get the miniport extension */
806 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
807 MINIPORT_DEVICE_EXTENSION
,
809 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
810 HwDeviceExtension
, MiniportExtension
);
812 DeviceExtension
= MiniportExtension
->Miniport
->DeviceExtension
;
814 /* Inside of the uncached extension? */
815 if (((ULONG_PTR
)VirtualAddress
>= (ULONG_PTR
)DeviceExtension
->UncachedExtensionVirtualBase
) &&
816 ((ULONG_PTR
)VirtualAddress
<= (ULONG_PTR
)DeviceExtension
->UncachedExtensionVirtualBase
+ DeviceExtension
->UncachedExtensionSize
))
818 Offset
= (ULONG_PTR
)VirtualAddress
- (ULONG_PTR
)DeviceExtension
->UncachedExtensionVirtualBase
;
820 PhysicalAddress
.QuadPart
= DeviceExtension
->UncachedExtensionPhysicalBase
.QuadPart
+ Offset
;
821 *Length
= DeviceExtension
->UncachedExtensionSize
- Offset
;
823 return PhysicalAddress
;
829 PhysicalAddress
= MmGetPhysicalAddress(VirtualAddress
);
834 // PhysicalAddress.QuadPart = (LONGLONG)0;
836 return PhysicalAddress
;
844 PSTOR_SCATTER_GATHER_LIST
846 StorPortGetScatterGatherList(
847 _In_ PVOID DeviceExtension
,
848 _In_ PSCSI_REQUEST_BLOCK Srb
)
850 DPRINT1("StorPortGetScatterGatherList()\n");
863 _In_ PVOID DeviceExtension
,
869 DPRINT("StorPortGetSrb()\n");
880 StorPortGetUncachedExtension(
881 _In_ PVOID HwDeviceExtension
,
882 _In_ PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
883 _In_ ULONG NumberOfBytes
)
885 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
886 PFDO_DEVICE_EXTENSION DeviceExtension
;
887 PHYSICAL_ADDRESS LowestAddress
, HighestAddress
, Alignment
;
889 DPRINT1("StorPortGetUncachedExtension(%p %p %lu)\n",
890 HwDeviceExtension
, ConfigInfo
, NumberOfBytes
);
892 /* Get the miniport extension */
893 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
894 MINIPORT_DEVICE_EXTENSION
,
896 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
897 HwDeviceExtension
, MiniportExtension
);
899 DeviceExtension
= MiniportExtension
->Miniport
->DeviceExtension
;
901 /* Return the uncached extension base address if we already have one */
902 if (DeviceExtension
->UncachedExtensionVirtualBase
!= NULL
)
903 return DeviceExtension
->UncachedExtensionVirtualBase
;
905 // FIXME: Set DMA stuff here?
907 /* Allocate the uncached extension */
908 Alignment
.QuadPart
= 0;
909 LowestAddress
.QuadPart
= 0;
910 HighestAddress
.QuadPart
= 0x00000000FFFFFFFF;
911 DeviceExtension
->UncachedExtensionVirtualBase
= MmAllocateContiguousMemorySpecifyCache(NumberOfBytes
,
916 if (DeviceExtension
->UncachedExtensionVirtualBase
== NULL
)
919 DeviceExtension
->UncachedExtensionPhysicalBase
= MmGetPhysicalAddress(DeviceExtension
->UncachedExtensionVirtualBase
);
920 DeviceExtension
->UncachedExtensionSize
= NumberOfBytes
;
922 return DeviceExtension
->UncachedExtensionVirtualBase
;
932 StorPortGetVirtualAddress(
933 _In_ PVOID HwDeviceExtension
,
934 _In_ STOR_PHYSICAL_ADDRESS PhysicalAddress
)
936 DPRINT1("StorPortGetVirtualAddress(%p %I64x)\n",
937 HwDeviceExtension
, PhysicalAddress
.QuadPart
);
950 _In_ PVOID Argument1
,
951 _In_ PVOID Argument2
,
952 _In_
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
953 _In_opt_ PVOID HwContext
)
955 PDRIVER_OBJECT DriverObject
= (PDRIVER_OBJECT
)Argument1
;
956 PUNICODE_STRING RegistryPath
= (PUNICODE_STRING
)Argument2
;
957 PDRIVER_OBJECT_EXTENSION DriverObjectExtension
;
958 NTSTATUS Status
= STATUS_SUCCESS
;
960 DPRINT1("StorPortInitialize(%p %p %p %p)\n",
961 Argument1
, Argument2
, HwInitializationData
, HwContext
);
963 DPRINT1("HwInitializationDataSize: %lu\n", HwInitializationData
->HwInitializationDataSize
);
964 DPRINT1("AdapterInterfaceType: %u\n", HwInitializationData
->AdapterInterfaceType
);
965 DPRINT1("HwInitialize: %p\n", HwInitializationData
->HwInitialize
);
966 DPRINT1("HwStartIo: %p\n", HwInitializationData
->HwStartIo
);
967 DPRINT1("HwInterrupt: %p\n", HwInitializationData
->HwInterrupt
);
968 DPRINT1("HwFindAdapter: %p\n", HwInitializationData
->HwFindAdapter
);
969 DPRINT1("HwResetBus: %p\n", HwInitializationData
->HwResetBus
);
970 DPRINT1("HwDmaStarted: %p\n", HwInitializationData
->HwDmaStarted
);
971 DPRINT1("HwAdapterState: %p\n", HwInitializationData
->HwAdapterState
);
972 DPRINT1("DeviceExtensionSize: %lu\n", HwInitializationData
->DeviceExtensionSize
);
973 DPRINT1("SpecificLuExtensionSize: %lu\n", HwInitializationData
->SpecificLuExtensionSize
);
974 DPRINT1("SrbExtensionSize: %lu\n", HwInitializationData
->SrbExtensionSize
);
975 DPRINT1("NumberOfAccessRanges: %lu\n", HwInitializationData
->NumberOfAccessRanges
);
977 /* Check parameters */
978 if ((DriverObject
== NULL
) ||
979 (RegistryPath
== NULL
) ||
980 (HwInitializationData
== NULL
))
982 DPRINT1("Invalid parameter!\n");
983 return STATUS_INVALID_PARAMETER
;
986 /* Check initialization data */
987 if ((HwInitializationData
->HwInitializationDataSize
< sizeof(HW_INITIALIZATION_DATA
)) ||
988 (HwInitializationData
->HwInitialize
== NULL
) ||
989 (HwInitializationData
->HwStartIo
== NULL
) ||
990 (HwInitializationData
->HwFindAdapter
== NULL
) ||
991 (HwInitializationData
->HwResetBus
== NULL
))
993 DPRINT1("Revision mismatch!\n");
994 return STATUS_REVISION_MISMATCH
;
997 DriverObjectExtension
= IoGetDriverObjectExtension(DriverObject
,
999 if (DriverObjectExtension
== NULL
)
1001 DPRINT1("No driver object extension!\n");
1003 Status
= IoAllocateDriverObjectExtension(DriverObject
,
1005 sizeof(DRIVER_OBJECT_EXTENSION
),
1006 (PVOID
*)&DriverObjectExtension
);
1007 if (!NT_SUCCESS(Status
))
1009 DPRINT1("IoAllocateDriverObjectExtension() failed (Status 0x%08lx)\n", Status
);
1013 DPRINT1("Driver object extension created!\n");
1015 /* Initialize the driver object extension */
1016 RtlZeroMemory(DriverObjectExtension
,
1017 sizeof(DRIVER_OBJECT_EXTENSION
));
1019 DriverObjectExtension
->ExtensionType
= DriverExtension
;
1020 DriverObjectExtension
->DriverObject
= DriverObject
;
1022 InitializeListHead(&DriverObjectExtension
->AdapterListHead
);
1023 KeInitializeSpinLock(&DriverObjectExtension
->AdapterListLock
);
1025 InitializeListHead(&DriverObjectExtension
->InitDataListHead
);
1028 DriverObject
->DriverExtension
->AddDevice
= PortAddDevice
;
1029 // DriverObject->DriverStartIo = PortStartIo;
1030 DriverObject
->DriverUnload
= PortUnload
;
1031 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = PortDispatchCreate
;
1032 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = PortDispatchClose
;
1033 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = PortDispatchDeviceControl
;
1034 DriverObject
->MajorFunction
[IRP_MJ_SCSI
] = PortDispatchScsi
;
1035 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = PortDispatchPower
;
1036 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = PortDispatchSystemControl
;
1037 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = PortDispatchPnp
;
1040 /* Add the initialzation data to the driver extension */
1041 Status
= PortAddDriverInitData(DriverObjectExtension
,
1042 HwInitializationData
);
1044 DPRINT1("StorPortInitialize() done (Status 0x%08lx)\n", Status
);
1057 _In_ PVOID HwDeviceExtension
,
1058 _In_opt_ PSCSI_REQUEST_BLOCK Srb
,
1060 _In_ UCHAR TargetId
,
1062 _In_ ULONG ErrorCode
,
1063 _In_ ULONG UniqueId
)
1065 DPRINT1("ScsiPortLogError() called\n");
1066 DPRINT1("PathId: 0x%02x TargetId: 0x%02x Lun: 0x%02x ErrorCode: 0x%08lx UniqueId: 0x%08lx\n",
1067 PathId
, TargetId
, Lun
, ErrorCode
, UniqueId
);
1069 DPRINT1("ScsiPortLogError() done\n");
1080 _Out_writes_bytes_(Length
) PVOID Destination
,
1081 _In_reads_bytes_(Length
) PVOID Source
,
1084 RtlMoveMemory(Destination
, Source
, Length
);
1093 StorPortNotification(
1094 _In_ SCSI_NOTIFICATION_TYPE NotificationType
,
1095 _In_ PVOID HwDeviceExtension
,
1098 PMINIPORT_DEVICE_EXTENSION MiniportExtension
= NULL
;
1099 PFDO_DEVICE_EXTENSION DeviceExtension
= NULL
;
1100 PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine
;
1101 PSTORPORT_EXTENDED_FUNCTIONS
*ppExtendedFunctions
;
1104 PHW_DPC_ROUTINE HwDpcRoutine
;
1107 STOR_SPINLOCK SpinLock
;
1109 PSTOR_LOCK_HANDLE LockHandle
;
1110 PSCSI_REQUEST_BLOCK Srb
;
1112 DPRINT1("StorPortNotification(%x %p)\n",
1113 NotificationType
, HwDeviceExtension
);
1115 /* Get the miniport extension */
1116 if (HwDeviceExtension
!= NULL
)
1118 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
1119 MINIPORT_DEVICE_EXTENSION
,
1121 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
1122 HwDeviceExtension
, MiniportExtension
);
1124 DeviceExtension
= MiniportExtension
->Miniport
->DeviceExtension
;
1127 va_start(ap
, HwDeviceExtension
);
1129 switch (NotificationType
)
1131 case RequestComplete
:
1132 DPRINT1("RequestComplete\n");
1133 Srb
= (PSCSI_REQUEST_BLOCK
)va_arg(ap
, PSCSI_REQUEST_BLOCK
);
1134 DPRINT1("Srb %p\n", Srb
);
1135 if (Srb
->OriginalRequest
!= NULL
)
1137 DPRINT1("Need to complete the IRP!\n");
1142 case GetExtendedFunctionTable
:
1143 DPRINT1("GetExtendedFunctionTable\n");
1144 ppExtendedFunctions
= (PSTORPORT_EXTENDED_FUNCTIONS
*)va_arg(ap
, PSTORPORT_EXTENDED_FUNCTIONS
*);
1145 if (ppExtendedFunctions
!= NULL
)
1146 *ppExtendedFunctions
= NULL
; /* FIXME */
1149 case EnablePassiveInitialization
:
1150 DPRINT1("EnablePassiveInitialization\n");
1151 HwPassiveInitRoutine
= (PHW_PASSIVE_INITIALIZE_ROUTINE
)va_arg(ap
, PHW_PASSIVE_INITIALIZE_ROUTINE
);
1152 DPRINT1("HwPassiveInitRoutine %p\n", HwPassiveInitRoutine
);
1153 Result
= (PBOOLEAN
)va_arg(ap
, PBOOLEAN
);
1157 if ((DeviceExtension
!= NULL
) &&
1158 (DeviceExtension
->HwPassiveInitRoutine
== NULL
))
1160 DeviceExtension
->HwPassiveInitRoutine
= HwPassiveInitRoutine
;
1166 DPRINT1("InitializeDpc\n");
1167 Dpc
= (PSTOR_DPC
)va_arg(ap
, PSTOR_DPC
);
1168 DPRINT1("Dpc %p\n", Dpc
);
1169 HwDpcRoutine
= (PHW_DPC_ROUTINE
)va_arg(ap
, PHW_DPC_ROUTINE
);
1170 DPRINT1("HwDpcRoutine %p\n", HwDpcRoutine
);
1172 KeInitializeDpc((PRKDPC
)&Dpc
->Dpc
,
1173 (PKDEFERRED_ROUTINE
)HwDpcRoutine
,
1174 (PVOID
)DeviceExtension
);
1175 KeInitializeSpinLock(&Dpc
->Lock
);
1178 case AcquireSpinLock
:
1179 DPRINT1("AcquireSpinLock\n");
1180 SpinLock
= (STOR_SPINLOCK
)va_arg(ap
, STOR_SPINLOCK
);
1181 DPRINT1("SpinLock %lu\n", SpinLock
);
1182 LockContext
= (PVOID
)va_arg(ap
, PVOID
);
1183 DPRINT1("LockContext %p\n", LockContext
);
1184 LockHandle
= (PSTOR_LOCK_HANDLE
)va_arg(ap
, PSTOR_LOCK_HANDLE
);
1185 DPRINT1("LockHandle %p\n", LockHandle
);
1186 PortAcquireSpinLock(DeviceExtension
,
1192 case ReleaseSpinLock
:
1193 DPRINT1("ReleaseSpinLock\n");
1194 LockHandle
= (PSTOR_LOCK_HANDLE
)va_arg(ap
, PSTOR_LOCK_HANDLE
);
1195 DPRINT1("LockHandle %p\n", LockHandle
);
1196 PortReleaseSpinLock(DeviceExtension
,
1201 DPRINT1("Unsupported Notification %lx\n", NotificationType
);
1216 _In_ PVOID HwDeviceExtension
,
1219 DPRINT1("StorPortPause()\n");
1231 StorPortPauseDevice(
1232 _In_ PVOID HwDeviceExtension
,
1234 _In_ UCHAR TargetId
,
1238 DPRINT1("StorPortPauseDevice()\n");
1244 #if defined(_M_AMD64)
1248 /* KeQuerySystemTime is an inline function,
1249 so we cannot forward the export to ntoskrnl */
1253 StorPortQuerySystemTime(
1254 _Out_ PLARGE_INTEGER CurrentTime
)
1256 DPRINT1("StorPortQuerySystemTime(%p)\n", CurrentTime
);
1258 KeQuerySystemTime(CurrentTime
);
1260 #endif /* defined(_M_AMD64) */
1270 _In_ PVOID HwDeviceExtension
)
1272 DPRINT1("StorPortReady()\n");
1284 StorPortRegistryRead(
1285 _In_ PVOID HwDeviceExtension
,
1286 _In_ PUCHAR ValueName
,
1290 _In_ PULONG BufferLength
)
1292 DPRINT1("StorPortRegistryRead()\n");
1304 StorPortRegistryWrite(
1305 _In_ PVOID HwDeviceExtension
,
1306 _In_ PUCHAR ValueName
,
1310 _In_ ULONG BufferLength
)
1312 DPRINT1("StorPortRegistryWrite()\n");
1325 _In_ PVOID HwDeviceExtension
)
1327 DPRINT1("StorPortResume()\n");
1339 StorPortResumeDevice(
1340 _In_ PVOID HwDeviceExtension
,
1342 _In_ UCHAR TargetId
,
1345 DPRINT1("StorPortResumeDevice()\n");
1357 StorPortSetBusDataByOffset(
1358 _In_ PVOID DeviceExtension
,
1359 _In_ ULONG BusDataType
,
1360 _In_ ULONG SystemIoBusNumber
,
1361 _In_ ULONG SlotNumber
,
1362 _In_reads_bytes_(Length
) PVOID Buffer
,
1366 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
1367 PBUS_INTERFACE_STANDARD Interface
;
1370 DPRINT1("StorPortSetBusData(%p %lu %lu %lu %p %lu %lu)\n",
1371 DeviceExtension
, BusDataType
, SystemIoBusNumber
, SlotNumber
, Buffer
, Offset
, Length
);
1373 MiniportExtension
= CONTAINING_RECORD(DeviceExtension
,
1374 MINIPORT_DEVICE_EXTENSION
,
1376 DPRINT1("DeviceExtension %p MiniportExtension %p\n",
1377 DeviceExtension
, MiniportExtension
);
1379 Interface
= &MiniportExtension
->Miniport
->DeviceExtension
->BusInterface
;
1381 ReturnLength
= Interface
->SetBusData(Interface
->Context
,
1386 DPRINT1("ReturnLength: %lu\n", ReturnLength
);
1388 return ReturnLength
;
1398 StorPortSetDeviceQueueDepth(
1399 _In_ PVOID HwDeviceExtension
,
1401 _In_ UCHAR TargetId
,
1405 DPRINT1("StorPortSetDeviceQueueDepth()\n");
1417 StorPortStallExecution(
1420 KeStallExecutionProcessor(Delay
);
1430 StorPortSynchronizeAccess(
1431 _In_ PVOID HwDeviceExtension
,
1432 _In_ PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine
,
1433 _In_opt_ PVOID Context
)
1435 DPRINT1("StorPortSynchronizeAccess()\n");
1446 StorPortValidateRange(
1447 _In_ PVOID HwDeviceExtension
,
1448 _In_ INTERFACE_TYPE BusType
,
1449 _In_ ULONG SystemIoBusNumber
,
1450 _In_ STOR_PHYSICAL_ADDRESS IoAddress
,
1451 _In_ ULONG NumberOfBytes
,
1452 _In_ BOOLEAN InIoSpace
)
1454 DPRINT1("StorPortValidateRange()\n");