ReactOS 0.4.17-dev-1321-g5c122a9
storport.c File Reference
#include "precomp.h"
#include "inline.h"
#include "wdm.h"
#include <debug.h>
#include <stdarg.h>
Include dependency graph for storport.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

static NTSTATUS PortAddDriverInitData (PDRIVER_OBJECT_EXTENSION DriverExtension, PHW_INITIALIZATION_DATA HwInitializationData)
 
static VOID PortDeleteDriverInitData (PDRIVER_OBJECT_EXTENSION DriverExtension)
 
PHW_INITIALIZATION_DATA PortGetDriverInitData (PDRIVER_OBJECT_EXTENSION DriverExtension, INTERFACE_TYPE InterfaceType)
 
static VOID PortAcquireSpinLock (PFDO_DEVICE_EXTENSION DeviceExtension, STOR_SPINLOCK SpinLock, PVOID LockContext, PSTOR_LOCK_HANDLE LockHandle)
 
static VOID PortReleaseSpinLock (PFDO_DEVICE_EXTENSION DeviceExtension, PSTOR_LOCK_HANDLE LockHandle)
 
static NTSTATUS NTAPI PortAddDevice (_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PhysicalDeviceObject)
 
static VOID NTAPI PortUnload (_In_ PDRIVER_OBJECT DriverObject)
 
