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 /* Attach the FDO to the device stack */
227 Status
= IoAttachDeviceToDeviceStackSafe(Fdo
,
228 PhysicalDeviceObject
,
229 &DeviceExtension
->LowerDevice
);
230 if (!NT_SUCCESS(Status
))
232 DPRINT1("IoAttachDeviceToDeviceStackSafe() failed (Status 0x%08lx)\n", Status
);
237 /* Insert the FDO to the drivers FDO list */
238 DriverObjectExtension
= IoGetDriverObjectExtension(DriverObject
,
240 ASSERT(DriverObjectExtension
->ExtensionType
== DriverExtension
);
242 DeviceExtension
->DriverExtension
= DriverObjectExtension
;
244 KeAcquireInStackQueuedSpinLock(&DriverObjectExtension
->AdapterListLock
,
247 InsertHeadList(&DriverObjectExtension
->AdapterListHead
,
248 &DeviceExtension
->AdapterListEntry
);
249 DriverObjectExtension
->AdapterCount
++;
251 KeReleaseInStackQueuedSpinLock(&LockHandle
);
253 /* The device has been initialized */
254 Fdo
->Flags
&= ~DO_DEVICE_INITIALIZING
;
256 DPRINT1("PortAddDevice() done (Status 0x%08lx)\n", Status
);
266 _In_ PDRIVER_OBJECT DriverObject
)
268 PDRIVER_OBJECT_EXTENSION DriverExtension
;
270 DPRINT1("PortUnload(%p)\n",
273 DriverExtension
= IoGetDriverObjectExtension(DriverObject
,
275 if (DriverExtension
!= NULL
)
277 PortDeleteDriverInitData(DriverExtension
);
286 IN PDEVICE_OBJECT DeviceObject
,
289 DPRINT1("PortDispatchCreate(%p %p)\n",
292 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
293 Irp
->IoStatus
.Information
= FILE_OPENED
;
295 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
297 return STATUS_SUCCESS
;
305 IN PDEVICE_OBJECT DeviceObject
,
308 DPRINT1("PortDispatchClose(%p %p)\n",
311 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
312 Irp
->IoStatus
.Information
= 0;
314 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
316 return STATUS_SUCCESS
;
323 PortDispatchDeviceControl(
324 IN PDEVICE_OBJECT DeviceObject
,
327 DPRINT1("PortDispatchDeviceControl(%p %p)\n",
330 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
331 Irp
->IoStatus
.Information
= 0;
333 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
335 return STATUS_SUCCESS
;
343 IN PDEVICE_OBJECT DeviceObject
,
346 PFDO_DEVICE_EXTENSION DeviceExtension
;
348 DPRINT1("PortDispatchScsi(%p %p)\n",
351 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
352 DPRINT1("ExtensionType: %u\n", DeviceExtension
->ExtensionType
);
354 switch (DeviceExtension
->ExtensionType
)
357 return PortFdoScsi(DeviceObject
,
361 return PortPdoScsi(DeviceObject
,
365 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
366 Irp
->IoStatus
.Information
= 0;
367 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
368 return STATUS_UNSUCCESSFUL
;
371 return STATUS_SUCCESS
;
378 PortDispatchSystemControl(
379 IN PDEVICE_OBJECT DeviceObject
,
382 DPRINT1("PortDispatchSystemControl(%p %p)\n",
385 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
386 Irp
->IoStatus
.Information
= 0;
388 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
390 return STATUS_SUCCESS
;
398 IN PDEVICE_OBJECT DeviceObject
,
401 PFDO_DEVICE_EXTENSION DeviceExtension
;
403 DPRINT1("PortDispatchPnp(%p %p)\n",
406 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
407 DPRINT1("ExtensionType: %u\n", DeviceExtension
->ExtensionType
);
409 switch (DeviceExtension
->ExtensionType
)
412 return PortFdoPnp(DeviceObject
,
416 return PortPdoPnp(DeviceObject
,
420 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
421 Irp
->IoStatus
.Information
= 0;
422 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
423 return STATUS_UNSUCCESSFUL
;
432 IN PDEVICE_OBJECT DeviceObject
,
435 DPRINT1("PortDispatchPower(%p %p)\n",
438 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
439 Irp
->IoStatus
.Information
= 0;
441 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
443 return STATUS_SUCCESS
;
447 /* PUBLIC FUNCTIONS ***********************************************************/
455 _In_ PDRIVER_OBJECT DriverObject
,
456 _In_ PUNICODE_STRING RegistryPath
)
458 DPRINT1("DriverEntry(%p %p)\n", DriverObject
, RegistryPath
);
459 return STATUS_SUCCESS
;
469 StorPortAllocateRegistryBuffer(
470 _In_ PVOID HwDeviceExtension
,
473 DPRINT1("StorPortAllocateRegistryBuffer()\n");
486 _In_ PVOID HwDeviceExtension
,
487 _In_ ULONG RequestsToComplete
)
489 DPRINT1("StorPortBuzy()\n");
501 StorPortCompleteRequest(
502 _In_ PVOID HwDeviceExtension
,
506 _In_ UCHAR SrbStatus
)
508 DPRINT1("StorPortCompleteRequest()\n");
519 StorPortConvertPhysicalAddressToUlong(
520 _In_ STOR_PHYSICAL_ADDRESS Address
)
522 DPRINT1("StorPortConvertPhysicalAddressToUlong()\n");
524 return Address
.u
.LowPart
;
532 STOR_PHYSICAL_ADDRESS
534 StorPortConvertUlongToPhysicalAddress(
535 _In_ ULONG_PTR UlongAddress
)
537 STOR_PHYSICAL_ADDRESS Address
;
539 DPRINT1("StorPortConvertUlongToPhysicalAddress()\n");
541 Address
.QuadPart
= UlongAddress
;
552 _In_ ULONG DebugPrintLevel
,
553 _In_ PCHAR DebugMessage
,
558 va_start(ap
, DebugMessage
);
559 vDbgPrintExWithPrefix("STORMINI: ", 0x58, DebugPrintLevel
, DebugMessage
, ap
);
571 _In_ PVOID HwDeviceExtension
,
575 _In_ ULONG RequestsToComplete
)
577 DPRINT1("StorPortDeviceBusy()\n");
590 _In_ PVOID HwDeviceExtension
,
595 DPRINT1("StorPortDeviceReady()\n");
606 StorPortExtendedFunction(
607 _In_ STORPORT_FUNCTION_CODE FunctionCode
,
608 _In_ PVOID HwDeviceExtension
,
611 DPRINT1("StorPortExtendedFunction(%d %p ...)\n",
612 FunctionCode
, HwDeviceExtension
);
614 return STATUS_NOT_IMPLEMENTED
;
624 StorPortFreeDeviceBase(
625 _In_ PVOID HwDeviceExtension
,
626 _In_ PVOID MappedAddress
)
628 DPRINT1("StorPortFreeDeviceBase(%p %p)\n",
629 HwDeviceExtension
, MappedAddress
);
639 StorPortFreeRegistryBuffer(
640 _In_ PVOID HwDeviceExtension
,
643 DPRINT1("StorPortFreeRegistryBuffer()\n");
655 _In_ PVOID DeviceExtension
,
656 _In_ ULONG BusDataType
,
657 _In_ ULONG SystemIoBusNumber
,
658 _In_ ULONG SlotNumber
,
659 _Out_
_When_(Length
!= 0, _Out_writes_bytes_(Length
)) PVOID Buffer
,
662 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
663 PBUS_INTERFACE_STANDARD Interface
;
666 DPRINT1("StorPortGetBusData(%p %lu %lu %lu %p %lu)\n",
667 DeviceExtension
, BusDataType
, SystemIoBusNumber
, SlotNumber
, Buffer
, Length
);
669 /* Get the miniport extension */
670 MiniportExtension
= CONTAINING_RECORD(DeviceExtension
,
671 MINIPORT_DEVICE_EXTENSION
,
673 DPRINT1("DeviceExtension %p MiniportExtension %p\n",
674 DeviceExtension
, MiniportExtension
);
676 Interface
= &MiniportExtension
->Miniport
->DeviceExtension
->BusInterface
;
678 if (BusDataType
== 4)
681 ReturnLength
= Interface
->GetBusData(Interface
->Context
,
686 DPRINT1("ReturnLength: %lu\n", ReturnLength
);
698 StorPortGetDeviceBase(
699 _In_ PVOID HwDeviceExtension
,
700 _In_ INTERFACE_TYPE BusType
,
701 _In_ ULONG SystemIoBusNumber
,
702 _In_ STOR_PHYSICAL_ADDRESS IoAddress
,
703 _In_ ULONG NumberOfBytes
,
704 _In_ BOOLEAN InIoSpace
)
706 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
707 PHYSICAL_ADDRESS TranslatedAddress
;
711 DPRINT1("StorPortGetDeviceBase(%p %lu %lu 0x%I64x %lu %u)\n",
712 HwDeviceExtension
, BusType
, SystemIoBusNumber
, IoAddress
.QuadPart
, NumberOfBytes
, InIoSpace
);
714 /* Get the miniport extension */
715 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
716 MINIPORT_DEVICE_EXTENSION
,
718 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
719 HwDeviceExtension
, MiniportExtension
);
721 if (!TranslateResourceListAddress(MiniportExtension
->Miniport
->DeviceExtension
,
729 DPRINT1("Checkpoint!\n");
733 DPRINT1("Translated Address: 0x%I64x\n", TranslatedAddress
.QuadPart
);
738 DPRINT1("Translated Address: %p\n", (PVOID
)(ULONG_PTR
)TranslatedAddress
.QuadPart
);
739 return (PVOID
)(ULONG_PTR
)TranslatedAddress
.QuadPart
;
742 /* In memory space */
743 MappedAddress
= MmMapIoSpace(TranslatedAddress
,
746 DPRINT1("Mapped Address: %p\n", MappedAddress
);
748 Status
= AllocateAddressMapping(&MiniportExtension
->Miniport
->DeviceExtension
->MappedAddressList
,
753 if (!NT_SUCCESS(Status
))
755 DPRINT1("Checkpoint!\n");
756 MappedAddress
= NULL
;
759 DPRINT1("Mapped Address: %p\n", MappedAddress
);
760 return MappedAddress
;
770 StorPortGetLogicalUnit(
771 _In_ PVOID HwDeviceExtension
,
776 DPRINT1("StorPortGetLogicalUnit()\n");
786 STOR_PHYSICAL_ADDRESS
788 StorPortGetPhysicalAddress(
789 _In_ PVOID HwDeviceExtension
,
790 _In_opt_ PSCSI_REQUEST_BLOCK Srb
,
791 _In_ PVOID VirtualAddress
,
794 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
795 PFDO_DEVICE_EXTENSION DeviceExtension
;
796 STOR_PHYSICAL_ADDRESS PhysicalAddress
;
799 DPRINT1("StorPortGetPhysicalAddress(%p %p %p %p)\n",
800 HwDeviceExtension
, Srb
, VirtualAddress
, Length
);
802 /* Get the miniport extension */
803 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
804 MINIPORT_DEVICE_EXTENSION
,
806 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
807 HwDeviceExtension
, MiniportExtension
);
809 DeviceExtension
= MiniportExtension
->Miniport
->DeviceExtension
;
811 /* Inside of the uncached extension? */
812 if (((ULONG_PTR
)VirtualAddress
>= (ULONG_PTR
)DeviceExtension
->UncachedExtensionVirtualBase
) &&
813 ((ULONG_PTR
)VirtualAddress
<= (ULONG_PTR
)DeviceExtension
->UncachedExtensionVirtualBase
+ DeviceExtension
->UncachedExtensionSize
))
815 Offset
= (ULONG_PTR
)VirtualAddress
- (ULONG_PTR
)DeviceExtension
->UncachedExtensionVirtualBase
;
817 PhysicalAddress
.QuadPart
= DeviceExtension
->UncachedExtensionPhysicalBase
.QuadPart
+ Offset
;
818 *Length
= DeviceExtension
->UncachedExtensionSize
- Offset
;
820 return PhysicalAddress
;
826 PhysicalAddress
= MmGetPhysicalAddress(VirtualAddress
);
831 // PhysicalAddress.QuadPart = (LONGLONG)0;
833 return PhysicalAddress
;
841 PSTOR_SCATTER_GATHER_LIST
843 StorPortGetScatterGatherList(
844 _In_ PVOID DeviceExtension
,
845 _In_ PSCSI_REQUEST_BLOCK Srb
)
847 DPRINT1("StorPortGetScatterGatherList()\n");
860 _In_ PVOID DeviceExtension
,
866 DPRINT("StorPortGetSrb()\n");
877 StorPortGetUncachedExtension(
878 _In_ PVOID HwDeviceExtension
,
879 _In_ PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
880 _In_ ULONG NumberOfBytes
)
882 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
883 PFDO_DEVICE_EXTENSION DeviceExtension
;
884 PHYSICAL_ADDRESS LowestAddress
, HighestAddress
, Alignment
;
886 DPRINT1("StorPortGetUncachedExtension(%p %p %lu)\n",
887 HwDeviceExtension
, ConfigInfo
, NumberOfBytes
);
889 /* Get the miniport extension */
890 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
891 MINIPORT_DEVICE_EXTENSION
,
893 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
894 HwDeviceExtension
, MiniportExtension
);
896 DeviceExtension
= MiniportExtension
->Miniport
->DeviceExtension
;
898 /* Return the uncached extension base address if we already have one */
899 if (DeviceExtension
->UncachedExtensionVirtualBase
!= NULL
)
900 return DeviceExtension
->UncachedExtensionVirtualBase
;
902 // FIXME: Set DMA stuff here?
904 /* Allocate the uncached extension */
905 Alignment
.QuadPart
= 0;
906 LowestAddress
.QuadPart
= 0;
907 HighestAddress
.QuadPart
= 0x00000000FFFFFFFF;
908 DeviceExtension
->UncachedExtensionVirtualBase
= MmAllocateContiguousMemorySpecifyCache(NumberOfBytes
,
913 if (DeviceExtension
->UncachedExtensionVirtualBase
== NULL
)
916 DeviceExtension
->UncachedExtensionPhysicalBase
= MmGetPhysicalAddress(DeviceExtension
->UncachedExtensionVirtualBase
);
917 DeviceExtension
->UncachedExtensionSize
= NumberOfBytes
;
919 return DeviceExtension
->UncachedExtensionVirtualBase
;
929 StorPortGetVirtualAddress(
930 _In_ PVOID HwDeviceExtension
,
931 _In_ STOR_PHYSICAL_ADDRESS PhysicalAddress
)
933 DPRINT1("StorPortGetVirtualAddress(%p %I64x)\n",
934 HwDeviceExtension
, PhysicalAddress
.QuadPart
);
947 _In_ PVOID Argument1
,
948 _In_ PVOID Argument2
,
949 _In_
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
950 _In_opt_ PVOID HwContext
)
952 PDRIVER_OBJECT DriverObject
= (PDRIVER_OBJECT
)Argument1
;
953 PUNICODE_STRING RegistryPath
= (PUNICODE_STRING
)Argument2
;
954 PDRIVER_OBJECT_EXTENSION DriverObjectExtension
;
955 NTSTATUS Status
= STATUS_SUCCESS
;
957 DPRINT1("StorPortInitialize(%p %p %p %p)\n",
958 Argument1
, Argument2
, HwInitializationData
, HwContext
);
960 DPRINT1("HwInitializationDataSize: %lu\n", HwInitializationData
->HwInitializationDataSize
);
961 DPRINT1("AdapterInterfaceType: %u\n", HwInitializationData
->AdapterInterfaceType
);
962 DPRINT1("HwInitialize: %p\n", HwInitializationData
->HwInitialize
);
963 DPRINT1("HwStartIo: %p\n", HwInitializationData
->HwStartIo
);
964 DPRINT1("HwInterrupt: %p\n", HwInitializationData
->HwInterrupt
);
965 DPRINT1("HwFindAdapter: %p\n", HwInitializationData
->HwFindAdapter
);
966 DPRINT1("HwResetBus: %p\n", HwInitializationData
->HwResetBus
);
967 DPRINT1("HwDmaStarted: %p\n", HwInitializationData
->HwDmaStarted
);
968 DPRINT1("HwAdapterState: %p\n", HwInitializationData
->HwAdapterState
);
969 DPRINT1("DeviceExtensionSize: %lu\n", HwInitializationData
->DeviceExtensionSize
);
970 DPRINT1("SpecificLuExtensionSize: %lu\n", HwInitializationData
->SpecificLuExtensionSize
);
971 DPRINT1("SrbExtensionSize: %lu\n", HwInitializationData
->SrbExtensionSize
);
972 DPRINT1("NumberOfAccessRanges: %lu\n", HwInitializationData
->NumberOfAccessRanges
);
974 /* Check parameters */
975 if ((DriverObject
== NULL
) ||
976 (RegistryPath
== NULL
) ||
977 (HwInitializationData
== NULL
))
979 DPRINT1("Invalid parameter!\n");
980 return STATUS_INVALID_PARAMETER
;
983 /* Check initialization data */
984 if ((HwInitializationData
->HwInitializationDataSize
< sizeof(HW_INITIALIZATION_DATA
)) ||
985 (HwInitializationData
->HwInitialize
== NULL
) ||
986 (HwInitializationData
->HwStartIo
== NULL
) ||
987 (HwInitializationData
->HwFindAdapter
== NULL
) ||
988 (HwInitializationData
->HwResetBus
== NULL
))
990 DPRINT1("Revision mismatch!\n");
991 return STATUS_REVISION_MISMATCH
;
994 DriverObjectExtension
= IoGetDriverObjectExtension(DriverObject
,
996 if (DriverObjectExtension
== NULL
)
998 DPRINT1("No driver object extension!\n");
1000 Status
= IoAllocateDriverObjectExtension(DriverObject
,
1002 sizeof(DRIVER_OBJECT_EXTENSION
),
1003 (PVOID
*)&DriverObjectExtension
);
1004 if (!NT_SUCCESS(Status
))
1006 DPRINT1("IoAllocateDriverObjectExtension() failed (Status 0x%08lx)\n", Status
);
1010 DPRINT1("Driver object extension created!\n");
1012 /* Initialize the driver object extension */
1013 RtlZeroMemory(DriverObjectExtension
,
1014 sizeof(DRIVER_OBJECT_EXTENSION
));
1016 DriverObjectExtension
->ExtensionType
= DriverExtension
;
1017 DriverObjectExtension
->DriverObject
= DriverObject
;
1019 InitializeListHead(&DriverObjectExtension
->AdapterListHead
);
1020 KeInitializeSpinLock(&DriverObjectExtension
->AdapterListLock
);
1022 InitializeListHead(&DriverObjectExtension
->InitDataListHead
);
1025 DriverObject
->DriverExtension
->AddDevice
= PortAddDevice
;
1026 // DriverObject->DriverStartIo = PortStartIo;
1027 DriverObject
->DriverUnload
= PortUnload
;
1028 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = PortDispatchCreate
;
1029 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = PortDispatchClose
;
1030 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = PortDispatchDeviceControl
;
1031 DriverObject
->MajorFunction
[IRP_MJ_SCSI
] = PortDispatchScsi
;
1032 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = PortDispatchPower
;
1033 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = PortDispatchSystemControl
;
1034 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = PortDispatchPnp
;
1037 /* Add the initialzation data to the driver extension */
1038 Status
= PortAddDriverInitData(DriverObjectExtension
,
1039 HwInitializationData
);
1041 DPRINT1("StorPortInitialize() done (Status 0x%08lx)\n", Status
);
1054 _In_ PVOID HwDeviceExtension
,
1055 _In_opt_ PSCSI_REQUEST_BLOCK Srb
,
1057 _In_ UCHAR TargetId
,
1059 _In_ ULONG ErrorCode
,
1060 _In_ ULONG UniqueId
)
1062 DPRINT1("ScsiPortLogError() called\n");
1063 DPRINT1("PathId: 0x%02x TargetId: 0x%02x Lun: 0x%02x ErrorCode: 0x%08lx UniqueId: 0x%08lx\n",
1064 PathId
, TargetId
, Lun
, ErrorCode
, UniqueId
);
1066 DPRINT1("ScsiPortLogError() done\n");
1077 _Out_writes_bytes_(Length
) PVOID Destination
,
1078 _In_reads_bytes_(Length
) PVOID Source
,
1081 RtlMoveMemory(Destination
, Source
, Length
);
1090 StorPortNotification(
1091 _In_ SCSI_NOTIFICATION_TYPE NotificationType
,
1092 _In_ PVOID HwDeviceExtension
,
1095 PMINIPORT_DEVICE_EXTENSION MiniportExtension
= NULL
;
1096 PFDO_DEVICE_EXTENSION DeviceExtension
= NULL
;
1097 PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine
;
1098 PSTORPORT_EXTENDED_FUNCTIONS
*ppExtendedFunctions
;
1101 PHW_DPC_ROUTINE HwDpcRoutine
;
1104 STOR_SPINLOCK SpinLock
;
1106 PSTOR_LOCK_HANDLE LockHandle
;
1108 DPRINT1("StorPortNotification(%x %p)\n",
1109 NotificationType
, HwDeviceExtension
);
1111 /* Get the miniport extension */
1112 if (HwDeviceExtension
!= NULL
)
1114 MiniportExtension
= CONTAINING_RECORD(HwDeviceExtension
,
1115 MINIPORT_DEVICE_EXTENSION
,
1117 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
1118 HwDeviceExtension
, MiniportExtension
);
1120 DeviceExtension
= MiniportExtension
->Miniport
->DeviceExtension
;
1123 va_start(ap
, HwDeviceExtension
);
1125 switch (NotificationType
)
1127 case GetExtendedFunctionTable
:
1128 DPRINT1("GetExtendedFunctionTable\n");
1129 ppExtendedFunctions
= (PSTORPORT_EXTENDED_FUNCTIONS
*)va_arg(ap
, PSTORPORT_EXTENDED_FUNCTIONS
*);
1130 if (ppExtendedFunctions
!= NULL
)
1131 *ppExtendedFunctions
= NULL
; /* FIXME */
1134 case EnablePassiveInitialization
:
1135 DPRINT1("EnablePassiveInitialization\n");
1136 HwPassiveInitRoutine
= (PHW_PASSIVE_INITIALIZE_ROUTINE
)va_arg(ap
, PHW_PASSIVE_INITIALIZE_ROUTINE
);
1137 DPRINT1("HwPassiveInitRoutine %p\n", HwPassiveInitRoutine
);
1138 Result
= (PBOOLEAN
)va_arg(ap
, PBOOLEAN
);
1142 if ((DeviceExtension
!= NULL
) &&
1143 (DeviceExtension
->HwPassiveInitRoutine
== NULL
))
1145 DeviceExtension
->HwPassiveInitRoutine
= HwPassiveInitRoutine
;
1151 DPRINT1("InitializeDpc\n");
1152 Dpc
= (PSTOR_DPC
)va_arg(ap
, PSTOR_DPC
);
1153 DPRINT1("Dpc %p\n", Dpc
);
1154 HwDpcRoutine
= (PHW_DPC_ROUTINE
)va_arg(ap
, PHW_DPC_ROUTINE
);
1155 DPRINT1("HwDpcRoutine %p\n", HwDpcRoutine
);
1157 KeInitializeDpc((PRKDPC
)&Dpc
->Dpc
,
1158 (PKDEFERRED_ROUTINE
)HwDpcRoutine
,
1159 (PVOID
)DeviceExtension
);
1160 KeInitializeSpinLock(&Dpc
->Lock
);
1163 case AcquireSpinLock
:
1164 DPRINT1("AcquireSpinLock\n");
1165 SpinLock
= (STOR_SPINLOCK
)va_arg(ap
, STOR_SPINLOCK
);
1166 DPRINT1("SpinLock %lu\n", SpinLock
);
1167 LockContext
= (PVOID
)va_arg(ap
, PVOID
);
1168 DPRINT1("LockContext %p\n", LockContext
);
1169 LockHandle
= (PSTOR_LOCK_HANDLE
)va_arg(ap
, PSTOR_LOCK_HANDLE
);
1170 DPRINT1("LockHandle %p\n", LockHandle
);
1171 PortAcquireSpinLock(DeviceExtension
,
1177 case ReleaseSpinLock
:
1178 DPRINT1("ReleaseSpinLock\n");
1179 LockHandle
= (PSTOR_LOCK_HANDLE
)va_arg(ap
, PSTOR_LOCK_HANDLE
);
1180 DPRINT1("LockHandle %p\n", LockHandle
);
1181 PortReleaseSpinLock(DeviceExtension
,
1186 DPRINT1("Unsupported Notification %lx\n", NotificationType
);
1201 _In_ PVOID HwDeviceExtension
,
1204 DPRINT1("StorPortPause()\n");
1216 StorPortPauseDevice(
1217 _In_ PVOID HwDeviceExtension
,
1219 _In_ UCHAR TargetId
,
1223 DPRINT1("StorPortPauseDevice()\n");
1229 #if defined(_M_AMD64)
1233 /* KeQuerySystemTime is an inline function,
1234 so we cannot forward the export to ntoskrnl */
1238 StorPortQuerySystemTime(
1239 _Out_ PLARGE_INTEGER CurrentTime
)
1241 DPRINT1("StorPortQuerySystemTime(%p)\n", CurrentTime
);
1243 KeQuerySystemTime(CurrentTime
);
1245 #endif /* defined(_M_AMD64) */
1255 _In_ PVOID HwDeviceExtension
)
1257 DPRINT1("StorPortReady()\n");
1269 StorPortRegistryRead(
1270 _In_ PVOID HwDeviceExtension
,
1271 _In_ PUCHAR ValueName
,
1275 _In_ PULONG BufferLength
)
1277 DPRINT1("StorPortRegistryRead()\n");
1289 StorPortRegistryWrite(
1290 _In_ PVOID HwDeviceExtension
,
1291 _In_ PUCHAR ValueName
,
1295 _In_ ULONG BufferLength
)
1297 DPRINT1("StorPortRegistryWrite()\n");
1310 _In_ PVOID HwDeviceExtension
)
1312 DPRINT1("StorPortResume()\n");
1324 StorPortResumeDevice(
1325 _In_ PVOID HwDeviceExtension
,
1327 _In_ UCHAR TargetId
,
1330 DPRINT1("StorPortResumeDevice()\n");
1342 StorPortSetBusDataByOffset(
1343 _In_ PVOID DeviceExtension
,
1344 _In_ ULONG BusDataType
,
1345 _In_ ULONG SystemIoBusNumber
,
1346 _In_ ULONG SlotNumber
,
1347 _In_reads_bytes_(Length
) PVOID Buffer
,
1351 PMINIPORT_DEVICE_EXTENSION MiniportExtension
;
1352 PBUS_INTERFACE_STANDARD Interface
;
1355 DPRINT1("StorPortSetBusData(%p %lu %lu %lu %p %lu %lu)\n",
1356 DeviceExtension
, BusDataType
, SystemIoBusNumber
, SlotNumber
, Buffer
, Offset
, Length
);
1358 MiniportExtension
= CONTAINING_RECORD(DeviceExtension
,
1359 MINIPORT_DEVICE_EXTENSION
,
1361 DPRINT1("DeviceExtension %p MiniportExtension %p\n",
1362 DeviceExtension
, MiniportExtension
);
1364 Interface
= &MiniportExtension
->Miniport
->DeviceExtension
->BusInterface
;
1366 ReturnLength
= Interface
->SetBusData(Interface
->Context
,
1371 DPRINT1("ReturnLength: %lu\n", ReturnLength
);
1373 return ReturnLength
;
1383 StorPortSetDeviceQueueDepth(
1384 _In_ PVOID HwDeviceExtension
,
1386 _In_ UCHAR TargetId
,
1390 DPRINT1("StorPortSetDeviceQueueDepth()\n");
1402 StorPortStallExecution(
1405 KeStallExecutionProcessor(Delay
);
1415 StorPortSynchronizeAccess(
1416 _In_ PVOID HwDeviceExtension
,
1417 _In_ PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine
,
1418 _In_opt_ PVOID Context
)
1420 DPRINT1("StorPortSynchronizeAccess()\n");
1431 StorPortValidateRange(
1432 _In_ PVOID HwDeviceExtension
,
1433 _In_ INTERFACE_TYPE BusType
,
1434 _In_ ULONG SystemIoBusNumber
,
1435 _In_ STOR_PHYSICAL_ADDRESS IoAddress
,
1436 _In_ ULONG NumberOfBytes
,
1437 _In_ BOOLEAN InIoSpace
)
1439 DPRINT1("StorPortValidateRange()\n");