179 DPRINT1(
"Failed to reserve a request packet\n");
183 if (SrbExtensionSize == 0)
193 DPRINT1(
"Failed to reserve an SRB extension\n");
271 Parameters.MessageBased.PhysicalDeviceObject = DeviceExtension->PhysicalDevice;
272 Parameters.MessageBased.ConnectionContext.InterruptMessageTable = &DeviceExtension->MessageInfo;
274 Parameters.MessageBased.ServiceContext = DeviceExtension;
283 DPRINT1(
"IoConnectInterruptEx() failed (Status 0x%08lx)\n",
Status);
290 DeviceExtension->Interrupt = (
PKINTERRUPT)DeviceExtension->MessageInfo;
291 DeviceExtension->MessageInfo =
NULL;
293 DPRINT1(
"Adapter fell back to a line interrupt\n");
297 DeviceExtension->MessageInterrupts =
TRUE;
298 DeviceExtension->InterruptIrql = DeviceExtension->MessageInfo->UnifiedIrql;
301 if (DeviceExtension->MessageInfo->MessageCount > 0)
302 DeviceExtension->Interrupt = DeviceExtension->MessageInfo->MessageInfo[0].InterruptObject;
304 DPRINT1(
"Connected %lu message interrupts at IRQL %lu\n",
305 DeviceExtension->MessageInfo->MessageCount,
306 DeviceExtension->InterruptIrql);
324 DPRINT(
"PortFdoConnectInterrupt(%p)\n",
328 if (DeviceExtension->AllocatedResources ==
NULL ||
329 DeviceExtension->TranslatedResources ==
NULL)
336 if (DeviceExtension->Miniport.PortConfig.HwMSInterruptRoutine !=
NULL)
348 DPRINT(
"GetResourceListInterrupt() failed (Status 0x%08lx)\n",
Status);
371 DeviceExtension->InterruptIrql =
Irql;
375 DPRINT1(
"IoConnectInterrupt() failed (Status 0x%08lx)\n",
Status);
389 DPRINT(
"PortFdoDisconnectInterrupt(%p)\n", DeviceExtension);
391 if (DeviceExtension->MessageInterrupts)
394 Parameters.ConnectionContext.InterruptMessageTable = DeviceExtension->MessageInfo;
397 DeviceExtension->MessageInterrupts =
FALSE;
398 DeviceExtension->MessageInfo =
NULL;
400 else if (DeviceExtension->Interrupt !=
NULL)
405 DeviceExtension->Interrupt =
NULL;
406 DeviceExtension->InterruptIrql = 0;
420 DPRINT1(
"PortFdoStartMiniport(%p)\n", DeviceExtension);
427 DPRINT1(
"The bus this adapter sits on is unknown, trying Internal\n");
434 if (InitData ==
NULL)
441 DeviceExtension->HwInitData = InitData;
449 DPRINT1(
"MiniportInitialize() failed (Status 0x%08lx)\n",
Status);
457 DPRINT1(
"MiniportFindAdapter() failed (Status 0x%08lx)\n",
Status);
462 if (!DeviceExtension->RequestReferenceLookasideInitialized)
476 DeviceExtension->RequestReferenceLookasideInitialized =
TRUE;
487 DPRINT1(
"PortFdoConnectInterrupt() failed (Status 0x%08lx)\n",
Status);
492 DeviceExtension->OutstandingRequestMax = DeviceExtension->Miniport.PortConfig.MaxNumberOfIO;
498 DPRINT1(
"MiniportHwInitialize() failed (Status 0x%08lx)\n",
Status);
503 if (DeviceExtension->HwPassiveInitRoutine !=
NULL)
505 DPRINT1(
"Calling HwPassiveInitRoutine()\n");
506 if (!DeviceExtension->HwPassiveInitRoutine(&DeviceExtension->Miniport.MiniportExtension->HwDeviceExtension))
508 DPRINT1(
"HwPassiveInitRoutine() failed\n");
527 DPRINT1(
"PortFdoStartDevice(%p %p)\n",
528 DeviceExtension,
Irp);
536 if (DeviceExtension->PnpState ==
dsStopped)
549 DPRINT1(
"Lower device failed the IRP (Status 0x%08lx)\n",
Status);
558 if (
Stack->Parameters.StartDevice.AllocatedResources !=
NULL &&
559 Stack->Parameters.StartDevice.AllocatedResourcesTranslated !=
NULL)
562 Stack->Parameters.StartDevice.AllocatedResources);
563 if (DeviceExtension->AllocatedResources ==
NULL)
567 Stack->Parameters.StartDevice.AllocatedResourcesTranslated);
568 if (DeviceExtension->TranslatedResources ==
NULL)
574 (
PGUID)&GUID_BUS_INTERFACE_STANDARD,
577 &DeviceExtension->BusInterface,
582 DPRINT1(
"Context: %p\n", DeviceExtension->BusInterface.Context);
583 DeviceExtension->BusInitialized =
TRUE;
590 DPRINT1(
"FdoStartMiniport() failed (Status 0x%08lx)\n",
Status);
629 ULONG RetryCount = 0;
637 if (SenseBuffer ==
NULL)
646 if (ReportLunsData ==
NULL)
670 DPRINT(
"IoBuildDeviceIoControlRequest() failed\n");
715 DPRINT1(
"PortSendReportLuns(): Waiting for the driver to process request...\n");
724 DPRINT(
"PortSendReportLuns(): Request processed by driver, status = 0x%08X\n",
Status);
747 if (ReportLunsData ==
NULL)
749 DPRINT1(
"Cannot reallocate REPORT_LUNS buffer\n");
754 BufferReallocated =
TRUE;
759 Reported =
min(Reported,
772 if (*LunCount >= LunListSize)
784 DPRINT1(
"REPORT_LUNS SRB failed with SrbStatus 0x%08X Status %08X\n",
796 LunExtension = SpiGetLunExtension(DeviceExtension,
802 LunExtension->Flags &= ~LUNEX_FROZEN_QUEUE;
821 if (BufferReallocated)
838 DPRINT1(
"Data overrun at TargetId %d, %d bytes needed\n",
845 if (ReportLunsData ==
NULL)
847 DPRINT1(
"Cannot reallocate REPORT_LUNS buffer\n");
853 BufferReallocated =
TRUE;
860 if ((RetryCount < 2) &&
890 DPRINT1(
"PortSendReportLuns() done with Status 0x%08X\n",
Status);
909 ULONG RetryCount = 0;
925 if (SenseBuffer ==
NULL)
949 DPRINT1(
"IoBuildDeviceIoControlRequest() failed\n");
992 DPRINT1(
"PortSendInquiry(): Waiting for the driver to process request...\n");
1001 DPRINT1(
"PortSendInquiry(): Request processed by driver, status = 0x%08X\n",
Status);
1064 if ((RetryCount < 2) &&
1093 DPRINT1(
"PortSendInquiry() done with Status 0x%08X\n",
Status);
1113 DPRINT(
"PortFdoScanBus(%p)\n", DeviceExtension);
1115 DPRINT(
"NumberOfBuses: %lu\n", DeviceExtension->Miniport.PortConfig.NumberOfBuses);
1116 DPRINT(
"MaximumNumberOfTargets: %lu\n", DeviceExtension->Miniport.PortConfig.MaximumNumberOfTargets);
1117 DPRINT(
"MaximumNumberOfLogicalUnits: %lu\n", DeviceExtension->Miniport.PortConfig.MaximumNumberOfLogicalUnits);
1120 for (Bus = 0; Bus < DeviceExtension->Miniport.PortConfig.NumberOfBuses; Bus++)
1122 DPRINT(
"Scanning bus %ld\n", Bus);
1125 for (
Target = 0;
Target < DeviceExtension->Miniport.PortConfig.MaximumNumberOfTargets;
Target++)
1129 DPRINT(
" Scanning logical unit %ld:%ld:%ld\n", Bus,
Target, 0);
1149 DPRINT(
"ProductRevisionLevel: %.4s\n",
PdoExtension->InquiryBuffer->ProductRevisionLevel);
1163 if (
Lun >= DeviceExtension->Miniport.PortConfig.MaximumNumberOfLogicalUnits)
1179 DPRINT(
"PortFdoScanBus() done!\n");
1196 ULONG PdoCount, PdoIndex = 0;
1198 DPRINT(
"PortFdoQueryBusRelations(%p %p)\n",
1203 PdoCount = DeviceExtension->PdoCount;
1205 DPRINT1(
"Units found: %lu\n", PdoCount);
1211 if (!DeviceRelations)
1220 for (PdoEntry = DeviceExtension->PdoListHead.
Flink;
1221 PdoEntry != &DeviceExtension->PdoListHead && PdoIndex < PdoCount;
1222 PdoEntry = PdoEntry->
Flink)
1244 DeviceRelations->
Count = PdoIndex;
1260 DPRINT(
"PortFdoFilterRequirements(%p %p)\n", DeviceExtension,
Irp);
1290 PdoEntry = PdoEntry->
Flink)
1483 DPRINT1(
"Bus change, invalidating bus relations\n");
1528 DPRINT1(
"PortFdoPnp(%p %p)\n",
1537 switch (
Stack->MinorFunction)
1540 DPRINT(
"IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
1545 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_REMOVE_DEVICE\n");
1549 DPRINT1(
"IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
1555 KeFlushQueuedDpcs();
1568 DPRINT1(
"IRP_MJ_PNP / IRP_MN_CANCEL_REMOVE_DEVICE\n");
1572 DPRINT1(
"IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
1580 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_STOP_DEVICE\n");
1584 DPRINT1(
"IRP_MJ_PNP / IRP_MN_CANCEL_STOP_DEVICE\n");
1588 switch (
Stack->Parameters.QueryDeviceRelations.Type)
1591 DPRINT(
" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
1596 DPRINT1(
" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
1600 DPRINT1(
" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
1601 Stack->Parameters.QueryDeviceRelations.Type);
1607 DPRINT(
"IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
1612 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE\n");
1616 DPRINT1(
"IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
1620 DPRINT1(
"IRP_MJ_PNP / IRP_MN_SURPRISE_REMOVAL\n");
1624 DPRINT1(
"IRP_MJ_PNP / Unknown IOCTL 0x%lx\n",
Stack->MinorFunction);
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
_In_ PSCSI_REQUEST_BLOCK Srb
#define IOCTL_SCSI_EXECUTE_IN
#define SENSE_BUFFER_SIZE
#define SCSI_SENSE_ILLEGAL_REQUEST
#define INQUIRYDATABUFFERSIZE
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
NTKERNELAPI NTSTATUS NTAPI IoCsqInitialize(_Out_ PIO_CSQ Csq, _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp, _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp, _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock, _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
Set up a CSQ struct to initialize the queue.
_In_opt_ PIRP _In_opt_ PVOID PeekContext
NTKERNELAPI VOID NTAPI IoCsqInsertIrp(_Inout_ PIO_CSQ Csq, _Inout_ PIRP Irp, _Out_opt_ PIO_CSQ_IRP_CONTEXT Context)
Insert an IRP into the CSQ.
NTKERNELAPI PIRP NTAPI IoCsqRemoveNextIrp(_Inout_ PIO_CSQ Csq, _In_opt_ PVOID PeekContext)
IoCsqRemoveNextIrp - Removes the next IRP from the queue.
#define STATUS_NOT_SUPPORTED
_In_ PIO_STATUS_BLOCK IoStatusBlock
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI KeRemoveQueueDpc(IN PKDPC Dpc)
struct _FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
#define SCSIOP_REPORT_LUNS
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
#define SRB_FUNCTION_EXECUTE_SCSI
#define SRB_STATUS_DATA_OVERRUN
#define SRB_STATUS_ABORTED
#define SRB_STATUS_PENDING
#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH
#define SCSI_MAXIMUM_LUNS_PER_TARGET
#define SRB_STATUS_AUTOSENSE_VALID
#define SRB_FLAGS_DATA_IN
#define SRB_STATUS_SELECTION_TIMEOUT
#define SRB_STATUS_BAD_FUNCTION
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
#define SRB_STATUS(Status)
#define SRB_STATUS_QUEUE_FROZEN
#define SRB_STATUS_NO_DEVICE
#define SRB_STATUS_SUCCESS
INTERFACE_TYPE GetBusInterface(PDEVICE_OBJECT DeviceObject)
NTSTATUS QueryBusInterface(PDEVICE_OBJECT DeviceObject, PGUID Guid, USHORT Size, USHORT Version, PBUS_INTERFACE_STANDARD Interface, PVOID InterfaceSpecificData)
PCM_RESOURCE_LIST CopyResourceList(POOL_TYPE PoolType, PCM_RESOURCE_LIST Source)
NTSTATUS GetResourceListInterrupt(PFDO_DEVICE_EXTENSION DeviceExtension, PULONG Vector, PKIRQL Irql, KINTERRUPT_MODE *InterruptMode, PBOOLEAN ShareVector, PKAFFINITY Affinity)
NTSTATUS NTAPI PortPdoScsi(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
#define TAG_SRB_EXTENSION
#define TAG_DEVICE_RELATION
#define TAG_QUEUED_REQUEST
struct _QUEUED_REQUEST_REFERENCE QUEUED_REQUEST_REFERENCE
#define TAG_REPORT_LUN_DATA
struct _REPORT_LUNS_DATA REPORT_LUNS_DATA
PHW_INITIALIZATION_DATA PortGetDriverInitData(PDRIVER_OBJECT_EXTENSION DriverExtension, INTERFACE_TYPE InterfaceType)
struct _REPORT_LUNS_DATA * PREPORT_LUNS_DATA
NDIS_STATUS NTAPI MiniportInitialize(OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, IN UINT MediumArraySize, IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE WrapperConfigurationContext)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeReleaseSpinLock(sl, irql)
#define KeLowerIrql(oldIrql)
#define KeAcquireSpinLock(sl, irql)
#define KeGetCurrentIrql()
#define InitializeListHead(ListHead)
#define KeInitializeSpinLock(sl)
VOID FASTCALL KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle)
VOID FASTCALL KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
DRIVER_DISPATCH ForwardIrpAndForget
FORCEINLINE VOID StorpCompleteRequest(_In_ PIRP Irp, _In_ UCHAR SrbStatus, _In_ NTSTATUS IrpStatus)
Completes a request with specified SRB status and IRP status.
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
Returns a pointer to the I/O manager's global configuration information structure.
VOID NTAPI ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside)
VOID NTAPI ExInitializeNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside, IN PALLOCATE_FUNCTION Allocate OPTIONAL, IN PFREE_FUNCTION Free OPTIONAL, IN ULONG Flags, IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth)
#define ExFreePoolWithTag(_P, _T)
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
struct _KINTERRUPT * PKINTERRUPT
#define UNREFERENCED_PARAMETER(P)
#define IRP_MN_SURPRISE_REMOVAL
#define IoCompleteRequest
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
NTSTATUS NTAPI IoConnectInterrupt(OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
NTSTATUS NTAPI IoConnectInterruptEx(_Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters)
VOID NTAPI IoDisconnectInterruptEx(_In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters)
KIRQL NTAPI KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
VOID NTAPI KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt, IN KIRQL OldIrql)
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
enum _INTERFACE_TYPE INTERFACE_TYPE
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
enum _KINTERRUPT_MODE KINTERRUPT_MODE
#define SRB_TYPE_STORAGE_REQUEST_BLOCK
VOID SpiGetNextRequestFromLun(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, _Inout_ PSCSI_PORT_LUN_EXTENSION LunExtension, _Inout_opt_ PKIRQL OldIrql)
static NTSTATUS PortFdoStartMiniport(_In_ PFDO_DEVICE_EXTENSION DeviceExtension)
VOID PortFlushStarvedRequests(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
Fails every queued request, for when the adapter goes away.
PPDO_DEVICE_EXTENSION FdoFindLun(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ ULONG Bus, _In_ ULONG Target, _In_ ULONG Lun)
VOID NTAPI PortFdoBusChangeDpc(_In_ PKDPC Dpc, _In_opt_ PVOID DeferredContext, _In_opt_ PVOID SystemArgument1, _In_opt_ PVOID SystemArgument2)
static VOID PortFdoReleaseInterruptLocks(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ KIRQL OldIrql)
static VOID PortFdoStopAdapter(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
Tells the miniport to stop the adapter with its interrupt service routines held off.
static VOID NTAPI PortStarvedCsqInsertIrp(_In_ PIO_CSQ Csq, _In_ PIRP Irp)
static NTSTATUS PortFdoFilterRequirements(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
static NTSTATUS PortSendInquiry(_In_ PPDO_DEVICE_EXTENSION PdoExtension)
static NTSTATUS PortFdoScanBus(_In_ PFDO_DEVICE_EXTENSION DeviceExtension)
VOID PortFreeRequestReserve(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
Releases the reserve. No request may be using it anymore.
static NTSTATUS PortSendReportLuns(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _Out_ PULONG LunCount, _Out_writes_(LunListSize) PUCHAR LunList, _In_ ULONG LunListSize)
NTSTATUS PortInitializeStarvedRequestQueue(_In_ PSTARVED_REQUEST_QUEUE Queue)
static NTSTATUS PortFdoConnectMessageInterrupt(_In_ PFDO_DEVICE_EXTENSION DeviceExtension)
Connects the adapter on message signaled interrupts, falling back to a line interrupt.
VOID PortQueueStarvedRequest(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ PIRP Irp)
Queues a request that could not allocate its private contexts.
static BOOLEAN NTAPI PortFdoMessageInterruptRoutine(_In_ PKINTERRUPT Interrupt, _In_ PVOID ServiceContext, _In_ ULONG MessageId)
static VOID NTAPI PortStarvedCsqAcquireLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
static NTSTATUS PortFdoStartDevice(_In_ PFDO_DEVICE_EXTENSION DeviceExtension, _In_ PIRP Irp)
static PPDO_DEVICE_EXTENSION FdoScanPdoList(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ ULONG Bus, _In_ ULONG Target, _In_ ULONG Lun)
Walks the PDO list for a unit, the caller keeps the list from changing.
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.
VOID NTAPI PortFdoUnlinkPdo(_Inout_ PFDO_DEVICE_EXTENSION FdoExtension, _Inout_ PPDO_DEVICE_EXTENSION PdoExtension)
static NTSTATUS PortFdoQueryBusRelations(_In_ PFDO_DEVICE_EXTENSION DeviceExtension, _Out_ PULONG_PTR Information)
static VOID PortFdoDisconnectInterrupt(_In_ PFDO_DEVICE_EXTENSION DeviceExtension)
static BOOLEAN NTAPI PortFdoInterruptRoutine(_In_ PKINTERRUPT Interrupt, _In_ PVOID ServiceContext)
VOID PortRetryStarvedRequest(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
Retries one queued request, so each completion lets exactly one through.
static KIRQL PortFdoAcquireInterruptLocks(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
Keeps every interrupt service routine of the adapter from running.
static PIRP NTAPI PortStarvedCsqPeekNextIrp(_In_ PIO_CSQ Csq, _In_ PIRP Irp, _In_ PVOID PeekContext)
VOID NTAPI PortFdoLinkPdo(_Inout_ PFDO_DEVICE_EXTENSION FdoExtension, _Inout_ PPDO_DEVICE_EXTENSION PdoExtension)
Adds a PDO where both the list lock and the interrupt service routines respect it.
static VOID NTAPI PortStarvedCsqRemoveIrp(_In_ PIO_CSQ Csq, _In_ PIRP Irp)
NTSTATUS NTAPI PortFdoScsi(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
static VOID NTAPI PortStarvedCsqCompleteCanceledIrp(_In_ PIO_CSQ Csq, _In_ PIRP Irp)
static VOID NTAPI PortStarvedCsqReleaseLock(_In_ PIO_CSQ Csq, _In_ KIRQL Irql)
VOID PortAllocateRequestReserve(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
Reserves the memory a single request needs, so IO can still be issued out of pool.
static NTSTATUS PortFdoConnectInterrupt(_In_ PFDO_DEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI PortFdoPnp(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
SCSI_ADAPTER_CONTROL_STATUS NTAPI MiniportAdapterControl(_In_ PMINIPORT Miniport, _In_ SCSI_ADAPTER_CONTROL_TYPE ControlType, _In_opt_ PVOID Parameters)
Sends one adapter control request, if the miniport claimed it.
NTSTATUS MiniportFindAdapter(_In_ PMINIPORT Miniport)
BOOLEAN MiniportHwInterrupt(_In_ PMINIPORT Miniport)
VOID NTAPI MiniportQueryAdapterControl(_In_ PMINIPORT Miniport)
Asks the miniport which adapter control requests it handles.
BOOLEAN NTAPI MiniportHwMSInterrupt(_In_ PMINIPORT Miniport, _In_ ULONG MessageId)
VOID NTAPI MiniportFreeAdapterResources(_In_ PMINIPORT Miniport)
Tells the miniport the adapter is going away.
NTSTATUS MiniportHwInitialize(_In_ PMINIPORT Miniport)
VOID NTAPI MiniportQueryUnitControl(_In_ PMINIPORT Miniport)
Asks the miniport which unit control requests it handles.
NTSTATUS PortDeletePdo(_In_ PPDO_DEVICE_EXTENSION PdoExtension)
NTSTATUS PortCreatePdo(_In_ PFDO_DEVICE_EXTENSION FdoDeviceExtension, _In_ ULONG Bus, _In_ ULONG Target, _In_ ULONG Lun, _Out_ PPDO_DEVICE_EXTENSION *PdoDeviceExtension)
PDEVICE_OBJECT Objects[1]
PDEVICE_OBJECT LowerDevice
NPAGED_LOOKASIDE_LIST RequestReferenceLookaside
EXTENSION_TYPE ExtensionType
BOOLEAN RequestReferenceLookasideInitialized
union _IO_STACK_LOCATION::@1823 Parameters
struct _IO_STACK_LOCATION::@5136::@5158 Scsi
struct _LIST_ENTRY * Flink
LUN_DESCRIPTOR LunDescriptor[1]
UCHAR SenseInfoBufferLength
#define FIELD_OFFSET(t, f)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_IO_DEVICE_ERROR
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
struct _CDB::_CDB6INQUIRY CDB6INQUIRY
struct _CDB::_REPORT_LUNS REPORT_LUNS
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
_In_ WDFIORESREQLIST RequirementsList
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
_In_ ULONG _In_ ULONG _In_ ULONG _Out_ PKIRQL _Out_ PKAFFINITY Affinity
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE InterruptMode
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE _In_ BOOLEAN ShareVector
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID ServiceContext
#define IRP_MN_CANCEL_STOP_DEVICE
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define IRP_MN_START_DEVICE
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
#define CONNECT_LINE_BASED
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
#define CONNECT_MESSAGE_BASED
struct _IO_RESOURCE_REQUIREMENTS_LIST * PIO_RESOURCE_REQUIREMENTS_LIST
#define IRP_MN_QUERY_REMOVE_DEVICE
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
*LockHandle LockHandle _Out_ PKLOCK_QUEUE_HANDLE LockHandle
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
_In_opt_ PVOID DeferredContext
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
#define ObReferenceObject