static NTSTATUS NTAPI PortDispatchCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
static NTSTATUS NTAPI PortDispatchClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
static NTSTATUS NTAPI PortDispatchDeviceControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
static NTSTATUS NTAPI PortDispatchScsi (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
static NTSTATUS NTAPI PortDispatchSystemControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
static NTSTATUS NTAPI PortDispatchPnp (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
static NTSTATUS NTAPI PortDispatchPower (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI DriverEntry (_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
 
STORPORT_API PUCHAR NTAPI StorPortAllocateRegistryBuffer (_In_ PVOID HwDeviceExtension, _In_ PULONG Length)
 
STORPORT_API BOOLEAN NTAPI StorPortBusy (_In_ PVOID HwDeviceExtension, _In_ ULONG RequestsToComplete)
 
STORPORT_API VOID NTAPI StorPortCompleteRequest (_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ UCHAR SrbStatus)
 
STORPORT_API ULONG NTAPI StorPortConvertPhysicalAddressToUlong (_In_ STOR_PHYSICAL_ADDRESS Address)
 
STORPORT_API STOR_PHYSICAL_ADDRESS NTAPI StorPortConvertUlongToPhysicalAddress (_In_ ULONG_PTR UlongAddress)
 
STORPORT_API VOID StorPortDebugPrint (_In_ ULONG DebugPrintLevel, _In_ PCHAR DebugMessage,...)
 
STORPORT_API BOOLEAN NTAPI StorPortDeviceBusy (_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ ULONG RequestsToComplete)
 
STORPORT_API BOOLEAN NTAPI StorPortDeviceReady (_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
 
STORPORT_API ULONG StorPortExtendedFunction (_In_ STORPORT_FUNCTION_CODE FunctionCode, _In_ PVOID HwDeviceExtension,...)
 
STORPORT_API VOID NTAPI StorPortFreeDeviceBase (_In_ PVOID HwDeviceExtension, _In_ PVOID MappedAddress)
 
STORPORT_API VOID NTAPI StorPortFreeRegistryBuffer (_In_ PVOID HwDeviceExtension, _In_ PUCHAR Buffer)
 
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)
 
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)
 
STORPORT_API PVOID NTAPI StorPortGetLogicalUnit (_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
 
STORPORT_API STOR_PHYSICAL_ADDRESS NTAPI StorPortGetPhysicalAddress (_In_ PVOID HwDeviceExtension, _In_opt_ PSCSI_REQUEST_BLOCK Srb, _In_ PVOID VirtualAddress, _Out_ ULONG *Length)
 
STORPORT_API PSTOR_SCATTER_GATHER_LIST NTAPI StorPortGetScatterGatherList (_In_ PVOID HwDeviceExtension, _In_ PSCSI_REQUEST_BLOCK Srb)
 
STORPORT_API PSCSI_REQUEST_BLOCK NTAPI StorPortGetSrb (_In_ PVOID DeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ LONG QueueTag)
 
STORPORT_API PVOID NTAPI StorPortGetUncachedExtension (_In_ PVOID HwDeviceExtension, _In_ PPORT_CONFIGURATION_INFORMATION ConfigInfo, _In_ ULONG NumberOfBytes)
 
STORPORT_API PVOID NTAPI StorPortGetVirtualAddress (_In_ PVOID HwDeviceExtension, _In_ STOR_PHYSICAL_ADDRESS PhysicalAddress)
 
STORPORT_API ULONG NTAPI StorPortInitialize (_In_ PVOID Argument1, _In_ PVOID Argument2, _In_ struct _HW_INITIALIZATION_DATA *HwInitializationData, _In_opt_ PVOID HwContext)
 
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)
 
STORPORT_API VOID NTAPI StorPortMoveMemory (_Out_writes_bytes_(Length) PVOID Destination, _In_reads_bytes_(Length) PVOID Source, _In_ ULONG Length)
 
STORPORT_API VOID StorPortNotification (_In_ SCSI_NOTIFICATION_TYPE NotificationType, _In_ PVOID HwDeviceExtension,...)
 
STORPORT_API BOOLEAN NTAPI StorPortPause (_In_ PVOID HwDeviceExtension, _In_ ULONG TimeOut)
 
STORPORT_API BOOLEAN NTAPI StorPortPauseDevice (_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ ULONG TimeOut)
 
STORPORT_API BOOLEAN NTAPI StorPortReady (_In_ PVOID HwDeviceExtension)
 
STORPORT_API BOOLEAN NTAPI StorPortRegistryRead (_In_ PVOID HwDeviceExtension, _In_ PUCHAR ValueName, _In_ ULONG Global, _In_ ULONG Type, _In_ PUCHAR Buffer, _In_ PULONG BufferLength)
 
STORPORT_API BOOLEAN NTAPI StorPortRegistryWrite (_In_ PVOID HwDeviceExtension, _In_ PUCHAR ValueName, _In_ ULONG Global, _In_ ULONG Type, _In_ PUCHAR Buffer, _In_ ULONG BufferLength)
 
STORPORT_API BOOLEAN NTAPI StorPortResume (_In_ PVOID HwDeviceExtension)
 
STORPORT_API BOOLEAN NTAPI StorPortResumeDevice (_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
 
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)
 
STORPORT_API BOOLEAN NTAPI StorPortSetDeviceQueueDepth (_In_ PVOID HwDeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun, _In_ ULONG Depth)
 
STORPORT_API VOID NTAPI StorPortStallExecution (_In_ ULONG Delay)
 
STORPORT_API VOID NTAPI StorPortSynchronizeAccess (_In_ PVOID HwDeviceExtension, _In_ PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine, _In_opt_ PVOID Context)
 
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)
 

Variables

ULONG PortNumber = 0
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 14 of file storport.c.

Function Documentation

◆ DriverEntry()

NTSTATUS NTAPI DriverEntry ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PUNICODE_STRING  RegistryPath 
)

Definition at line 529 of file storport.c.

532{
533 DPRINT1("DriverEntry(%p %p)\n", DriverObject, RegistryPath);
534 return STATUS_SUCCESS;
535}
#define DPRINT1
Definition: precomp.h:8
#define STATUS_SUCCESS
Definition: shellext.h:65
_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

◆ PortAcquireSpinLock()

static VOID PortAcquireSpinLock ( PFDO_DEVICE_EXTENSION  DeviceExtension,
STOR_SPINLOCK  SpinLock,
PVOID  LockContext,
PSTOR_LOCK_HANDLE  LockHandle 
)
static

Definition at line 114 of file storport.c.

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}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
KIRQL NTAPI KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
Definition: spinlock.c:154
#define DPRINT
Definition: sndvol32.h:73
@ 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
PKINTERRUPT Interrupt
Definition: parport.h:48
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFSPINLOCK * SpinLock
Definition: wdfsync.h:228
*LockHandle LockHandle _Out_ PKLOCK_QUEUE_HANDLE LockHandle
Definition: kefuncs.h:717
#define NT_ASSERT
Definition: rtlfuncs.h:3334

Referenced by StorPortNotification().

◆ PortAddDevice()

static NTSTATUS NTAPI PortAddDevice ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PDEVICE_OBJECT  PhysicalDeviceObject 
)
static

Definition at line 198 of file storport.c.

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}
LONG NTSTATUS
Definition: precomp.h:26
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
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
VOID NTAPI SimpleTimerCallbackDpcRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: misc.c:327
@ 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 DO_DIRECT_IO
Definition: env_spec_w32.h:396
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
Status
Definition: gdiplustypes.h:24
_In_ ULONG PortNumber
Definition: hubucx.h:272
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
@ dsStopped
Definition: isapnp.h:30
#define ASSERT(a)
Definition: mode.c:44
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
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
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
#define FILE_DEVICE_CONTROLLER
Definition: winioctl.h:49
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
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
LIST_ENTRY TimerListHead
Definition: precomp.h:289
DEVICE_STATE PnpState
Definition: i8042prt.h:132
EXTENSION_TYPE ExtensionType
Definition: precomp.h:244
PDEVICE_OBJECT Device
Definition: precomp.h:246
FDO_IO_FLOW_CONTROL FlowControl
Definition: precomp.h:293
LIST_ENTRY AdapterListEntry
Definition: precomp.h:251
PDRIVER_OBJECT_EXTENSION DriverExtension
Definition: precomp.h:249
KSPIN_LOCK TimerListLock
Definition: precomp.h:288
SLIST_HEADER CompletionList
Definition: precomp.h:299
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
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_Must_inspect_result_ _In_ WDFDEVICE Fdo
Definition: wdffdo.h:461
#define DO_POWER_PAGABLE
FORCEINLINE VOID InitializeSListHead(_Out_ PSLIST_HEADER SListHead)
Definition: rtlfuncs.h:3375

