179 DPRINT1(
"Failed to reserve a request packet\n");
183 if (SrbExtensionSize == 0)
193 DPRINT1(
"Failed to reserve an SRB extension\n");
251 DPRINT(
"PortFdoConnectInterrupt(%p)\n",
255 if (DeviceExtension->AllocatedResources ==
NULL ||
256 DeviceExtension->TranslatedResources ==
NULL)
271 DPRINT(
"GetResourceListInterrupt() failed (Status 0x%08lx)\n",
Status);
294 DeviceExtension->InterruptIrql =
Irql;
298 DPRINT1(
"IoConnectInterrupt() failed (Status 0x%08lx)\n",
Status);
314 DPRINT1(
"PortFdoStartMiniport(%p)\n", DeviceExtension);
324 if (InitData ==
NULL)
333 DPRINT1(
"MiniportInitialize() failed (Status 0x%08lx)\n",
Status);
341 DPRINT1(
"MiniportFindAdapter() failed (Status 0x%08lx)\n",
Status);
349 DPRINT1(
"PortFdoConnectInterrupt() failed (Status 0x%08lx)\n",
Status);
354 DeviceExtension->OutstandingRequestMax = DeviceExtension->Miniport.PortConfig.MaxNumberOfIO;
360 DPRINT1(
"MiniportHwInitialize() failed (Status 0x%08lx)\n",
Status);
365 if (DeviceExtension->HwPassiveInitRoutine !=
NULL)
367 DPRINT1(
"Calling HwPassiveInitRoutine()\n");
368 if (!DeviceExtension->HwPassiveInitRoutine(&DeviceExtension->Miniport.MiniportExtension->HwDeviceExtension))
370 DPRINT1(
"HwPassiveInitRoutine() failed\n");
389 DPRINT1(
"PortFdoStartDevice(%p %p)\n",
390 DeviceExtension,
Irp);
398 if (DeviceExtension->PnpState ==
dsStopped)
411 DPRINT1(
"Lower device failed the IRP (Status 0x%08lx)\n",
Status);
420 if (
Stack->Parameters.StartDevice.AllocatedResources !=
NULL &&
421 Stack->Parameters.StartDevice.AllocatedResourcesTranslated !=
NULL)
424 Stack->Parameters.StartDevice.AllocatedResources);
425 if (DeviceExtension->AllocatedResources ==
NULL)
429 Stack->Parameters.StartDevice.AllocatedResourcesTranslated);
430 if (DeviceExtension->TranslatedResources ==
NULL)
436 (
PGUID)&GUID_BUS_INTERFACE_STANDARD,
439 &DeviceExtension->BusInterface,
444 DPRINT1(
"Context: %p\n", DeviceExtension->BusInterface.Context);
445 DeviceExtension->BusInitialized =
TRUE;
452 DPRINT1(
"FdoStartMiniport() failed (Status 0x%08lx)\n",
Status);
489 ULONG RetryCount = 0;
497 if (SenseBuffer ==
NULL)
506 if (ReportLunsData ==
NULL)
530 DPRINT(
"IoBuildDeviceIoControlRequest() failed\n");
575 DPRINT1(
"PortSendReportLuns(): Waiting for the driver to process request...\n");
584 DPRINT(
"PortSendReportLuns(): Request processed by driver, status = 0x%08X\n",
Status);
604 DPRINT1(
"REPORT_LUNS SRB failed with SrbStatus 0x%08X Status %08X\n",
616 LunExtension = SpiGetLunExtension(DeviceExtension,
622 LunExtension->Flags &= ~LUNEX_FROZEN_QUEUE;
641 if (BufferReallocated)
657 DPRINT1(
"Data overrun at TargetId %d, %d bytes needed\n",
664 if (ReportLunsData ==
NULL)
666 DPRINT1(
"Cannot reallocate REPORT_LUNS buffer\n");
672 BufferReallocated =
TRUE;
679 if ((RetryCount < 2) &&
709 DPRINT1(
"PortSendReportLuns() done with Status 0x%08X\n",
Status);
728 ULONG RetryCount = 0;
744 if (SenseBuffer ==
NULL)
768 DPRINT1(
"IoBuildDeviceIoControlRequest() failed\n");
811 DPRINT1(
"PortSendInquiry(): Waiting for the driver to process request...\n");
820 DPRINT1(
"PortSendInquiry(): Request processed by driver, status = 0x%08X\n",
Status);
883 if ((RetryCount < 2) &&
912 DPRINT1(
"PortSendInquiry() done with Status 0x%08X\n",
Status);
929 DPRINT(
"PortFdoScanBus(%p)\n", DeviceExtension);
931 DPRINT(
"NumberOfBuses: %lu\n", DeviceExtension->Miniport.PortConfig.NumberOfBuses);
932 DPRINT(
"MaximumNumberOfTargets: %lu\n", DeviceExtension->Miniport.PortConfig.MaximumNumberOfTargets);
933 DPRINT(
"MaximumNumberOfLogicalUnits: %lu\n", DeviceExtension->Miniport.PortConfig.MaximumNumberOfLogicalUnits);
936 for (Bus = 0; Bus < DeviceExtension->Miniport.PortConfig.NumberOfBuses; Bus++)
938 DPRINT(
"Scanning bus %ld\n", Bus);
941 for (
Target = 0;
Target < DeviceExtension->Miniport.PortConfig.MaximumNumberOfTargets;
Target++)
945 DPRINT(
" Scanning logical unit %ld:%ld:%ld\n", Bus,
Target, 0);
963 DPRINT(
"ProductRevisionLevel: %.4s\n",
PdoExtension->InquiryBuffer->ProductRevisionLevel);
970 for (
Lun = 1;
Lun < DeviceExtension->Miniport.PortConfig.MaximumNumberOfLogicalUnits;
Lun++)
982 DPRINT(
"PortFdoScanBus() done!\n");
999 ULONG PdoCount, PdoIndex = 0;
1001 DPRINT(
"PortFdoQueryBusRelations(%p %p)\n",
1006 PdoCount = DeviceExtension->PdoCount;
1008 DPRINT1(
"Units found: %lu\n", PdoCount);
1014 if (!DeviceRelations)
1023 for (PdoEntry = DeviceExtension->PdoListHead.
Flink;
1024 PdoEntry != &DeviceExtension->PdoListHead && PdoIndex < PdoCount;
1025 PdoEntry = PdoEntry->
Flink)
1047 DeviceRelations->
Count = PdoIndex;
1063 DPRINT(
"PortFdoFilterRequirements(%p %p)\n", DeviceExtension,
Irp);
1092 PdoEntry = PdoEntry->
Flink)
1148 DPRINT1(
"PortFdoPnp(%p %p)\n",
1157 switch (
Stack->MinorFunction)
1160 DPRINT(
"IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
1165 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_REMOVE_DEVICE\n");
1169 DPRINT1(
"IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
1176 DPRINT1(
"IRP_MJ_PNP / IRP_MN_CANCEL_REMOVE_DEVICE\n");
1180 DPRINT1(
"IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
1184 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_STOP_DEVICE\n");
1188 DPRINT1(
"IRP_MJ_PNP / IRP_MN_CANCEL_STOP_DEVICE\n");
1192 switch (
Stack->Parameters.QueryDeviceRelations.Type)
1195 DPRINT(
" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
1200 DPRINT1(
" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
1204 DPRINT1(
" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
1205 Stack->Parameters.QueryDeviceRelations.Type);
1211 DPRINT(
"IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
1216 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE\n");
1220 DPRINT1(
"IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
1224 DPRINT1(
"IRP_MJ_PNP / IRP_MN_SURPRISE_REMOVAL\n");
1228 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
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
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 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
#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 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 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)
#define ExFreePoolWithTag(_P, _T)
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
#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)
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)
enum _INTERFACE_TYPE INTERFACE_TYPE
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
enum _KINTERRUPT_MODE KINTERRUPT_MODE
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)
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)
static NTSTATUS PortSendReportLuns(_In_ PPDO_DEVICE_EXTENSION PdoExtension, _Out_ PULONG LunCount)
VOID PortFreeRequestReserve(_In_ PFDO_DEVICE_EXTENSION FdoExtension)
Releases the reserve. No request may be using it anymore.
NTSTATUS PortInitializeStarvedRequestQueue(_In_ PSTARVED_REQUEST_QUEUE Queue)
VOID PortQueueStarvedRequest(_In_ PFDO_DEVICE_EXTENSION FdoExtension, _In_ PIRP Irp)
Queues a request that could not allocate its private contexts.
static VOID NTAPI PortStarvedCsqAcquireLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
static NTSTATUS PortFdoStartDevice(_In_ PFDO_DEVICE_EXTENSION DeviceExtension, _In_ PIRP Irp)
static NTSTATUS PortFdoQueryBusRelations(_In_ PFDO_DEVICE_EXTENSION DeviceExtension, _Out_ PULONG_PTR Information)
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 PIRP NTAPI PortStarvedCsqPeekNextIrp(_In_ PIO_CSQ Csq, _In_ PIRP Irp, _In_ PVOID PeekContext)
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)
NTSTATUS MiniportFindAdapter(_In_ PMINIPORT Miniport)
BOOLEAN MiniportHwInterrupt(_In_ PMINIPORT Miniport)
NTSTATUS MiniportHwInitialize(_In_ PMINIPORT Miniport)
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
union _IO_STACK_LOCATION::@1814 Parameters
struct _IO_STACK_LOCATION::@5020::@5042 Scsi
struct _LIST_ENTRY * Flink
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_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_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
_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 IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
struct _IO_RESOURCE_REQUIREMENTS_LIST * PIO_RESOURCE_REQUIREMENTS_LIST
#define IRP_MN_QUERY_REMOVE_DEVICE
*LockHandle LockHandle _Out_ PKLOCK_QUEUE_HANDLE LockHandle
#define ObReferenceObject