ReactOS 0.4.17-dev-1343-g8fe3cee
storport.c
Go to the documentation of this file.
1/*
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)
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "precomp.h"
11#include "inline.h"
12#include "wdm.h"
13
14#define NDEBUG
15#include <debug.h>
16#include <stdarg.h>
17
18
19/* GLOBALS ********************************************************************/
20
22
23
24/* FUNCTIONS ******************************************************************/
25
26static
31{
32 PDRIVER_INIT_DATA InitData;
34
35 DPRINT1("PortAddDriverInitData()\n");
36
38 sizeof(DRIVER_INIT_DATA),
40 if (InitData == NULL)
41 return STATUS_NO_MEMORY;
42
43 /* Copy only what both interface revisions share, absent members stay zero */
44 Length = min(HwInitializationData->HwInitializationDataSize,
45 sizeof(InitData->HwInitData));
46
47 RtlZeroMemory(&InitData->HwInitData, sizeof(InitData->HwInitData));
48 RtlCopyMemory(&InitData->HwInitData,
50 Length);
51
52 InsertHeadList(&DriverExtension->InitDataListHead,
53 &InitData->Entry);
54
55 return STATUS_SUCCESS;
56}
57
58
59static
60VOID
63{
64 PDRIVER_INIT_DATA InitData;
65 PLIST_ENTRY ListEntry;
66
67 DPRINT1("PortDeleteDriverInitData()\n");
68
69 ListEntry = DriverExtension->InitDataListHead.Flink;
70 while (ListEntry != &DriverExtension->InitDataListHead)
71 {
72 InitData = CONTAINING_RECORD(ListEntry,
74 Entry);
75
76 RemoveEntryList(&InitData->Entry);
77
78 ExFreePoolWithTag(InitData,
80
81 ListEntry = DriverExtension->InitDataListHead.Flink;
82 }
83}
84
85
90{
91 PDRIVER_INIT_DATA InitData;
92 PLIST_ENTRY ListEntry;
93
94 DPRINT1("PortGetDriverInitData()\n");
95
96 ListEntry = DriverExtension->InitDataListHead.Flink;
97 while (ListEntry != &DriverExtension->InitDataListHead)
98 {
99 InitData = CONTAINING_RECORD(ListEntry,
101 Entry);
103 return &InitData->HwInitData;
104
105 ListEntry = ListEntry->Flink;
106 }
107
108 return NULL;
109}
110
111
112static
113VOID
115 PFDO_DEVICE_EXTENSION DeviceExtension,
117 PVOID LockContext,
119{
120 DPRINT("PortAcquireSpinLock(%p %lu %p %p)\n",
121 DeviceExtension, SpinLock, LockContext, LockHandle);
122
123 LockHandle->Lock = SpinLock;
124
125 switch (SpinLock)
126 {
127 case DpcLock: /* 1, */
128 DPRINT("DpcLock\n");
129 break;
130
131 case StartIoLock: /* 2 */
132 DPRINT("StartIoLock\n");
133 break;
134
135 case InterruptLock: /* 3 */
136 DPRINT("InterruptLock\n");
137 if (DeviceExtension->Interrupt == NULL)
138 LockHandle->Context.OldIrql = 0;
139 else
140 LockHandle->Context.OldIrql = KeAcquireInterruptSpinLock(DeviceExtension->Interrupt);
141 break;
142
143 /* FIXME: The Win8 lock types are not implemented yet */
144 case ThreadedDpcLock: /* 4 */
145 case DpcLevelLock: /* 5 */
146 DPRINT1("Unimplemented lock type %lu\n", SpinLock);
147 break;
148
149 case InvalidLock:
151 break;
152 }
153}
154
155
156static
157VOID
159 PFDO_DEVICE_EXTENSION DeviceExtension,
161{
162 DPRINT("PortReleaseSpinLock(%p %p)\n",
163 DeviceExtension, LockHandle);
164
165 switch (LockHandle->Lock)
166 {
167 case DpcLock: /* 1, */
168 DPRINT("DpcLock\n");
169 break;
170
171 case StartIoLock: /* 2 */
172 DPRINT("StartIoLock\n");
173 break;
174
175 case InterruptLock: /* 3 */
176 DPRINT("InterruptLock\n");
177 if (DeviceExtension->Interrupt != NULL)
178 KeReleaseInterruptSpinLock(DeviceExtension->Interrupt,
179 LockHandle->Context.OldIrql);
180 break;
181
182 /* FIXME: The Win8 lock types are not implemented yet */
183 case ThreadedDpcLock: /* 4 */
184 case DpcLevelLock: /* 5 */
185 DPRINT1("Unimplemented lock type %lu\n", LockHandle->Lock);
186 break;
187
188 case InvalidLock:
190 break;
191 }
192}
193
194
195static
197NTAPI
201{
202 PDRIVER_OBJECT_EXTENSION DriverObjectExtension;
203 PFDO_DEVICE_EXTENSION DeviceExtension = NULL;
204 WCHAR NameBuffer[sizeof("\\Device\\RaidPort4294967295")];
208
209 DPRINT1("PortAddDevice(%p %p)\n",
211
214
215 Status = RtlStringCbPrintfW(NameBuffer,
216 sizeof(NameBuffer),
217 L"\\Device\\RaidPort%lu",
218 PortNumber);
220 RtlInitUnicodeString(&DeviceName, NameBuffer);
221 PortNumber++;
222
223 DPRINT1("Creating device: %wZ\n", &DeviceName);
224
225 /* Create the port device */
227 sizeof(FDO_DEVICE_EXTENSION),
228 &DeviceName,
231 FALSE,
232 &Fdo);
233 if (!NT_SUCCESS(Status))
234 {
235 DPRINT1("IoCreateDevice() failed (Status 0x%08lx)\n", Status);
236 return Status;
237 }
238
239 DPRINT1("Created device: %wZ (%p)\n", &DeviceName, Fdo);
240
241 /* Initialize the device */
242 Fdo->Flags |= DO_DIRECT_IO;
243 Fdo->Flags |= DO_POWER_PAGABLE;
244
245 /* Initialize the device extension */
246 DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;
247 RtlZeroMemory(DeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
248
249 DeviceExtension->ExtensionType = FdoExtension;
250
251 DeviceExtension->Device = Fdo;
252 DeviceExtension->PhysicalDevice = PhysicalDeviceObject;
253
254 DeviceExtension->PnpState = dsStopped;
255
256 DeviceExtension->ScsiPortNumber = -1;
257
258 KeInitializeSpinLock(&DeviceExtension->PdoListLock);
259 InitializeListHead(&DeviceExtension->PdoListHead);
260
261 KeInitializeDpc(&DeviceExtension->BusChangeDpc, PortFdoBusChangeDpc, DeviceExtension);
262
263 KeInitializeSpinLock(&DeviceExtension->TimerListLock);
264 InitializeListHead(&DeviceExtension->TimerListHead);
265
266 /* Initialize simple timer for StorPortNotification */
267 KeInitializeTimer(&DeviceExtension->Timer);
268 KeInitializeDpc(&DeviceExtension->TimerDpc, SimpleTimerCallbackDpcRoutine, DeviceExtension);
269
270 /* Initialize FDO Device DPC for delayed completion */
271 KeInitializeDpc(&Fdo->Dpc, PortCompletionDpc, DeviceExtension);
272
273 /* Initialize completion list header */
274 InitializeSListHead(&DeviceExtension->CompletionList);
275
276 /* Initialize the queue for requests waiting on memory */
278
279 /* Initialize FDO flow control structure */
280 KeInitializeSpinLock(&DeviceExtension->FlowControl.Lock);
281 DeviceExtension->FlowControl.IsBusy = FALSE;
282 DeviceExtension->FlowControl.IsPaused = FALSE;
283 DeviceExtension->FlowControl.RemainingBusyRequests = 0;
284 DeviceExtension->FlowControl.RemainingPauseTime = 0;
285 DeviceExtension->FlowControl.OutstandingRequestCount = 0;
287
288 /* Attach the FDO to the device stack */
291 &DeviceExtension->LowerDevice);
292 if (!NT_SUCCESS(Status))
293 {
294 DPRINT1("IoAttachDeviceToDeviceStackSafe() failed (Status 0x%08lx)\n", Status);
296 return Status;
297 }
298
299 /* Insert the FDO to the drivers FDO list */
300 DriverObjectExtension = IoGetDriverObjectExtension(DriverObject,
302 ASSERT(DriverObjectExtension->ExtensionType == DriverExtension);
303
304 DeviceExtension->DriverExtension = DriverObjectExtension;
305
307 &DriverObjectExtension->AdapterListHead,
308 &DeviceExtension->AdapterListEntry,
309 &DriverObjectExtension->AdapterCount);
310
311 /* The device has been initialized */
312 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
313
314 DPRINT1("PortAddDevice() done (Status 0x%08lx)\n", Status);
315
316 return Status;
317}
318
319
320static
321VOID
322NTAPI
325{
327
328 DPRINT1("PortUnload(%p)\n",
330
333 if (DriverExtension != NULL)
334 {
336 }
337}
338
339
340static
342NTAPI
345 IN PIRP Irp)
346{
347 DPRINT("PortDispatchCreate(%p %p)\n",
349
350 Irp->IoStatus.Status = STATUS_SUCCESS;
351 Irp->IoStatus.Information = FILE_OPENED;
352
354
355 return STATUS_SUCCESS;
356}
357
358
359static
361NTAPI
364 IN PIRP Irp)
365{
366 DPRINT("PortDispatchClose(%p %p)\n",
368
369 Irp->IoStatus.Status = STATUS_SUCCESS;
370 Irp->IoStatus.Information = 0;
371
373
374 return STATUS_SUCCESS;
375}
376
377
378static
380NTAPI
383 IN PIRP Irp)
384{
385 PFDO_DEVICE_EXTENSION DeviceExtension;
386
387 DPRINT("PortDispatchDeviceControl(%p %p)\n",
389
390 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
391 DPRINT("ExtensionType: %u\n", DeviceExtension->ExtensionType);
392
393 switch (DeviceExtension->ExtensionType)
394 {
395 case FdoExtension:
397 Irp);
398
399 case PdoExtension:
401 Irp);
402
403 default:
404 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
405 Irp->IoStatus.Information = 0;
407 return STATUS_UNSUCCESSFUL;
408 }
409
410 return STATUS_SUCCESS;
411}
412
413
414static
416NTAPI
419 IN PIRP Irp)
420{
421 PFDO_DEVICE_EXTENSION DeviceExtension;
422
423 DPRINT("PortDispatchScsi(%p %p)\n",
425
426 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
427 DPRINT("ExtensionType: %u\n", DeviceExtension->ExtensionType);
428
429 switch (DeviceExtension->ExtensionType)
430 {
431 case FdoExtension:
433 Irp);
434
435 case PdoExtension:
437 Irp);
438
439 default:
440 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
441 Irp->IoStatus.Information = 0;
443 return STATUS_UNSUCCESSFUL;
444 }
445
446 return STATUS_SUCCESS;
447}
448
449
450static
452NTAPI
455 IN PIRP Irp)
456{
457 DPRINT1("PortDispatchSystemControl(%p %p)\n",
459
460 Irp->IoStatus.Status = STATUS_SUCCESS;
461 Irp->IoStatus.Information = 0;
462
464
465 return STATUS_SUCCESS;
466}
467
468
469static
471NTAPI
474 IN PIRP Irp)
475{
476 PFDO_DEVICE_EXTENSION DeviceExtension;
477
478 DPRINT1("PortDispatchPnp(%p %p)\n",
480
481 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
482 DPRINT("ExtensionType: %u\n", DeviceExtension->ExtensionType);
483
484 switch (DeviceExtension->ExtensionType)
485 {
486 case FdoExtension:
488 Irp);
489
490 case PdoExtension:
492 Irp);
493
494 default:
495 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
496 Irp->IoStatus.Information = 0;
498 return STATUS_UNSUCCESSFUL;
499 }
500}
501
502
503static
505NTAPI
508 IN PIRP Irp)
509{
510 DPRINT1("PortDispatchPower(%p %p)\n",
512
513 Irp->IoStatus.Status = STATUS_SUCCESS;
514 Irp->IoStatus.Information = 0;
515
517
518 return STATUS_SUCCESS;
519}
520
521
522/* PUBLIC FUNCTIONS ***********************************************************/
523
524/*
525 * @implemented
526 */
528NTAPI
532{
533 DPRINT1("DriverEntry(%p %p)\n", DriverObject, RegistryPath);
534 return STATUS_SUCCESS;
535}
536
537
538/*
539 * @unimplemented
540 */
542PUCHAR
543NTAPI
545 _In_ PVOID HwDeviceExtension,
547{
548 DPRINT1("StorPortAllocateRegistryBuffer()\n");
550 return NULL;
551}
552
553
554/*
555 * @unimplemented
556 */
559NTAPI
561 _In_ PVOID HwDeviceExtension,
562 _In_ ULONG RequestsToComplete)
563{
564 DPRINT1("StorPortBuzy()\n");
566 return FALSE;
567}
568
569
570/*
571 * @unimplemented
572 */
574VOID
575NTAPI
577 _In_ PVOID HwDeviceExtension,
580 _In_ UCHAR Lun,
581 _In_ UCHAR SrbStatus)
582{
583 DPRINT1("StorPortCompleteRequest()\n");
585}
586
587
588/*
589 * @implemented
590 */
592ULONG
593NTAPI
596{
597 DPRINT("StorPortConvertPhysicalAddressToUlong()\n");
598
599 return Address.u.LowPart;
600}
601
602
603/*
604 * @implemented
605 */
608NTAPI
610 _In_ ULONG_PTR UlongAddress)
611{
613
614 DPRINT("StorPortConvertUlongToPhysicalAddress()\n");
615
616 Address.QuadPart = UlongAddress;
617 return Address;
618}
619
620
621/*
622 * @implemented
623 */
625VOID
627 _In_ ULONG DebugPrintLevel,
628 _In_ PCHAR DebugMessage,
629 ...)
630{
631 va_list ap;
632
633 va_start(ap, DebugMessage);
634 vDbgPrintExWithPrefix("STORMINI: ",
635 -1,
637 DebugMessage,
638 ap);
639 va_end(ap);
640}
641
642
643/*
644 * @implemented
645 */
648NTAPI
650 _In_ PVOID HwDeviceExtension,
653 _In_ UCHAR Lun,
654 _In_ ULONG RequestsToComplete)
655{
656 /* TODO: Need coverage test */
660
661 DPRINT1("StorPortDeviceBusy(%p %d %d %d %d)\n",
662 HwDeviceExtension, PathId, TargetId, Lun, RequestsToComplete);
663
664 FdoExtension = StorpGetMiniportFdo(HwDeviceExtension);
666
668 NT_ASSERT(!PdoExtension->FlowControl.IsBusy);
669 PdoExtension->FlowControl.IsBusy = TRUE;
670 PdoExtension->FlowControl.RemainingBusyRequests = RequestsToComplete;
672
673 return FALSE;
674}
675
676
677/*
678 * @unimplemented
679 */
682NTAPI
684 _In_ PVOID HwDeviceExtension,
687 _In_ UCHAR Lun)
688{
689 /* TODO: Need coverage test */
693
694 DPRINT1("StorPortDeviceReady(%p %d %d %d %d)\n",
695 HwDeviceExtension, PathId, TargetId, Lun);
696
697 FdoExtension = StorpGetMiniportFdo(HwDeviceExtension);
699
701 NT_ASSERT(!PdoExtension->FlowControl.IsBusy);
702 PdoExtension->FlowControl.IsBusy = FALSE;
704
705 return FALSE;
706}
707
708
709/*
710 * @unimplemented
711 */
713ULONG
715 _In_ STORPORT_FUNCTION_CODE FunctionCode,
716 _In_ PVOID HwDeviceExtension,
717 ...)
718{
719 va_list va;
721 PMINIPORT_DEVICE_EXTENSION MiniportExtension = NULL;
722 PFDO_DEVICE_EXTENSION DeviceExtension = NULL;
723 ULONG AllocatePoolSize;
725 PVOID* AllocatedPoolPointer;
726 PVOID PoolPointer;
727
728 DPRINT1("StorPortExtendedFunction(%d %p ...)\n",
729 FunctionCode, HwDeviceExtension);
730
731 va_start(va, HwDeviceExtension);
732
733 switch (FunctionCode) {
735 {
736 /* Allocate a non paged pool for miniport */
737 AllocatePoolSize = va_arg(va, ULONG);
738 PoolTag = va_arg(va, ULONG);
739 AllocatedPoolPointer = va_arg(va, PVOID*);
740
741 if (AllocatedPoolPointer == NULL) {
743 break;
744 }
745
746 PoolPointer = ExAllocatePoolWithTag(NonPagedPool, AllocatePoolSize, PoolTag);
747
748 if (PoolPointer == NULL) {
749 *AllocatedPoolPointer = NULL;
751 break;
752 }
753
754 *AllocatedPoolPointer = PoolPointer;
756 break;
757 }
758
760 {
761 /* Free a pool allocated with ExtFunctionAllocatePool */
762 PoolPointer = va_arg(va, PVOID);
763
764 if (PoolPointer == NULL) {
766 break;
767 }
768
769 ExFreePool(PoolPointer);
771 break;
772 }
773
775 {
776 /* Allocate a timer for an HBA */
777 PTIMER_ENTRY TimerEntry;
778 PVOID* TimerHandle = va_arg(va, PVOID*);
779
780 if (TimerHandle == NULL) {
782 break;
783 }
784
786 sizeof(TIMER_ENTRY),
788 RtlZeroMemory(TimerEntry, sizeof(TIMER_ENTRY));
789
790 if (TimerEntry == NULL) {
792 break;
793 }
794
795 /* Initialize internal timer object; Win8.1+ EX_TIMER may be used too if we had it */
796 /* FIXME: IRQL > DISPATCH_LEVEL will bugcheck; queue a DPC to do this */
797 KeInitializeTimer(&TimerEntry->Timer);
798
799 MiniportExtension = CONTAINING_RECORD(HwDeviceExtension,
801 HwDeviceExtension);
802 DeviceExtension = MiniportExtension->Miniport->DeviceExtension;
803
804 /* Insert into timer list and increment counter */
806 &DeviceExtension->TimerListHead,
807 &TimerEntry->ListEntry,
808 &DeviceExtension->TimerCount);
809
810 /* Return list entry of the timer as its handle */
811 *TimerHandle = (PVOID)&TimerEntry->ListEntry;
813
814 break;
815 }
816
818 {
819 /* Schedule a single shot timer event */
820 PVOID TimerHandle = va_arg(va, PVOID);
821 PHW_TIMER_EX TimerCallback = va_arg(va, PHW_TIMER_EX);
823 ULONGLONG TimerValue = va_arg(va, ULONGLONG);
825 PTIMER_ENTRY TimerEntry;
826 ULONG IsTimerAlreadySet;
827 LARGE_INTEGER TimerDueTime;
828 NTSTATUS MultiplyResult;
829
830 /* FIXME: I actually don't know how to deal with tolerable delay */
832
833 if (HwDeviceExtension == NULL || TimerHandle == NULL || TimerCallback == NULL) {
835 break;
836 }
837
838 TimerEntry = CONTAINING_RECORD(TimerHandle, TIMER_ENTRY, ListEntry);
839
840 /* Check if timer is already set. If so, don't try to reactivate timer. */
841 IsTimerAlreadySet = InterlockedCompareExchange(&TimerEntry->TimerAlreadySet, 1, 0);
842 if (IsTimerAlreadySet == 1) {
844 break;
845 }
846
847 /* If timeout is zero, cancel the timer */
848 if (TimerValue == 0ull) {
849 KeCancelTimer(&TimerEntry->Timer);
851 break;
852 }
853
854 /* This API uses microseconds, KTIMER operate on 100 nanoseconds, multiply by 10
855 to get the correct timer due time */
856 MultiplyResult = RtlULongLongMult(TimerValue, 10ull, (PULONGLONG)&TimerDueTime.QuadPart);
857 if (!NT_SUCCESS(MultiplyResult)) {
859 break;
860 }
861
862 /* Initialize the DPC, context and set timer accordingly */
863 TimerEntry->HwDeviceExtension = HwDeviceExtension;
864 TimerEntry->TimerCallback = TimerCallback;
865 TimerEntry->Context = CallbackContext;
868 (PVOID)TimerEntry);
869 KeSetTimer(&TimerEntry->Timer,
870 TimerDueTime,
871 &TimerEntry->TimerCallbackDpc);
873 break;
874 }
875
877 {
878 /* Describe one of the message interrupts connected for the adapter */
880 PMESSAGE_INTERRUPT_INFORMATION InterruptInfo;
883
884 InterruptInfo = va_arg(va, PMESSAGE_INTERRUPT_INFORMATION);
885 if (InterruptInfo == NULL)
886 {
888 break;
889 }
890
891 FdoExtension = StorpGetMiniportFdo(HwDeviceExtension);
892 if (!FdoExtension->MessageInterrupts)
893 {
895 break;
896 }
897
898 if (MessageId >= FdoExtension->MessageInfo->MessageCount)
899 {
901 break;
902 }
903
904 Entry = &FdoExtension->MessageInfo->MessageInfo[MessageId];
905
906 InterruptInfo->MessageId = MessageId;
907 InterruptInfo->MessageData = Entry->MessageData;
908 InterruptInfo->MessageAddress = Entry->MessageAddress;
909 InterruptInfo->InterruptVector = Entry->Vector;
910 InterruptInfo->InterruptLevel = FdoExtension->MessageInfo->UnifiedIrql;
911 InterruptInfo->InterruptMode = Entry->Mode;
912
914 break;
915 }
916
918 {
919 /* Hand back a kernel address the miniport can touch the buffer through */
921 PVOID *SystemAddress = va_arg(va, PVOID *);
922 PQUEUED_REQUEST_REFERENCE RequestReference;
924
925 if (Srb == NULL || SystemAddress == NULL)
926 {
928 break;
929 }
930
931 *SystemAddress = NULL;
932
933 RequestReference = StorpRequestReference(Srb);
934 if (RequestReference->Irp == NULL || RequestReference->Irp->MdlAddress == NULL)
935 {
936 /* No buffer was described, so whatever the request carries is it */
937 *SystemAddress = StorpSrbDataBuffer(Srb);
939 break;
940 }
941
942 Address = MmGetSystemAddressForMdlSafe(RequestReference->Irp->MdlAddress,
944 if (Address == NULL)
945 {
947 break;
948 }
949
950 *SystemAddress = Address;
952 break;
953 }
954
956 {
957 /* The MDL the IO manager built for the request, if there is one */
959 PMDL *Mdl = va_arg(va, PMDL *);
960 PQUEUED_REQUEST_REFERENCE RequestReference;
961
962 if (Srb == NULL || Mdl == NULL)
963 {
965 break;
966 }
967
968 *Mdl = NULL;
969
970 RequestReference = StorpRequestReference(Srb);
971 if (RequestReference->Irp == NULL || RequestReference->Irp->MdlAddress == NULL)
972 {
974 break;
975 }
976
977 *Mdl = RequestReference->Irp->MdlAddress;
979 break;
980 }
981
983 {
984 /* Where the miniport sits in the device stack */
985 PDEVICE_OBJECT *AdapterDeviceObject = va_arg(va, PDEVICE_OBJECT *);
988
989 DeviceExtension = StorpGetMiniportFdo(HwDeviceExtension);
990
991 if (AdapterDeviceObject != NULL)
992 *AdapterDeviceObject = DeviceExtension->Device;
993
995 *PhysicalDeviceObject = DeviceExtension->PhysicalDevice;
996
997 if (LowerDeviceObject != NULL)
998 *LowerDeviceObject = DeviceExtension->LowerDevice;
999
1001 break;
1002 }
1003
1005 {
1006 /* Completions are not spread over processors yet, accept and ignore */
1008 break;
1009 }
1010
1011 default:
1012 {
1014 // __debugbreak();
1015 }
1016 }
1017
1018 va_end(va);
1019
1020 return Status;
1021}
1022
1023
1024/*
1025 * @implemented
1026 */
1028VOID
1029NTAPI
1031 _In_ PVOID HwDeviceExtension,
1032 _In_ PVOID MappedAddress)
1033{
1034 DPRINT1("StorPortFreeDeviceBase(%p %p)\n",
1035 HwDeviceExtension, MappedAddress);
1036}
1037
1038
1039/*
1040 * @unimplemented
1041 */
1043VOID
1044NTAPI
1046 _In_ PVOID HwDeviceExtension,
1048{
1049 DPRINT1("StorPortFreeRegistryBuffer()\n");
1051}
1052
1053
1054/*
1055 * @implemented
1056 */
1058ULONG
1059NTAPI
1061 _In_ PVOID DeviceExtension,
1062 _In_ ULONG BusDataType,
1063 _In_ ULONG SystemIoBusNumber,
1067{
1068 PMINIPORT_DEVICE_EXTENSION MiniportExtension;
1071
1072 DPRINT1("StorPortGetBusData(%p %lu %lu %lu %p %lu)\n",
1073 DeviceExtension, BusDataType, SystemIoBusNumber, SlotNumber, Buffer, Length);
1074
1075 /* Get the miniport extension */
1076 MiniportExtension = CONTAINING_RECORD(DeviceExtension,
1078 HwDeviceExtension);
1079 DPRINT1("DeviceExtension %p MiniportExtension %p\n",
1080 DeviceExtension, MiniportExtension);
1081
1082 Interface = &MiniportExtension->Miniport->DeviceExtension->BusInterface;
1083
1084 ReturnLength = Interface->GetBusData(Interface->Context,
1085 BusDataType,
1086 Buffer,
1087 0,
1088 Length);
1089 DPRINT1("ReturnLength: %lu\n", ReturnLength);
1090
1091 return ReturnLength;
1092}
1093
1094
1095/*
1096 * @implemented
1097 */
1099PVOID
1100NTAPI
1102 _In_ PVOID HwDeviceExtension,
1104 _In_ ULONG SystemIoBusNumber,
1105 _In_ STOR_PHYSICAL_ADDRESS IoAddress,
1107 _In_ BOOLEAN InIoSpace)
1108{
1109 PMINIPORT_DEVICE_EXTENSION MiniportExtension;
1111 PVOID MappedAddress;
1113
1114 DPRINT1("StorPortGetDeviceBase(%p %lu %lu 0x%I64x %lu %u)\n",
1115 HwDeviceExtension, BusType, SystemIoBusNumber, IoAddress.QuadPart, NumberOfBytes, InIoSpace);
1116
1117 /* Get the miniport extension */
1118 MiniportExtension = CONTAINING_RECORD(HwDeviceExtension,
1120 HwDeviceExtension);
1121 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
1122 HwDeviceExtension, MiniportExtension);
1123
1124 if (!TranslateResourceListAddress(MiniportExtension->Miniport->DeviceExtension,
1125 BusType,
1126 SystemIoBusNumber,
1127 IoAddress,
1129 InIoSpace,
1131 {
1132 DPRINT1("Checkpoint!\n");
1133 return NULL;
1134 }
1135
1136 DPRINT1("Translated Address: 0x%I64x\n", TranslatedAddress.QuadPart);
1137
1138 /* In I/O space */
1139 if (InIoSpace)
1140 {
1141 DPRINT1("Translated Address: %p\n", (PVOID)(ULONG_PTR)TranslatedAddress.QuadPart);
1143 }
1144
1145 /* In memory space */
1146 MappedAddress = MmMapIoSpace(TranslatedAddress,
1148 FALSE);
1149 DPRINT1("Mapped Address: %p\n", MappedAddress);
1150
1151 Status = AllocateAddressMapping(&MiniportExtension->Miniport->DeviceExtension->MappedAddressList,
1152 IoAddress,
1153 MappedAddress,
1155 SystemIoBusNumber);
1156 if (!NT_SUCCESS(Status))
1157 {
1158 DPRINT1("Checkpoint!\n");
1159 MappedAddress = NULL;
1160 }
1161
1162 DPRINT1("Mapped Address: %p\n", MappedAddress);
1163 return MappedAddress;
1164}
1165
1166
1167/*
1168 * @implemented
1169 */
1171PVOID
1172NTAPI
1174 _In_ PVOID HwDeviceExtension,
1177 _In_ UCHAR Lun)
1178{
1179 PMINIPORT_DEVICE_EXTENSION MiniportExtension;
1182
1183 DPRINT("StorPortGetLogicalUnit(%p %u %u %u)\n",
1184 HwDeviceExtension, PathId, TargetId, Lun);
1185
1186 if (HwDeviceExtension == NULL)
1187 return NULL;
1188
1189 MiniportExtension = CONTAINING_RECORD(HwDeviceExtension,
1191 HwDeviceExtension);
1192 FdoExtension = MiniportExtension->Miniport->DeviceExtension;
1193
1194 /* Miniports call this from HwInterrupt too, where the list lock cannot be taken */
1197 else
1199
1200 /* A unit nothing ever found has nothing kept about it */
1201 if (PdoExtension == NULL)
1202 return NULL;
1203
1204 return PdoExtension->LunExtension;
1205}
1206
1207
1208/*
1209 * @implemented
1210 */
1213NTAPI
1215 _In_ PVOID HwDeviceExtension,
1219{
1220 PMINIPORT_DEVICE_EXTENSION MiniportExtension;
1221 PFDO_DEVICE_EXTENSION DeviceExtension;
1224
1225 DPRINT("StorPortGetPhysicalAddress(%p %p %p %p)\n",
1226 HwDeviceExtension, Srb, VirtualAddress, Length);
1227
1228 /* Get the miniport extension */
1229 MiniportExtension = CONTAINING_RECORD(HwDeviceExtension,
1231 HwDeviceExtension);
1232 DPRINT("HwDeviceExtension %p MiniportExtension %p\n",
1233 HwDeviceExtension, MiniportExtension);
1234
1235 DeviceExtension = MiniportExtension->Miniport->DeviceExtension;
1236
1237 /* Inside of the uncached extension? */
1238 if (((ULONG_PTR)VirtualAddress >= (ULONG_PTR)DeviceExtension->UncachedExtensionVirtualBase) &&
1240 {
1242
1243 PhysicalAddress.QuadPart = DeviceExtension->UncachedExtensionPhysicalBase.QuadPart + Offset;
1244 *Length = DeviceExtension->UncachedExtensionSize - Offset;
1245
1246 return PhysicalAddress;
1247 }
1248
1250 if (PhysicalAddress.QuadPart == 0)
1251 {
1252 *Length = 0;
1253 return PhysicalAddress;
1254 }
1255
1256 /* Outside the uncached extension only the rest of this page is known contiguous */
1258
1259 return PhysicalAddress;
1260}
1261
1262
1263/*
1264 * @implemented
1265 */
1268NTAPI
1270 _In_ PVOID HwDeviceExtension,
1272{
1273 UNREFERENCED_PARAMETER(HwDeviceExtension);
1274 PQUEUED_REQUEST_REFERENCE RequestReference;
1275
1276 DPRINT("StorPortGetScatterGatherList(%p %p)\n", HwDeviceExtension, Srb);
1277 RequestReference = StorpRequestReference(Srb);
1278
1279 return RequestReference->ScatterGatherList;
1280}
1281
1282
1283/*
1284 * @implemented
1285 */
1288NTAPI
1290 _In_ PVOID DeviceExtension,
1293 _In_ UCHAR Lun,
1294 _In_ LONG QueueTag)
1295{
1296 DPRINT("StorPortGetSrb()\n");
1297 return NULL;
1298}
1299
1300
1301/*
1302 * @implemented
1303 */
1305PVOID
1306NTAPI
1308 _In_ PVOID HwDeviceExtension,
1311{
1312 PMINIPORT_DEVICE_EXTENSION MiniportExtension;
1313 PFDO_DEVICE_EXTENSION DeviceExtension;
1314 PHYSICAL_ADDRESS LowestAddress, HighestAddress, Alignment;
1317
1318 DPRINT1("StorPortGetUncachedExtension(%p %p %lu)\n",
1319 HwDeviceExtension, ConfigInfo, NumberOfBytes);
1320
1321 /* Get the miniport extension */
1322 MiniportExtension = CONTAINING_RECORD(HwDeviceExtension,
1324 HwDeviceExtension);
1325 DPRINT1("HwDeviceExtension %p MiniportExtension %p\n",
1326 HwDeviceExtension, MiniportExtension);
1327
1328 DeviceExtension = MiniportExtension->Miniport->DeviceExtension;
1329
1330 /* Return the uncached extension base address if we already have one */
1331 if (DeviceExtension->UncachedExtensionVirtualBase != NULL)
1332 return DeviceExtension->UncachedExtensionVirtualBase;
1333
1334 // FIXME: Set DMA stuff here?
1336 DeviceDescription.Master = ConfigInfo->Master;
1337 DeviceDescription.ScatterGather = ConfigInfo->ScatterGather;
1338 DeviceDescription.DemandMode = ConfigInfo->DemandMode;
1339 DeviceDescription.Dma32BitAddresses = ConfigInfo->Dma32BitAddresses;
1340 DeviceDescription.BusNumber = ConfigInfo->SystemIoBusNumber;
1341 DeviceDescription.DmaChannel = ConfigInfo->DmaChannel;
1342 DeviceDescription.InterfaceType = ConfigInfo->AdapterInterfaceType;
1343 DeviceDescription.DmaWidth = ConfigInfo->DmaWidth;
1344 DeviceDescription.DmaSpeed = ConfigInfo->DmaSpeed;
1345 DeviceDescription.MaximumLength = ConfigInfo->MaximumTransferLength;
1346 DeviceDescription.DmaPort = ConfigInfo->DmaPort;
1347
1348 DeviceExtension->DmaAdapter =
1350
1351 NT_ASSERT(DeviceExtension->DmaAdapter);
1352
1353 /* FIXME: AdapterInterfaceType is exposed here and I think it's convenient to initialize
1354 HwInitData in FDO extension right here. Needs review. */
1355 DeviceExtension->HwInitData = PortGetDriverInitData(DeviceExtension->DriverExtension,
1356 DeviceDescription.InterfaceType);
1357 NT_ASSERT(DeviceExtension->HwInitData);
1358
1359 /* Allocate the uncached extension */
1360 Alignment.QuadPart = 0;
1361 LowestAddress.QuadPart = 0;
1362 HighestAddress.QuadPart = 0x00000000FFFFFFFF;
1364 LowestAddress,
1365 HighestAddress,
1366 Alignment,
1367 MmCached);
1368 if (DeviceExtension->UncachedExtensionVirtualBase == NULL)
1369 return NULL;
1370
1372 DeviceExtension->UncachedExtensionSize = NumberOfBytes;
1373
1374 return DeviceExtension->UncachedExtensionVirtualBase;
1375}
1376
1377
1378/*
1379 * @unimplemented
1380 */
1382PVOID
1383NTAPI
1385 _In_ PVOID HwDeviceExtension,
1387{
1388 DPRINT1("StorPortGetVirtualAddress(%p %I64x)\n",
1389 HwDeviceExtension, PhysicalAddress.QuadPart);
1391 return NULL;
1392}
1393
1394
1395/*
1396 * @implemented
1397 */
1399ULONG
1400NTAPI
1406{
1409 PDRIVER_OBJECT_EXTENSION DriverObjectExtension;
1411
1412 DPRINT1("StorPortInitialize(%p %p %p %p)\n",
1414
1415 DPRINT1("HwInitializationDataSize: %lu\n", HwInitializationData->HwInitializationDataSize);
1416 DPRINT1("AdapterInterfaceType: %u\n", HwInitializationData->AdapterInterfaceType);
1417 DPRINT1("HwInitialize: %p\n", HwInitializationData->HwInitialize);
1418 DPRINT1("HwStartIo: %p\n", HwInitializationData->HwStartIo);
1419 DPRINT1("HwInterrupt: %p\n", HwInitializationData->HwInterrupt);
1420 DPRINT1("HwFindAdapter: %p\n", HwInitializationData->HwFindAdapter);
1421 DPRINT1("HwResetBus: %p\n", HwInitializationData->HwResetBus);
1422 DPRINT1("HwDmaStarted: %p\n", HwInitializationData->HwDmaStarted);
1423 DPRINT1("HwAdapterState: %p\n", HwInitializationData->HwAdapterState);
1424 DPRINT1("DeviceExtensionSize: %lu\n", HwInitializationData->DeviceExtensionSize);
1425 DPRINT1("SpecificLuExtensionSize: %lu\n", HwInitializationData->SpecificLuExtensionSize);
1426 DPRINT1("SrbExtensionSize: %lu\n", HwInitializationData->SrbExtensionSize);
1427 DPRINT1("NumberOfAccessRanges: %lu\n", HwInitializationData->NumberOfAccessRanges);
1428
1429 /* Check parameters */
1430 if ((DriverObject == NULL) ||
1431 (RegistryPath == NULL) ||
1433 {
1434 DPRINT1("Invalid parameter!\n");
1436 }
1437
1438 /* Check initialization data, any interface revision from the original onwards is fine */
1439 if ((HwInitializationData->HwInitializationDataSize < HW_INIT_DATA_SIZE_PHYSICAL) ||
1440 (HwInitializationData->HwInitialize == NULL) ||
1441 (HwInitializationData->HwStartIo == NULL) ||
1442 (HwInitializationData->HwFindAdapter == NULL) ||
1443 (HwInitializationData->HwResetBus == NULL))
1444 {
1445 DPRINT1("Revision mismatch!\n");
1447 }
1448
1449 DriverObjectExtension = IoGetDriverObjectExtension(DriverObject,
1451 if (DriverObjectExtension == NULL)
1452 {
1453 DPRINT1("No driver object extension!\n");
1454
1458 (PVOID *)&DriverObjectExtension);
1459 if (!NT_SUCCESS(Status))
1460 {
1461 DPRINT1("IoAllocateDriverObjectExtension() failed (Status 0x%08lx)\n", Status);
1462 return Status;
1463 }
1464
1465 DPRINT1("Driver object extension created!\n");
1466
1467 /* Initialize the driver object extension */
1468 RtlZeroMemory(DriverObjectExtension,
1469 sizeof(DRIVER_OBJECT_EXTENSION));
1470
1471 DriverObjectExtension->ExtensionType = DriverExtension;
1472 DriverObjectExtension->DriverObject = DriverObject;
1473
1474 InitializeListHead(&DriverObjectExtension->AdapterListHead);
1475 KeInitializeSpinLock(&DriverObjectExtension->AdapterListLock);
1476
1477 InitializeListHead(&DriverObjectExtension->InitDataListHead);
1478
1479 /* Set handlers */
1480 DriverObject->DriverExtension->AddDevice = PortAddDevice;
1481// DriverObject->DriverStartIo = PortStartIo;
1482 DriverObject->DriverUnload = PortUnload;
1486 DriverObject->MajorFunction[IRP_MJ_SCSI] = PortDispatchScsi;
1489 DriverObject->MajorFunction[IRP_MJ_PNP] = PortDispatchPnp;
1490 }
1491
1492 /* Add the initialzation data to the driver extension */
1493 Status = PortAddDriverInitData(DriverObjectExtension,
1495 if (!NT_SUCCESS(Status))
1496 {
1497 DPRINT1("PortAddDriverInitData() failed (Status 0x%08lx)\n", Status);
1498 return Status;
1499 }
1500
1501 DPRINT1("StorPortInitialize() done (Status 0x%08lx)\n", Status);
1502
1503 return Status;
1504}
1505
1506
1507/*
1508 * @unimplemented
1509 */
1511VOID
1512NTAPI
1514 _In_ PVOID HwDeviceExtension,
1518 _In_ UCHAR Lun,
1520 _In_ ULONG UniqueId)
1521{
1522 DPRINT1("ScsiPortLogError() called\n");
1523 DPRINT1("PathId: 0x%02x TargetId: 0x%02x Lun: 0x%02x ErrorCode: 0x%08lx UniqueId: 0x%08lx\n",
1524 PathId, TargetId, Lun, ErrorCode, UniqueId);
1525
1526 DPRINT1("ScsiPortLogError() done\n");
1527}
1528
1529
1530/*
1531 * @implemented
1532 */
1534VOID
1535NTAPI
1540{
1542}
1543
1544
1545/*
1546 * @unimplemented
1547 */
1549VOID
1552 _In_ PVOID HwDeviceExtension,
1553 ...)
1554{
1555 PMINIPORT_DEVICE_EXTENSION MiniportExtension = NULL;
1557 PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitRoutine;
1558 PSTORPORT_EXTENDED_FUNCTIONS *ppExtendedFunctions;
1559 PQUEUED_REQUEST_REFERENCE RequestReference;
1561 PSTOR_DPC Dpc;
1562 PHW_DPC_ROUTINE HwDpcRoutine;
1563 PVOID DpcArgument1;
1564 PVOID DpcArgument2;
1565
1567 PVOID LockContext;
1570
1571 va_list ap;
1572
1573 DPRINT("StorPortNotification(%x %p)\n",
1574 NotificationType, HwDeviceExtension);
1575
1576 /* Get the miniport extension */
1577 if (HwDeviceExtension != NULL)
1578 {
1579 MiniportExtension = CONTAINING_RECORD(HwDeviceExtension,
1581 HwDeviceExtension);
1582 DPRINT("HwDeviceExtension %p MiniportExtension %p\n",
1583 HwDeviceExtension, MiniportExtension);
1584
1585 FdoExtension = MiniportExtension->Miniport->DeviceExtension;
1586 }
1587
1588 va_start(ap, HwDeviceExtension);
1589
1590 switch (NotificationType)
1591 {
1592 case RequestComplete:
1593 DPRINT("RequestComplete\n");
1595
1596 RequestReference = StorpRequestReference(Srb);
1597 NT_ASSERT(RequestReference);
1598
1599 /* Carry the miniport's answer back to the original request */
1601 {
1602 StorpCompleteExtendedSrb(RequestReference->Srb,
1603 RequestReference->ExtendedRequest);
1604 }
1605
1606 DPRINT("Complete Notify - ReqRef %p Srb %p Irp %p\n",
1607 RequestReference, Srb, RequestReference->Irp);
1608 // if (RequestReference->SpecialRequestId) {
1609 // /* FIXME: DELETE AFTER DEBUG */
1610 // DPRINT1("STORPORT SPECIAL REQUEST %d Queuing for completion\n", RequestReference->SpecialRequestId);
1611 // }
1612
1613 /* Queue for completion */
1614 InterlockedPushEntrySList(&FdoExtension->CompletionList,
1615 &RequestReference->CompletionEntry);
1616
1617 /* Insert DPC for delayed completion */
1618 KeInsertQueueDpc(&FdoExtension->Device->Dpc, NULL, NULL);
1619
1620 break;
1621
1622 case BusChangeDetected:
1623 DPRINT1("BusChangeDetected\n");
1624
1625 /* Have PnP query bus relations again so the scan runs, once below device IRQL */
1626 if (FdoExtension != NULL && FdoExtension->PhysicalDevice != NULL)
1627 KeInsertQueueDpc(&FdoExtension->BusChangeDpc, NULL, NULL);
1628 break;
1629
1631 DPRINT1("GetExtendedFunctionTable\n");
1633 if (ppExtendedFunctions != NULL)
1634 *ppExtendedFunctions = NULL; /* FIXME: */
1635 break;
1636
1638 DPRINT1("EnablePassiveInitialization\n");
1640 DPRINT1("HwPassiveInitRoutine %p\n", HwPassiveInitRoutine);
1642
1643 // FIXME: It is not guaranteed that enabling passive initialization will fail and return
1644 // FALSE when not called in driver's HwStorInitialize routine.
1645 // Docs: Remarks of https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/storport/nf-storport-storportenablepassiveinitialization
1646 *Result = FALSE;
1647
1648 if ((FdoExtension != NULL) &&
1649 (FdoExtension->HwPassiveInitRoutine == NULL))
1650 {
1651 FdoExtension->HwPassiveInitRoutine = HwPassiveInitRoutine;
1652 *Result = TRUE;
1653 }
1654 break;
1655
1656 case InitializeDpc:
1657 DPRINT("InitializeDpc\n");
1659 DPRINT("Dpc %p\n", Dpc);
1660 HwDpcRoutine = (PHW_DPC_ROUTINE)va_arg(ap, PHW_DPC_ROUTINE);
1661 DPRINT("HwDpcRoutine %p\n", HwDpcRoutine);
1662
1663 KeInitializeDpc((PRKDPC)&Dpc->Dpc,
1664 (PKDEFERRED_ROUTINE)HwDpcRoutine,
1665 (PVOID)(FdoExtension->Miniport.MiniportExtension->HwDeviceExtension));
1666 KeInitializeSpinLock(&Dpc->Lock);
1667 break;
1668
1669 case IssueDpc:
1670 DPRINT("IssueDpc\n");
1672 DpcArgument1 = (PVOID)va_arg(ap, PVOID);
1673 DpcArgument2 = (PVOID)va_arg(ap, PVOID);
1674 DPRINT("Dpc %p Arg1 %p Arg2 %p\n", Dpc, DpcArgument1, DpcArgument2);
1676
1677 *Result = KeInsertQueueDpc((PKDPC)Dpc, DpcArgument1, DpcArgument2);
1678 break;
1679
1680 case AcquireSpinLock:
1681 DPRINT("AcquireSpinLock\n");
1683 DPRINT("SpinLock %lu\n", SpinLock);
1684 LockContext = (PVOID)va_arg(ap, PVOID);
1685 DPRINT("LockContext %p\n", LockContext);
1687 DPRINT("LockHandle %p\n", LockHandle);
1689 SpinLock,
1690 LockContext,
1691 LockHandle);
1692 break;
1693
1694 case ReleaseSpinLock:
1695 DPRINT("ReleaseSpinLock\n");
1697 DPRINT("LockHandle %p\n", LockHandle);
1699 LockHandle);
1700 break;
1701
1702 case RequestTimerCall:
1703 {
1705 ULONG TimerValue;
1706 LARGE_INTEGER TimerDueTime;
1707 NTSTATUS MultiplyResult;
1708
1710 TimerValue = (ULONG)va_arg(ap, ULONG);
1712
1713 /* Set timer if timer value != 0. Logic is exactly same as StorPortRequestTimer */
1714 if (TimerValue != 0)
1715 {
1716 MultiplyResult = RtlULongLongMult(TimerValue, 10ull, (PULONGLONG)&TimerDueTime.QuadPart);
1717 if (!NT_SUCCESS(MultiplyResult)) {
1718 break;
1719 }
1720
1721 FdoExtension->TimerCallback = TimerRoutine;
1722 KeSetTimer(&FdoExtension->Timer, TimerDueTime, &FdoExtension->TimerDpc);
1723 }
1724 else
1725 {
1726 /* Otherwise cancel the timer. */
1727 KeCancelTimer(&FdoExtension->Timer);
1728 }
1729 break;
1730 }
1731
1732 default:
1733 DPRINT1("Unsupported Notification %lx\n", NotificationType);
1734 break;
1735 }
1736
1737 va_end(ap);
1738}
1739
1740
1741/*
1742 * @unimplemented
1743 */
1745BOOLEAN
1746NTAPI
1748 _In_ PVOID HwDeviceExtension,
1749 _In_ ULONG TimeOut)
1750{
1751 DPRINT1("StorPortPause()\n");
1753 return FALSE;
1754}
1755
1756
1757/*
1758 * @unimplemented
1759 */
1761BOOLEAN
1762NTAPI
1764 _In_ PVOID HwDeviceExtension,
1767 _In_ UCHAR Lun,
1768 _In_ ULONG TimeOut)
1769{
1770 DPRINT1("StorPortPauseDevice()\n");
1772 return FALSE;
1773}
1774
1775
1776#if defined(_M_AMD64)
1777/*
1778 * @implemented
1779 */
1780/* KeQuerySystemTime is an inline function,
1781 so we cannot forward the export to ntoskrnl */
1783VOID
1784NTAPI
1786 _Out_ PLARGE_INTEGER CurrentTime)
1787{
1788 DPRINT1("StorPortQuerySystemTime(%p)\n", CurrentTime);
1789
1790 KeQuerySystemTime(CurrentTime);
1791}
1792#endif /* defined(_M_AMD64) */
1793
1794
1795/*
1796 * @unimplemented
1797 */
1799BOOLEAN
1800NTAPI
1802 _In_ PVOID HwDeviceExtension)
1803{
1804 DPRINT1("StorPortReady()\n");
1806 return FALSE;
1807}
1808
1809
1810/*
1811 * @unimplemented
1812 */
1814BOOLEAN
1815NTAPI
1817 _In_ PVOID HwDeviceExtension,
1820 _In_ ULONG Type,
1823{
1824 DPRINT1("StorPortRegistryRead()\n");
1826 return FALSE;
1827}
1828
1829
1830/*
1831 * @unimplemented
1832 */
1834BOOLEAN
1835NTAPI
1837 _In_ PVOID HwDeviceExtension,
1840 _In_ ULONG Type,
1843{
1844 DPRINT1("StorPortRegistryWrite()\n");
1846 return FALSE;
1847}
1848
1849
1850/*
1851 * @unimplemented
1852 */
1854BOOLEAN
1855NTAPI
1857 _In_ PVOID HwDeviceExtension)
1858{
1859 DPRINT1("StorPortResume()\n");
1861 return FALSE;
1862}
1863
1864
1865/*
1866 * @unimplemented
1867 */
1869BOOLEAN
1870NTAPI
1872 _In_ PVOID HwDeviceExtension,
1875 _In_ UCHAR Lun)
1876{
1877 DPRINT1("StorPortResumeDevice()\n");
1879 return FALSE;
1880}
1881
1882
1883/*
1884 * @implemented
1885 */
1887ULONG
1888NTAPI
1890 _In_ PVOID DeviceExtension,
1891 _In_ ULONG BusDataType,
1892 _In_ ULONG SystemIoBusNumber,
1897{
1898 PMINIPORT_DEVICE_EXTENSION MiniportExtension;
1901
1902 DPRINT1("StorPortSetBusData(%p %lu %lu %lu %p %lu %lu)\n",
1903 DeviceExtension, BusDataType, SystemIoBusNumber, SlotNumber, Buffer, Offset, Length);
1904
1905 MiniportExtension = CONTAINING_RECORD(DeviceExtension,
1907 HwDeviceExtension);
1908 DPRINT1("DeviceExtension %p MiniportExtension %p\n",
1909 DeviceExtension, MiniportExtension);
1910
1911 Interface = &MiniportExtension->Miniport->DeviceExtension->BusInterface;
1912
1913 ReturnLength = Interface->SetBusData(Interface->Context,
1914 BusDataType,
1915 Buffer,
1916 Offset,
1917 Length);
1918 DPRINT1("ReturnLength: %lu\n", ReturnLength);
1919
1920 return ReturnLength;
1921}
1922
1923
1924/*
1925 * @implemented
1926 */
1928BOOLEAN
1929NTAPI
1931 _In_ PVOID HwDeviceExtension,
1934 _In_ UCHAR Lun,
1936{
1940
1941 DPRINT1("StorPortSetDeviceQueueDepth(%p %d %d %d %d)\n",
1942 HwDeviceExtension, PathId, TargetId, Lun, Depth);
1943
1944 FdoExtension = StorpGetMiniportFdo(HwDeviceExtension);
1946
1947 /* 254 is pre-Windows-8 per LUN queue limit */
1948 if (PdoExtension == NULL || Depth > 254)
1949 {
1950 return FALSE;
1951 }
1952
1954 PdoExtension->OutstandingRequestMax = Depth;
1956
1957 DPRINT("Set Path %d Target %d Lun %d Queue depth to %d\n", PathId, TargetId, Lun, Depth);
1958
1959 return FALSE;
1960}
1961
1962
1963/*
1964 * @implemented
1965 */
1967VOID
1968NTAPI
1970 _In_ ULONG Delay)
1971{
1973}
1974
1975
1976/*
1977 * @unimplemented
1978 */
1980VOID
1981NTAPI
1983 _In_ PVOID HwDeviceExtension,
1984 _In_ PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine,
1986{
1987 DPRINT1("StorPortSynchronizeAccess()\n");
1989}
1990
1991
1992/*
1993 * @implemented
1994 */
1996BOOLEAN
1997NTAPI
1999 _In_ PVOID HwDeviceExtension,
2001 _In_ ULONG SystemIoBusNumber,
2002 _In_ STOR_PHYSICAL_ADDRESS IoAddress,
2004 _In_ BOOLEAN InIoSpace)
2005{
2006 DPRINT1("StorPortValidateRange()\n");
2007 return TRUE;
2008}
2009
2010/* EOF */
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
Type
Definition: Type.h:7
unsigned char BOOLEAN
Definition: actypes.h:127
#define DPFLTR_ERROR_LEVEL
Definition: main.cpp:32
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
_In_ PSCSI_REQUEST_BLOCK Srb
Definition: cdrom.h:989
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
Definition: bufpool.h:45
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
Definition: classpnp.h:1315
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR PathId
Definition: classpnp.h:1313
_In_z_ PCCHAR _In_ PDEVICE_OBJECT LowerDeviceObject
Definition: classpnp.h:983
_In_ PVOID Argument2
Definition: classpnp.h:721
PVOID NTAPI MmAllocateContiguousMemorySpecifyCache(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL, IN PHYSICAL_ADDRESS HighestAcceptableAddress, IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, IN MEMORY_CACHING_TYPE CacheType OPTIONAL)
Definition: contmem.c:574
UINT Depth
Definition: d3d12.idl:4644
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
_In_ ULONG _In_ ULONG _In_opt_ DXGKCB_MIRACAST_SEND_MESSAGE_CALLBACK _In_opt_ PVOID CallbackContext
Definition: dispmprt.h:622
_In_ ULONG _In_ MEMORY_CACHING_TYPE _Out_ PPHYSICAL_ADDRESS PhysicalAddress
Definition: dispmprt.h:714
_In_ DXGK_MIRACAST_DISPLAY_CALLBACKS _Out_ PVOID _Out_ ULONG * TargetId
Definition: dispmprt.h:650
_In_ ULONG _In_ MEMORY_CACHING_TYPE _Out_ PPHYSICAL_ADDRESS _Out_ PVOID * VirtualAddress
Definition: dispmprt.h:716
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define va_end(v)
Definition: stdarg.h:28
#define va_arg(v, l)
Definition: stdarg.h:27
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:725
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
DRIVER_INITIALIZE DriverEntry
Definition: condrv.c:21
#define L(x)
Definition: resources.c:13
struct _FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
#define ULONG_PTR
Definition: config.h:101
enum _SCSI_NOTIFICATION_TYPE SCSI_NOTIFICATION_TYPE
VOID(NTAPI * PHW_TIMER)(IN PVOID DeviceExtension)
Definition: srb.h:456
struct _SCSI_REQUEST_BLOCK * PSCSI_REQUEST_BLOCK
@ RequestTimerCall
Definition: srb.h:537
@ RequestComplete
Definition: srb.h:531
@ BusChangeDetected
Definition: srb.h:538
NTSTATUS NTAPI PortPdoDeviceControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: ioctl.c:379
NTSTATUS NTAPI PortFdoDeviceControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: ioctl.c:147
VOID NTAPI TimerCallbackDpcRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: misc.c:348
NTSTATUS AllocateAddressMapping(PMAPPED_ADDRESS *MappedAddressList, STOR_PHYSICAL_ADDRESS IoAddress, PVOID MappedAddress, ULONG NumberOfBytes, ULONG BusNumber)
Definition: misc.c:291
BOOLEAN TranslateResourceListAddress(PFDO_DEVICE_EXTENSION DeviceExtension, INTERFACE_TYPE BusType, ULONG SystemIoBusNumber, STOR_PHYSICAL_ADDRESS IoAddress, ULONG NumberOfBytes, BOOLEAN InIoSpace, PPHYSICAL_ADDRESS TranslatedAddress)
Definition: misc.c:173
VOID NTAPI SimpleTimerCallbackDpcRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: misc.c:327
NTSTATUS NTAPI PortPdoScsi(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: srb.c:548
VOID NTAPI StorpCompleteExtendedSrb(_In_ PSCSI_REQUEST_BLOCK Srb, _In_ PEXTENDED_REQUEST Request)
Carries the miniport's answer back to the original request block.
Definition: srbex.c:157
#define TAG_INIT_DATA
Definition: precomp.h:29
BOOLEAN NTAPI StorpIsExtendedSrb(_In_ PVOID Srb)
Tells whether a request block is in the extended format.
Definition: srbex.c:47
#define HW_INIT_DATA_SIZE_PHYSICAL
Definition: precomp.h:72
PQUEUED_REQUEST_REFERENCE NTAPI StorpRequestReference(_In_ PSCSI_REQUEST_BLOCK Srb)
Finds the request reference behind an SRB in either format.
Definition: srbex.c:61
#define TAG_MINIPORT_DATA
Definition: precomp.h:33
struct _TIMER_ENTRY * PTIMER_ENTRY
PVOID NTAPI StorpSrbDataBuffer(_In_ PSCSI_REQUEST_BLOCK Srb)
Finds the data buffer of a request in either format.
Definition: srbex.c:80
@ PdoExtension
Definition: precomp.h:62
@ FdoExtension
Definition: precomp.h:61
VOID NTAPI PortCompletionDpc(_In_ PKDPC Dpc, _In_ PVOID Context, _In_ PVOID SystemArgument1, _In_ PVOID SystemArgument2)
Definition: srb.c:920
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define InsertHeadList(ListHead, Entry)
UNICODE_STRING * PUNICODE_STRING
Definition: env_spec_w32.h:373
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define DO_DIRECT_IO
Definition: env_spec_w32.h:396
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
union Alignment_ Alignment
Status
Definition: gdiplustypes.h:24
VOID FASTCALL KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle)
Definition: spinlock.c:130
VOID FASTCALL KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
Definition: spinlock.c:166
_In_ ULONG MessageId
Definition: hubioctl.cpp:1369
_In_ ULONG PortNumber
Definition: hubucx.h:272
FORCEINLINE PFDO_DEVICE_EXTENSION StorpGetMiniportFdo(_In_ PVOID HwDeviceExtension)
For use in Storport API exposed to miniports; gets FDO extension with HwDeviceExtension.
Definition: inline.h:39
FORCEINLINE ULONG StorpInterlockedInsertHeadListCounted(_In_ PKSPIN_LOCK SpinLock, _In_ PLIST_ENTRY ListHead, _In_ PLIST_ENTRY Entry, _In_ PULONG Counter)
InsertHeadList and increment element counter with a corresponding spin lock held.
Definition: inline.h:71
#define InterlockedCompareExchange
Definition: interlocked.h:119
PVOID NTAPI MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
Definition: iosup.c:47
@ dsStopped
Definition: isapnp.h:30
_In_ PIRP Irp
Definition: kse.h:79
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
UNICODE_STRING Global
Definition: symlink.c:46
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
@ NormalPagePriority
Definition: imports.h:54
#define KeStallExecutionProcessor(MicroSeconds)
Definition: precomp.h:27
#define min(a, b)
Definition: monoChain.cc:55
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4438
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3171
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
#define _When_(c, a)
Definition: no_sal2.h:38
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define FILE_OPENED
Definition: nt_native.h:769
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
Definition: ntbasedef.h:395
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1038
NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice, IN OUT PDEVICE_OBJECT *AttachedToDeviceObject)
Definition: device.c:987
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1261
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1925
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1847
#define IoCompleteRequest
Definition: irp.c:1272
KIRQL NTAPI KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
Definition: spinlock.c:154
VOID NTAPI KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt, IN KIRQL OldIrql)
Definition: spinlock.c:171
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
Definition: stubs.c:663
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:419
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
static WCHAR Address[46]
Definition: ping.c:68
PDMA_ADAPTER NTAPI IoGetDmaAdapter(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PDEVICE_DESCRIPTION DeviceDescription, IN OUT PULONG NumberOfMapRegisters)
Definition: pnpdma.c:23
#define FILE_DEVICE_CONTROLLER
Definition: winioctl.h:49
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
enum _INTERFACE_TYPE INTERFACE_TYPE
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA _In_ PVOID HwContext
Definition: srb.h:907
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA * HwInitializationData
Definition: srb.h:906
ULONG NTAPI vDbgPrintExWithPrefix(IN PCCH Prefix, IN ULONG ComponentId, IN ULONG Level, IN PCCH Format, IN va_list ap)
Definition: debug.c:167
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PPDO_DEVICE_EXTENSION FdoFindLun(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ ULONG Bus, _In_ ULONG Target, _In_ ULONG Lun)
Definition: fdo.c:1306
VOID NTAPI PortFdoBusChangeDpc(_In_ PKDPC Dpc, _In_opt_ PVOID DeferredContext, _In_opt_ PVOID SystemArgument1, _In_opt_ PVOID SystemArgument2)
Definition: fdo.c:1471
NTSTATUS PortInitializeStarvedRequestQueue(_In_ PSTARVED_REQUEST_QUEUE Queue)
Definition: fdo.c:105
PPDO_DEVICE_EXTENSION NTAPI FdoFindLunAboveDispatch(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ ULONG Bus, _In_ ULONG Target, _In_ ULONG Lun)
Finds a unit from an interrupt service routine or any other caller above DISPATCH_LEVEL.
Definition: fdo.c:1405
NTSTATUS NTAPI PortFdoScsi(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: fdo.c:1491
NTSTATUS NTAPI PortFdoPnp(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: fdo.c:1519
NTSTATUS NTAPI PortPdoPnp(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: pdo.c:710
static NTSTATUS NTAPI PortDispatchSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:453
STORPORT_API BOOLEAN NTAPI StorPortSetDeviceQueueDepth(_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ ULONG Depth)
Definition: storport.c:1930
STORPORT_API BOOLEAN NTAPI StorPortBusy(_In_ PVOID HwDeviceExtension, _In_ ULONG RequestsToComplete)
Definition: storport.c:560
static NTSTATUS NTAPI PortDispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:362
STORPORT_API BOOLEAN NTAPI StorPortRegistryWrite(_In_ PVOID HwDeviceExtension, _In_ PUCHAR ValueName, _In_ ULONG Global, _In_ ULONG Type, _In_ PUCHAR Buffer, _In_ ULONG BufferLength)
Definition: storport.c:1836
static NTSTATUS NTAPI PortDispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:506
STORPORT_API BOOLEAN NTAPI StorPortDeviceBusy(_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ ULONG RequestsToComplete)
Definition: storport.c:649
STORPORT_API PVOID NTAPI StorPortGetLogicalUnit(_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
Definition: storport.c:1173
STORPORT_API VOID StorPortDebugPrint(_In_ ULONG DebugPrintLevel, _In_ PCHAR DebugMessage,...)
Definition: storport.c:626
static VOID PortReleaseSpinLock(PFDO_DEVICE_EXTENSION DeviceExtension, PSTOR_LOCK_HANDLE LockHandle)
Definition: storport.c:158
STORPORT_API VOID NTAPI StorPortSynchronizeAccess(_In_ PVOID HwDeviceExtension, _In_ PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine, _In_opt_ PVOID Context)
Definition: storport.c:1982
STORPORT_API ULONG NTAPI StorPortGetBusData(_In_ PVOID DeviceExtension, _In_ ULONG BusDataType, _In_ ULONG SystemIoBusNumber, _In_ ULONG SlotNumber, _Out_ _When_(Length !=0, _Out_writes_bytes_(Length)) PVOID Buffer, _In_ ULONG Length)
Definition: storport.c:1060
static NTSTATUS NTAPI PortDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:381
PHW_INITIALIZATION_DATA PortGetDriverInitData(PDRIVER_OBJECT_EXTENSION DriverExtension, INTERFACE_TYPE InterfaceType)
Definition: storport.c:87
static NTSTATUS PortAddDriverInitData(PDRIVER_OBJECT_EXTENSION DriverExtension, PHW_INITIALIZATION_DATA HwInitializationData)
Definition: storport.c:28
STORPORT_API VOID NTAPI StorPortMoveMemory(_Out_writes_bytes_(Length) PVOID Destination, _In_reads_bytes_(Length) PVOID Source, _In_ ULONG Length)
Definition: storport.c:1536
STORPORT_API VOID NTAPI StorPortFreeRegistryBuffer(_In_ PVOID HwDeviceExtension, _In_ PUCHAR Buffer)
Definition: storport.c:1045
STORPORT_API BOOLEAN NTAPI StorPortValidateRange(_In_ PVOID HwDeviceExtension, _In_ INTERFACE_TYPE BusType, _In_ ULONG SystemIoBusNumber, _In_ STOR_PHYSICAL_ADDRESS IoAddress, _In_ ULONG NumberOfBytes, _In_ BOOLEAN InIoSpace)
Definition: storport.c:1998
STORPORT_API STOR_PHYSICAL_ADDRESS NTAPI StorPortGetPhysicalAddress(_In_ PVOID HwDeviceExtension, _In_opt_ PSCSI_REQUEST_BLOCK Srb, _In_ PVOID VirtualAddress, _Out_ ULONG *Length)
Definition: storport.c:1214
STORPORT_API BOOLEAN NTAPI StorPortRegistryRead(_In_ PVOID HwDeviceExtension, _In_ PUCHAR ValueName, _In_ ULONG Global, _In_ ULONG Type, _In_ PUCHAR Buffer, _In_ PULONG BufferLength)
Definition: storport.c:1816
STORPORT_API STOR_PHYSICAL_ADDRESS NTAPI StorPortConvertUlongToPhysicalAddress(_In_ ULONG_PTR UlongAddress)
Definition: storport.c:609
STORPORT_API BOOLEAN NTAPI StorPortPauseDevice(_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ ULONG TimeOut)
Definition: storport.c:1763
STORPORT_API PUCHAR NTAPI StorPortAllocateRegistryBuffer(_In_ PVOID HwDeviceExtension, _In_ PULONG Length)
Definition: storport.c:544
STORPORT_API BOOLEAN NTAPI StorPortReady(_In_ PVOID HwDeviceExtension)
Definition: storport.c:1801
STORPORT_API ULONG StorPortExtendedFunction(_In_ STORPORT_FUNCTION_CODE FunctionCode, _In_ PVOID HwDeviceExtension,...)
Definition: storport.c:714
STORPORT_API ULONG NTAPI StorPortConvertPhysicalAddressToUlong(_In_ STOR_PHYSICAL_ADDRESS Address)
Definition: storport.c:594
STORPORT_API VOID NTAPI StorPortCompleteRequest(_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ UCHAR SrbStatus)
Definition: storport.c:576
STORPORT_API ULONG NTAPI StorPortSetBusDataByOffset(_In_ PVOID DeviceExtension, _In_ ULONG BusDataType, _In_ ULONG SystemIoBusNumber, _In_ ULONG SlotNumber, _In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Offset, _In_ ULONG Length)
Definition: storport.c:1889
STORPORT_API PVOID NTAPI StorPortGetDeviceBase(_In_ PVOID HwDeviceExtension, _In_ INTERFACE_TYPE BusType, _In_ ULONG SystemIoBusNumber, _In_ STOR_PHYSICAL_ADDRESS IoAddress, _In_ ULONG NumberOfBytes, _In_ BOOLEAN InIoSpace)
Definition: storport.c:1101
STORPORT_API BOOLEAN NTAPI StorPortDeviceReady(_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
Definition: storport.c:683
STORPORT_API BOOLEAN NTAPI StorPortPause(_In_ PVOID HwDeviceExtension, _In_ ULONG TimeOut)
Definition: storport.c:1747
STORPORT_API ULONG NTAPI StorPortInitialize(_In_ PVOID Argument1, _In_ PVOID Argument2, _In_ struct _HW_INITIALIZATION_DATA *HwInitializationData, _In_opt_ PVOID HwContext)
Definition: storport.c:1401
static NTSTATUS NTAPI PortDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:472
static NTSTATUS NTAPI PortDispatchScsi(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:417
STORPORT_API PVOID NTAPI StorPortGetVirtualAddress(_In_ PVOID HwDeviceExtension, _In_ STOR_PHYSICAL_ADDRESS PhysicalAddress)
Definition: storport.c:1384
static NTSTATUS NTAPI PortDispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:343
STORPORT_API PSCSI_REQUEST_BLOCK NTAPI StorPortGetSrb(_In_ PVOID DeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ LONG QueueTag)
Definition: storport.c:1289
STORPORT_API VOID NTAPI StorPortStallExecution(_In_ ULONG Delay)
Definition: storport.c:1969
STORPORT_API BOOLEAN NTAPI StorPortResume(_In_ PVOID HwDeviceExtension)
Definition: storport.c:1856
STORPORT_API VOID NTAPI StorPortFreeDeviceBase(_In_ PVOID HwDeviceExtension, _In_ PVOID MappedAddress)
Definition: storport.c:1030
STORPORT_API BOOLEAN NTAPI StorPortResumeDevice(_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
Definition: storport.c:1871
static VOID PortDeleteDriverInitData(PDRIVER_OBJECT_EXTENSION DriverExtension)
Definition: storport.c:61
static VOID PortAcquireSpinLock(PFDO_DEVICE_EXTENSION DeviceExtension, STOR_SPINLOCK SpinLock, PVOID LockContext, PSTOR_LOCK_HANDLE LockHandle)
Definition: storport.c:114
static VOID NTAPI PortUnload(_In_ PDRIVER_OBJECT DriverObject)
Definition: storport.c:323
STORPORT_API VOID StorPortNotification(_In_ SCSI_NOTIFICATION_TYPE NotificationType, _In_ PVOID HwDeviceExtension,...)
Definition: storport.c:1550
static NTSTATUS NTAPI PortAddDevice(_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PhysicalDeviceObject)
Definition: storport.c:198
STORPORT_API VOID NTAPI StorPortLogError(_In_ PVOID HwDeviceExtension, _In_opt_ PSCSI_REQUEST_BLOCK Srb, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ ULONG ErrorCode, _In_ ULONG UniqueId)
Definition: storport.c:1513
STORPORT_API PSTOR_SCATTER_GATHER_LIST NTAPI StorPortGetScatterGatherList(_In_ PVOID HwDeviceExtension, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: storport.c:1269
STORPORT_API PVOID NTAPI StorPortGetUncachedExtension(_In_ PVOID HwDeviceExtension, _In_ PPORT_CONFIGURATION_INFORMATION ConfigInfo, _In_ ULONG NumberOfBytes)
Definition: storport.c:1307
BOOLEAN(NTAPI * PHW_PASSIVE_INITIALIZE_ROUTINE)(_In_ PVOID DeviceExtension)
Definition: storport.h:7048
VOID(NTAPI * PHW_TIMER_EX)(_In_ PVOID DeviceExtension, _In_opt_ PVOID Context)
Definition: storport.h:7061
@ ExtFunctionInitializeTimer
Definition: storport.h:1733
@ ExtFunctionRequestTimer
Definition: storport.h:1734
@ ExtFunctionGetOriginalMdl
Definition: storport.h:1704
@ ExtFunctionFreePool
Definition: storport.h:1699
@ ExtFunctionGetDeviceObjects
Definition: storport.h:1706
@ ExtFunctionInitializePerformanceOptimizations
Definition: storport.h:1712
@ ExtFunctionGetMessageInterruptInformation
Definition: storport.h:1711
@ ExtFunctionGetSystemAddress
Definition: storport.h:1703
@ ExtFunctionAllocatePool
Definition: storport.h:1698
#define STOR_STATUS_UNSUCCESSFUL
Definition: storport.h:567
#define STOR_STATUS_INSUFFICIENT_RESOURCES
Definition: storport.h:569
@ InvalidLock
Definition: storport.h:1431
@ StartIoLock
Definition: storport.h:1433
@ ThreadedDpcLock
Definition: storport.h:1435
@ DpcLevelLock
Definition: storport.h:1436
@ InterruptLock
Definition: storport.h:1434
@ DpcLock
Definition: storport.h:1432
enum _STORPORT_FUNCTION_CODE STORPORT_FUNCTION_CODE
#define STOR_STATUS_SUCCESS
Definition: storport.h:566
STOR_SYNCHRONIZED_ACCESS * PSTOR_SYNCHRONIZED_ACCESS
Definition: storport.h:7166
enum _STOR_SPINLOCK STOR_SPINLOCK
VOID(NTAPI * PHW_DPC_ROUTINE)(_In_ PSTOR_DPC Dpc, _In_ PVOID HwDeviceExtension, _In_ PVOID SystemArgument1, _In_ PVOID SystemArgument2)
Definition: storport.h:7053
#define STOR_STATUS_INVALID_PARAMETER
Definition: storport.h:572
struct _STOR_LOCK_HANDLE * PSTOR_LOCK_HANDLE
STORPORT_API VOID NTAPI StorPortQuerySystemTime(_Out_ PLARGE_INTEGER CurrentTime)
#define STOR_STATUS_NOT_IMPLEMENTED
Definition: storport.h:568
#define STOR_STATUS_BUSY
Definition: storport.h:578
@ InitializeDpc
Definition: storport.h:1617
@ AcquireSpinLock
Definition: storport.h:1619
@ IssueDpc
Definition: storport.h:1618
@ ReleaseSpinLock
Definition: storport.h:1620
@ GetExtendedFunctionTable
Definition: storport.h:1615
@ EnablePassiveInitialization
Definition: storport.h:1616
struct _STOR_DPC * PSTOR_DPC
#define STORPORT_API
Definition: storport.h:75
HW_INITIALIZATION_DATA HwInitData
Definition: precomp.h:68
LIST_ENTRY Entry
Definition: precomp.h:67
LIST_ENTRY AdapterListHead
Definition: precomp.h:83
KSPIN_LOCK AdapterListLock
Definition: precomp.h:82
EXTENSION_TYPE ExtensionType
Definition: precomp.h:79
PDEVICE_OBJECT LowerDevice
Definition: i8042prt.h:130
PDEVICE_OBJECT PhysicalDevice
Definition: precomp.h:248
LIST_ENTRY PdoListHead
Definition: precomp.h:274
KSPIN_LOCK PdoListLock
Definition: precomp.h:273
PVOID UncachedExtensionVirtualBase
Definition: precomp.h:261
LIST_ENTRY TimerListHead
Definition: precomp.h:289
DEVICE_STATE PnpState
Definition: i8042prt.h:132
ULONG UncachedExtensionSize
Definition: precomp.h:263
PHW_INITIALIZATION_DATA HwInitData
Definition: precomp.h:315
EXTENSION_TYPE ExtensionType
Definition: precomp.h:244
PDEVICE_OBJECT Device
Definition: precomp.h:246
FDO_IO_FLOW_CONTROL FlowControl
Definition: precomp.h:293
PDMA_ADAPTER DmaAdapter
Definition: precomp.h:264
LIST_ENTRY AdapterListEntry
Definition: precomp.h:251
PHYSICAL_ADDRESS UncachedExtensionPhysicalBase
Definition: precomp.h:262
PDRIVER_OBJECT_EXTENSION DriverExtension
Definition: precomp.h:249
KSPIN_LOCK TimerListLock
Definition: precomp.h:288
SLIST_HEADER CompletionList
Definition: precomp.h:299
PKINTERRUPT Interrupt
Definition: parport.h:48
STARVED_REQUEST_QUEUE StarvedRequests
Definition: precomp.h:309
LIST_ENTRY FdoBlockedRequestsListHead
Definition: precomp.h:231
ULONG OutstandingRequestCount
Definition: precomp.h:222
KSPIN_LOCK Lock
Definition: precomp.h:216
ULONG RemainingBusyRequests
Definition: precomp.h:224
ULONG RemainingPauseTime
Definition: precomp.h:225
INTERFACE_TYPE AdapterInterfaceType
Definition: srb.h:565
Definition: iotypes.h:336
Definition: ketypes.h:767
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
STOR_PHYSICAL_ADDRESS MessageAddress
Definition: storport.h:5786
KINTERRUPT_MODE InterruptMode
Definition: storport.h:5789
struct _MINIPORT * Miniport
Definition: precomp.h:91
PSCSI_REQUEST_BLOCK Srb
Definition: precomp.h:376
PEXTENDED_REQUEST ExtendedRequest
Definition: precomp.h:378
PSTOR_SCATTER_GATHER_LIST ScatterGatherList
Definition: precomp.h:380
SLIST_ENTRY CompletionEntry
Definition: precomp.h:372
Definition: precomp.h:117
KTIMER Timer
Definition: precomp.h:119
PVOID Context
Definition: precomp.h:124
LONG TimerAlreadySet
Definition: precomp.h:121
PHW_TIMER_EX TimerCallback
Definition: precomp.h:123
LIST_ENTRY ListEntry
Definition: precomp.h:118
KDPC TimerCallbackDpc
Definition: precomp.h:120
PVOID HwDeviceExtension
Definition: precomp.h:122
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:282
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
Definition: timerobj.c:206
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
unsigned char * PBOOLEAN
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
uint64_t ULONGLONG
Definition: typedefs.h:67
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
_In_ UCXUSBDEVICE _In_ ULONG Interface
Definition: ucxusbdevice.h:428
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
LONGLONG QuadPart
Definition: typedefs.h:114
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
Definition: wdfdevice.h:1024
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFDEVICE Fdo
Definition: wdffdo.h:461
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
Definition: wdffdo.h:463
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG PoolTag
Definition: wdfmemory.h:164
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceDescription
Definition: wdfpdo.h:432
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFSPINLOCK * SpinLock
Definition: wdfsync.h:228
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_IRQL_requires_same_ _In_opt_ PVOID Argument1
Definition: cmtypes.h:697
_Out_ PULONG NumberOfMapRegisters
Definition: halfuncs.h:209
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE BusType
Definition: halfuncs.h:159
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG _Out_ PPHYSICAL_ADDRESS TranslatedAddress
Definition: iofuncs.h:2593
_In_ PIO_TIMER_ROUTINE TimerRoutine
Definition: iofuncs.h:1396
#define IRP_MJ_SCSI
struct _DRIVER_OBJECT * PDRIVER_OBJECT
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define DEVICE_DESCRIPTION_VERSION
Definition: iotypes.h:2063
#define DO_POWER_PAGABLE
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MJ_POWER
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036
_In_ LARGE_INTEGER _In_ ULONG _In_ ULONG TolerableDelay
Definition: kefuncs.h:1305
*LockHandle LockHandle _Out_ PKLOCK_QUEUE_HANDLE LockHandle
Definition: kefuncs.h:717
KDEFERRED_ROUTINE * PKDEFERRED_ROUTINE
Definition: ketypes.h:758
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define BYTE_OFFSET(Va)
@ MmCached
Definition: mmtypes.h:130
#define NT_ASSERT
Definition: rtlfuncs.h:3334
#define InterlockedPushEntrySList(SListHead, SListEntry)
Definition: rtlfuncs.h:3413
FORCEINLINE VOID InitializeSListHead(_Out_ PSLIST_HEADER SListHead)
Definition: rtlfuncs.h:3375