Referenced by StorPortInitialize().

◆ PortAddDriverInitData()

static NTSTATUS PortAddDriverInitData ( PDRIVER_OBJECT_EXTENSION  DriverExtension,
PHW_INITIALIZATION_DATA  HwInitializationData 
)
static

Definition at line 28 of file storport.c.

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}
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define TAG_INIT_DATA
Definition: precomp.h:29
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define NonPagedPool
Definition: env_spec_w32.h:307
#define min(a, b)
Definition: monoChain.cc:55
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA * HwInitializationData
Definition: srb.h:906
HW_INITIALIZATION_DATA HwInitData
Definition: precomp.h:68
LIST_ENTRY Entry
Definition: precomp.h:67
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint32_t ULONG
Definition: typedefs.h:59

Referenced by StorPortInitialize().

◆ PortDeleteDriverInitData()

static VOID PortDeleteDriverInitData ( PDRIVER_OBJECT_EXTENSION  DriverExtension)
static

Definition at line 61 of file storport.c.

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}
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
Definition: typedefs.h:120
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by PortUnload().

◆ PortDispatchClose()

static NTSTATUS NTAPI PortDispatchClose ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 362 of file storport.c.

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}
_In_ PIRP Irp
Definition: kse.h:79
#define IoCompleteRequest
Definition: irp.c:1272
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by StorPortInitialize().

◆ PortDispatchCreate()

static NTSTATUS NTAPI PortDispatchCreate ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 343 of file storport.c.

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}
#define FILE_OPENED
Definition: nt_native.h:769

Referenced by StorPortInitialize().

◆ PortDispatchDeviceControl()

static NTSTATUS NTAPI PortDispatchDeviceControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 381 of file storport.c.

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}
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
@ PdoExtension
Definition: precomp.h:62
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132

Referenced by StorPortInitialize().

◆ PortDispatchPnp()

static NTSTATUS NTAPI PortDispatchPnp ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 472 of file storport.c.

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}
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

Referenced by StorPortInitialize().

◆ PortDispatchPower()

static NTSTATUS NTAPI PortDispatchPower ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 506 of file storport.c.

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}

Referenced by StorPortInitialize().

◆ PortDispatchScsi()

static NTSTATUS NTAPI PortDispatchScsi ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 417 of file storport.c.

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}
NTSTATUS NTAPI PortPdoScsi(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: srb.c:548
NTSTATUS NTAPI PortFdoScsi(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: fdo.c:1491

Referenced by StorPortInitialize().

◆ PortDispatchSystemControl()

static NTSTATUS NTAPI PortDispatchSystemControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)
static

Definition at line 453 of file storport.c.

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}

Referenced by StorPortInitialize().

◆ PortGetDriverInitData()

PHW_INITIALIZATION_DATA PortGetDriverInitData ( PDRIVER_OBJECT_EXTENSION  DriverExtension,
INTERFACE_TYPE  InterfaceType 
)

Definition at line 87 of file storport.c.

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}
INTERFACE_TYPE AdapterInterfaceType
Definition: srb.h:565
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
Definition: wdffdo.h:463

Referenced by PortFdoStartMiniport(), and StorPortGetUncachedExtension().

◆ PortReleaseSpinLock()

static VOID PortReleaseSpinLock ( PFDO_DEVICE_EXTENSION  DeviceExtension,
PSTOR_LOCK_HANDLE  LockHandle 
)
static

Definition at line 158 of file storport.c.

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}
VOID NTAPI KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt, IN KIRQL OldIrql)
Definition: spinlock.c:171

Referenced by StorPortNotification().

◆ PortUnload()

static VOID NTAPI PortUnload ( _In_ PDRIVER_OBJECT  DriverObject)
static

Definition at line 323 of file storport.c.

325{
327
328 DPRINT1("PortUnload(%p)\n",
330
333 if (DriverExtension != NULL)
334 {
336 }
337}
static VOID PortDeleteDriverInitData(PDRIVER_OBJECT_EXTENSION DriverExtension)
Definition: storport.c:61

Referenced by StorPortInitialize().

◆ StorPortAllocateRegistryBuffer()

STORPORT_API PUCHAR NTAPI StorPortAllocateRegistryBuffer ( _In_ PVOID  HwDeviceExtension,
_In_ PULONG  Length 
)

Definition at line 544 of file storport.c.

547{
548 DPRINT1("StorPortAllocateRegistryBuffer()\n");
550 return NULL;
551}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

◆ StorPortBusy()

STORPORT_API BOOLEAN NTAPI StorPortBusy ( _In_ PVOID  HwDeviceExtension,
_In_ ULONG  RequestsToComplete 
)

Definition at line 560 of file storport.c.

563{
564 DPRINT1("StorPortBuzy()\n");
566 return FALSE;
567}

◆ StorPortCompleteRequest()

STORPORT_API VOID NTAPI StorPortCompleteRequest ( _In_ PVOID  HwDeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun,
_In_ UCHAR  SrbStatus 
)

Definition at line 576 of file storport.c.

582{
583 DPRINT1("StorPortCompleteRequest()\n");
585}

◆ StorPortConvertPhysicalAddressToUlong()

STORPORT_API ULONG NTAPI StorPortConvertPhysicalAddressToUlong ( _In_ STOR_PHYSICAL_ADDRESS  Address)

Definition at line 594 of file storport.c.

596{
597 DPRINT("StorPortConvertPhysicalAddressToUlong()\n");
598
599 return Address.u.LowPart;
600}
static WCHAR Address[46]
Definition: ping.c:68

◆ StorPortConvertUlongToPhysicalAddress()

STORPORT_API STOR_PHYSICAL_ADDRESS NTAPI StorPortConvertUlongToPhysicalAddress ( _In_ ULONG_PTR  UlongAddress)

Definition at line 609 of file storport.c.

611{
613
614 DPRINT("StorPortConvertUlongToPhysicalAddress()\n");
615
616 Address.QuadPart = UlongAddress;
617 return Address;
618}

◆ StorPortDebugPrint()

STORPORT_API VOID StorPortDebugPrint ( _In_ ULONG  DebugPrintLevel,
_In_ PCHAR  DebugMessage,
  ... 
)

Definition at line 626 of file storport.c.

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}
#define DPFLTR_ERROR_LEVEL
Definition: main.cpp:32
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
ULONG NTAPI vDbgPrintExWithPrefix(IN PCCH Prefix, IN ULONG ComponentId, IN ULONG Level, IN PCCH Format, IN va_list ap)
Definition: debug.c:167
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36

◆ StorPortDeviceBusy()

STORPORT_API BOOLEAN NTAPI StorPortDeviceBusy ( _In_ PVOID  HwDeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun,
_In_ ULONG  RequestsToComplete 
)

Definition at line 649 of file storport.c.

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}
_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_ DXGK_MIRACAST_DISPLAY_CALLBACKS _Out_ PVOID _Out_ ULONG * TargetId
Definition: dispmprt.h:650
#define TRUE
Definition: types.h:120
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
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
PPDO_DEVICE_EXTENSION FdoFindLun(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ ULONG Bus, _In_ ULONG Target, _In_ ULONG Lun)
Definition: fdo.c:1306

◆ StorPortDeviceReady()

STORPORT_API BOOLEAN NTAPI StorPortDeviceReady ( _In_ PVOID  HwDeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun 
)

Definition at line 683 of file storport.c.

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}

◆ StorPortExtendedFunction()

STORPORT_API ULONG StorPortExtendedFunction ( _In_ STORPORT_FUNCTION_CODE  FunctionCode,
_In_ PVOID  HwDeviceExtension,
  ... 
)

Definition at line 714 of file storport.c.

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}
_In_ PSCSI_REQUEST_BLOCK Srb
Definition: cdrom.h:989
_In_z_ PCCHAR _In_ PDEVICE_OBJECT LowerDeviceObject
Definition: classpnp.h:983
_In_ ULONG _In_ ULONG _In_opt_ DXGKCB_MIRACAST_SEND_MESSAGE_CALLBACK _In_opt_ PVOID CallbackContext
Definition: dispmprt.h:622
#define va_arg(v, l)
Definition: stdarg.h:27
VOID NTAPI TimerCallbackDpcRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: misc.c:348
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
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
_In_ ULONG MessageId
Definition: hubioctl.cpp:1369
#define InterlockedCompareExchange
Definition: interlocked.h:119
@ NormalPagePriority
Definition: imports.h:54
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
Definition: ntbasedef.h:395
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
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
#define STOR_STATUS_SUCCESS
Definition: storport.h:566
#define STOR_STATUS_INVALID_PARAMETER
Definition: storport.h:572
#define STOR_STATUS_NOT_IMPLEMENTED
Definition: storport.h:568
#define STOR_STATUS_BUSY
Definition: storport.h:578
Definition: iotypes.h:336
STOR_PHYSICAL_ADDRESS MessageAddress
Definition: storport.h:5786
KINTERRUPT_MODE InterruptMode
Definition: storport.h:5789
struct _MINIPORT * Miniport
Definition: precomp.h:91
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 * PVOID
Definition: typedefs.h:50
uint64_t ULONGLONG
Definition: typedefs.h:67
LONGLONG QuadPart
Definition: typedefs.h:114
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG PoolTag
Definition: wdfmemory.h:164
_In_ LARGE_INTEGER _In_ ULONG _In_ ULONG TolerableDelay
Definition: kefuncs.h:1305
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)

Referenced by StorPortAcquireMSISpinLock(), StorPortAllocateContiguousMemorySpecifyCacheNode(), StorPortAllocateDmaMemory(), StorPortAllocateHostMemoryBuffer(), StorPortAllocateMdl(), StorPortAllocatePool(), StorPortBuildMdlForNonPagedPool(), StorPortBuildScatterGatherList(), StorPortCancelDpc(), StorPortCancelHighResolutionTimer(), StorPortCaptureLiveDump(), StorPortCompleteServiceIrp(), StorPortCreateSystemThread(), StorPortCurrentOsInstallationUpgrade(), StorPortDelayExecution(), StorPortDeviceOperationAllowed(), StorPortEtwEvent2(), StorPortEtwEvent4(), StorPortFlushDataBufferMdl(), StorPortFreeContiguousMemorySpecifyCache(), StorPortFreeDmaMemory(), StorPortFreeHighResolutionTimer(), StorPortFreeHostMemoryBuffer(), StorPortFreeMdl(), StorPortFreePool(), StorPortFreeTimer(), StorPortFreeWorker(), StorPortGetActiveGroupCount(), StorPortGetActiveNodeCount(), StorPortGetActivityIdSrb(), StorPortGetCurrentIrql(), StorPortGetCurrentProcessorIndex(), StorPortGetCurrentProcessorNumber(), StorPortGetD3ColdSupport(), StorPortGetDataInBufferMdl(), StorPortGetDataInBufferScatterGatherList(), StorPortGetDataInBufferSystemAddress(), StorPortGetDeviceObjects(), StorPortGetGroupAffinity(), StorPortGetHighestNodeNumber(), StorPortGetMSIInfo(), StorPortGetNodeAffinity(), StorPortGetOriginalMdl(), StorPortGetPfns(), StorPortGetProcessorCount(), StorPortGetProcessorIndexFromNumber(), StorPortGetRequestCryptoInfo(), StorPortGetRequestInfo(), StorPortGetStartIoPerfParams(), StorPortGetSystemAddress(), StorPortGetSystemPortNumber(), StorPortHardwareReset(), StorPortInitializeCryptoEngine(), StorPortInitializeEvent(), StorPortInitializeHighResolutionTimer(), StorPortInitializePerfOpts(), StorPortInitializePoFxPower(), StorPortInitializeRpmb(), StorPortInitializeSListHead(), StorPortInitializeSpinLock(), StorPortInitializeTimer(), StorPortInitializeWorker(), StorPortInterlockedFlushSList(), StorPortInterlockedInsertHeadList(), StorPortInterlockedInsertTailList(), StorPortInterlockedPopEntrySList(), StorPortInterlockedPushEntrySList(), StorPortInterlockedRemoveHeadList(), StorPortInvokeAcpiMethod(), StorPortLogSystemEvent(), StorPortLogTelemetry(), StorPortLogTelemetryEx(), StorPortMarkDumpMemory(), StorPortMaskPciMsixEntry(), StorPortMiniportReportInternalData(), StorPortPoFxActivateComponent(), StorPortPoFxIdleComponent(), StorPortPoFxPowerControl(), StorPortPoFxRegisterPerfStates(), StorPortPoFxSetComponentLatency(), StorPortPoFxSetComponentResidency(), StorPortPoFxSetIdleTimeout(), StorPortPoFxSetPerfState(), StorPortPropagateIrpExtension(), StorPortPutScatterGatherList(), StorPortQueryConfiguration(), StorPortQueryDepthSList(), StorPortQueryDpcWatchdogInformation(), StorPortQueryPerformanceCounter(), StorPortQueryTimerMinInterval(), StorPortQueueWorkItem(), StorPortRegistryReadAdapterKey(), StorPortRegistryWriteAdapterKey(), StorPortReleaseMSISpinLock(), StorPortRequestHighResolutionTimer(), StorPortRequestTimer(), StorPortRevertToUserGroupAffinityThread(), StorPortSetAdapterBusType(), StorPortSetEvent(), StorPortSetFeatureList(), StorPortSetPriorityThread(), StorPortSetSystemGroupAffinityThread(), StorPortSetUnitAttributes(), StorPortUpdateAdapterMaxIO(), and StorPortWaitForEvent().

◆ StorPortFreeDeviceBase()

STORPORT_API VOID NTAPI StorPortFreeDeviceBase ( _In_ PVOID  HwDeviceExtension,
_In_ PVOID  MappedAddress 
)

Definition at line 1030 of file storport.c.

1033{
1034 DPRINT1("StorPortFreeDeviceBase(%p %p)\n",
1035 HwDeviceExtension, MappedAddress);
1036}

◆ StorPortFreeRegistryBuffer()

STORPORT_API VOID NTAPI StorPortFreeRegistryBuffer ( _In_ PVOID  HwDeviceExtension,
_In_ PUCHAR  Buffer 
)

Definition at line 1045 of file storport.c.

1048{
1049 DPRINT1("StorPortFreeRegistryBuffer()\n");
1051}

◆ StorPortGetBusData()

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 at line 1060 of file storport.c.

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}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
Definition: bufpool.h:45
_In_ UCXUSBDEVICE _In_ ULONG Interface
Definition: ucxusbdevice.h:428
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68

Referenced by AhciHwFindAdapter().

◆ StorPortGetDeviceBase()

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 at line 1101 of file storport.c.

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}
#define ULONG_PTR
Definition: config.h:101
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
PVOID NTAPI MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
Definition: iosup.c:47
uint32_t ULONG_PTR
Definition: typedefs.h:65
_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:2294
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:1036

Referenced by AhciHwFindAdapter().

◆ StorPortGetLogicalUnit()

STORPORT_API PVOID NTAPI StorPortGetLogicalUnit ( _In_ PVOID  HwDeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun 
)

Definition at line 1173 of file storport.c.

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}
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
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

◆ StorPortGetPhysicalAddress()

STORPORT_API STOR_PHYSICAL_ADDRESS NTAPI StorPortGetPhysicalAddress ( _In_ PVOID  HwDeviceExtension,
_In_opt_ PSCSI_REQUEST_BLOCK  Srb,
_In_ PVOID  VirtualAddress,
_Out_ ULONG *  Length 
)

Definition at line 1214 of file storport.c.

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}
_In_ ULONG _In_ MEMORY_CACHING_TYPE _Out_ PPHYSICAL_ADDRESS PhysicalAddress
Definition: dispmprt.h:714
_In_ ULONG _In_ MEMORY_CACHING_TYPE _Out_ PPHYSICAL_ADDRESS _Out_ PVOID * VirtualAddress
Definition: dispmprt.h:716
#define PAGE_SIZE
Definition: env_spec_w32.h:49
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
Definition: stubs.c:663
PVOID UncachedExtensionVirtualBase
Definition: precomp.h:261
ULONG UncachedExtensionSize
Definition: precomp.h:263
PHYSICAL_ADDRESS UncachedExtensionPhysicalBase
Definition: precomp.h:262
#define BYTE_OFFSET(Va)

Referenced by AhciPortInitialize(), and AhciProcessSrb().

◆ StorPortGetScatterGatherList()

STORPORT_API PSTOR_SCATTER_GATHER_LIST NTAPI StorPortGetScatterGatherList ( _In_ PVOID  HwDeviceExtension,
_In_ PSCSI_REQUEST_BLOCK  Srb 
)

Definition at line 1269 of file storport.c.

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}
PSTOR_SCATTER_GATHER_LIST ScatterGatherList
Definition: precomp.h:380

Referenced by AhciATAPICommand(), and DeviceRequestReadWrite().

◆ StorPortGetSrb()

STORPORT_API PSCSI_REQUEST_BLOCK NTAPI StorPortGetSrb ( _In_ PVOID  DeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun,
_In_ LONG  QueueTag 
)

Definition at line 1289 of file storport.c.

1295{
1296 DPRINT("StorPortGetSrb()\n");
1297 return NULL;
1298}

◆ StorPortGetUncachedExtension()

STORPORT_API PVOID NTAPI StorPortGetUncachedExtension ( _In_ PVOID  HwDeviceExtension,
_In_ PPORT_CONFIGURATION_INFORMATION  ConfigInfo,
_In_ ULONG  NumberOfBytes 
)

Definition at line 1307 of file storport.c.

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}
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
union Alignment_ Alignment
PDMA_ADAPTER NTAPI IoGetDmaAdapter(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PDEVICE_DESCRIPTION DeviceDescription, IN OUT PULONG NumberOfMapRegisters)
Definition: pnpdma.c:23
PHW_INITIALIZATION_DATA PortGetDriverInitData(PDRIVER_OBJECT_EXTENSION DriverExtension, INTERFACE_TYPE InterfaceType)
Definition: storport.c:87
PHW_INITIALIZATION_DATA HwInitData
Definition: precomp.h:315
PDMA_ADAPTER DmaAdapter
Definition: precomp.h:264
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceDescription
Definition: wdfpdo.h:432
_Out_ PULONG NumberOfMapRegisters
Definition: halfuncs.h:209
#define DEVICE_DESCRIPTION_VERSION
Definition: iotypes.h:2063
@ MmCached
Definition: mmtypes.h:130

Referenced by AhciAllocateResourceForAdapter().

◆ StorPortGetVirtualAddress()

STORPORT_API PVOID NTAPI StorPortGetVirtualAddress ( _In_ PVOID  HwDeviceExtension,
_In_ STOR_PHYSICAL_ADDRESS  PhysicalAddress 
)

Definition at line 1384 of file storport.c.

1387{
1388 DPRINT1("StorPortGetVirtualAddress(%p %I64x)\n",
1389 HwDeviceExtension, PhysicalAddress.QuadPart);
1391 return NULL;
1392}

◆ StorPortInitialize()

STORPORT_API ULONG NTAPI StorPortInitialize ( _In_ PVOID  Argument1,
_In_ PVOID  Argument2,
_In_ struct _HW_INITIALIZATION_DATA *  HwInitializationData,
_In_opt_ PVOID  HwContext 
)

Definition at line 1401 of file storport.c.

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}
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
_In_ PVOID Argument2
Definition: classpnp.h:721
#define HW_INIT_DATA_SIZE_PHYSICAL
Definition: precomp.h:72
UNICODE_STRING * PUNICODE_STRING
Definition: env_spec_w32.h:373
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1847
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:419
#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
_Must_inspect_result_ _In_ PVOID _In_ struct _HW_INITIALIZATION_DATA _In_ PVOID HwContext
Definition: srb.h:907
static NTSTATUS NTAPI PortDispatchSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:453
static NTSTATUS NTAPI PortDispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:362
static NTSTATUS NTAPI PortDispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:506
static NTSTATUS NTAPI PortDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:381
static NTSTATUS PortAddDriverInitData(PDRIVER_OBJECT_EXTENSION DriverExtension, PHW_INITIALIZATION_DATA HwInitializationData)
Definition: storport.c:28
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
static NTSTATUS NTAPI PortDispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: storport.c:343
static VOID NTAPI PortUnload(_In_ PDRIVER_OBJECT DriverObject)
Definition: storport.c:323
static NTSTATUS NTAPI PortAddDevice(_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PhysicalDeviceObject)
Definition: storport.c:198
LIST_ENTRY InitDataListHead
Definition: precomp.h:86
PDRIVER_OBJECT DriverObject
Definition: precomp.h:80
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_IRQL_requires_same_ _In_opt_ PVOID Argument1
Definition: cmtypes.h:697
#define IRP_MJ_SCSI
struct _DRIVER_OBJECT * PDRIVER_OBJECT
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MJ_POWER

Referenced by DriverEntry().

◆ StorPortLogError()

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 at line 1513 of file storport.c.

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}
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4438

◆ StorPortMoveMemory()

STORPORT_API VOID NTAPI StorPortMoveMemory ( _Out_writes_bytes_(Length) PVOID  Destination,
_In_reads_bytes_(Length) PVOID  Source,
_In_ ULONG  Length 
)

Definition at line 1536 of file storport.c.

1540{
1542}
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3171
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264

◆ StorPortNotification()

STORPORT_API VOID StorPortNotification ( _In_ SCSI_NOTIFICATION_TYPE  NotificationType,
_In_ PVOID  HwDeviceExtension,
  ... 
)

Definition at line 1550 of file storport.c.

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}
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:725
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
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
BOOLEAN NTAPI StorpIsExtendedSrb(_In_ PVOID Srb)
Tells whether a request block is in the extended format.
Definition: srbex.c:47
static VOID PortReleaseSpinLock(PFDO_DEVICE_EXTENSION DeviceExtension, PSTOR_LOCK_HANDLE LockHandle)
Definition: storport.c:158
static VOID PortAcquireSpinLock(PFDO_DEVICE_EXTENSION DeviceExtension, STOR_SPINLOCK SpinLock, PVOID LockContext, PSTOR_LOCK_HANDLE LockHandle)
Definition: storport.c:114
BOOLEAN(NTAPI * PHW_PASSIVE_INITIALIZE_ROUTINE)(_In_ PVOID DeviceExtension)
Definition: storport.h:7048
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
struct _STOR_LOCK_HANDLE * PSTOR_LOCK_HANDLE
@ 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
Definition: ketypes.h:767
PSCSI_REQUEST_BLOCK Srb
Definition: precomp.h:376
PEXTENDED_REQUEST ExtendedRequest
Definition: precomp.h:378
SLIST_ENTRY CompletionEntry
Definition: precomp.h:372
unsigned char * PBOOLEAN
Definition: typedefs.h:53
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
Definition: wdfdevice.h:1024
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_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
_In_ PIO_TIMER_ROUTINE TimerRoutine
Definition: iofuncs.h:1097
KDEFERRED_ROUTINE * PKDEFERRED_ROUTINE
Definition: ketypes.h:758
#define InterlockedPushEntrySList(SListHead, SListEntry)
Definition: rtlfuncs.h:3413

Referenced by AhciCommandCompletionDpcRoutine(), AhciCompleteIssuedSrb(), AhciHwStartIo(), StorPortAcquireSpinLock(), StorPortEnablePassiveInitialization(), StorPortInitializeDpc(), StorPortIssueDpc(), StorPortReleaseSpinLock(), and StorPortTerminateSystemThread().

◆ StorPortPause()

STORPORT_API BOOLEAN NTAPI StorPortPause ( _In_ PVOID  HwDeviceExtension,
_In_ ULONG  TimeOut 
)

Definition at line 1747 of file storport.c.

1750{
1751 DPRINT1("StorPortPause()\n");
1753 return FALSE;
1754}

◆ StorPortPauseDevice()

STORPORT_API BOOLEAN NTAPI StorPortPauseDevice ( _In_ PVOID  HwDeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun,
_In_ ULONG  TimeOut 
)

Definition at line 1763 of file storport.c.

1769{
1770 DPRINT1("StorPortPauseDevice()\n");
1772 return FALSE;
1773}

◆ StorPortReady()

STORPORT_API BOOLEAN NTAPI StorPortReady ( _In_ PVOID  HwDeviceExtension)

Definition at line 1801 of file storport.c.

1803{
1804 DPRINT1("StorPortReady()\n");
1806 return FALSE;
1807}

◆ StorPortRegistryRead()

STORPORT_API BOOLEAN NTAPI StorPortRegistryRead ( _In_ PVOID  HwDeviceExtension,
_In_ PUCHAR  ValueName,
_In_ ULONG  Global,
_In_ ULONG  Type,
_In_ PUCHAR  Buffer,
_In_ PULONG  BufferLength 
)

Definition at line 1816 of file storport.c.

1823{
1824 DPRINT1("StorPortRegistryRead()\n");
1826 return FALSE;
1827}

◆ StorPortRegistryWrite()

STORPORT_API BOOLEAN NTAPI StorPortRegistryWrite ( _In_ PVOID  HwDeviceExtension,
_In_ PUCHAR  ValueName,
_In_ ULONG  Global,
_In_ ULONG  Type,
_In_ PUCHAR  Buffer,
_In_ ULONG  BufferLength 
)

Definition at line 1836 of file storport.c.

1843{
1844 DPRINT1("StorPortRegistryWrite()\n");
1846 return FALSE;
1847}

◆ StorPortResume()

STORPORT_API BOOLEAN NTAPI StorPortResume ( _In_ PVOID  HwDeviceExtension)

Definition at line 1856 of file storport.c.

1858{
1859 DPRINT1("StorPortResume()\n");
1861 return FALSE;
1862}

◆ StorPortResumeDevice()

STORPORT_API BOOLEAN NTAPI StorPortResumeDevice ( _In_ PVOID  HwDeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun 
)

Definition at line 1871 of file storport.c.

1876{
1877 DPRINT1("StorPortResumeDevice()\n");
1879 return FALSE;
1880}

◆ StorPortSetBusDataByOffset()

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 at line 1889 of file storport.c.

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}

◆ StorPortSetDeviceQueueDepth()

STORPORT_API BOOLEAN NTAPI StorPortSetDeviceQueueDepth ( _In_ PVOID  HwDeviceExtension,
_In_ UCHAR  PathId,
_In_ UCHAR  TargetId,
_In_ UCHAR  Lun,
_In_ ULONG  Depth 
)

Definition at line 1930 of file storport.c.

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}
UINT Depth
Definition: d3d12.idl:4644

Referenced by AtapiInquiryCompletion(), and InquiryCompletion().

◆ StorPortStallExecution()

STORPORT_API VOID NTAPI StorPortStallExecution ( _In_ ULONG  Delay)

Definition at line 1969 of file storport.c.

1971{
1973}
#define KeStallExecutionProcessor(MicroSeconds)
Definition: precomp.h:27

Referenced by AhciAdapterReset(), AhciPortInitialize(), and AhciStartPort().

◆ StorPortSynchronizeAccess()

STORPORT_API VOID NTAPI StorPortSynchronizeAccess ( _In_ PVOID  HwDeviceExtension,
_In_ PSTOR_SYNCHRONIZED_ACCESS  SynchronizedAccessRoutine,
_In_opt_ PVOID  Context 
)

Definition at line 1982 of file storport.c.

1986{
1987 DPRINT1("StorPortSynchronizeAccess()\n");
1989}

◆ StorPortValidateRange()

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 at line 1998 of file storport.c.

2005{
2006 DPRINT1("StorPortValidateRange()\n");
2007 return TRUE;
2008}

Variable Documentation

◆ PortNumber

Definition at line 21 of file storport.c.