34 DPRINT(
"FdoSendInquiry() called\n");
41 if (InquiryBuffer ==
NULL)
45 if (SenseBuffer ==
NULL)
70 DPRINT(
"IoBuildDeviceIoControlRequest() failed\n");
85 Srb.Lun = LunExtension->
Lun;
91 Srb.SenseInfoBuffer = SenseBuffer;
94 Srb.DataBuffer = InquiryBuffer;
113 DPRINT(
"FdoSendInquiry(): Waiting for the driver to process request...\n");
122 DPRINT(
"FdoSendInquiry(): Request processed by driver, status = 0x%08X\n",
Status);
137 DPRINT(
"Inquiry SRB failed with SrbStatus 0x%08X\n",
Srb.SrbStatus);
145 DPRINT(
"FdoSendInquiry(): the queue is frozen at TargetId %d\n",
Srb.TargetId);
185 if ((RetryCount < 2) &&
215 DPRINT(
"FdoSendInquiry() done with Status 0x%08X\n",
Status);
226 UINT32 totalLUNs = PortExtension->TotalLUCount;
228 DPRINT(
"FdoScanAdapter() called\n");
231 for (
UINT8 pathId = 0; pathId < PortExtension->NumberOfBuses; pathId++)
233 DPRINT(
" Scanning bus/pathID %u\n", pathId);
239 for (
UINT8 targetId = 0;
240 targetId < PortExtension->PortConfig->MaximumNumberOfTargets;
252 for (
UINT8 lun = 0; lun < PortExtension->MaxLunCount; lun++)
298 DPRINT(
"Add PDO to list: PDO: %p, FDOExt: %p, PDOExt: %p\n", lunPDO, PortExtension, lunExt);
321 DPRINT(
"FdoScanAdapter(): Found device of type %d at bus %d tid %d lun %d\n",
322 InquiryData->
DeviceType, pathId, targetId, lun);
326 DPRINT1(
"SCSIPORT: created lun device: %p Status: %x\n", lunPDO,
status);
349 PortExtension->TotalLUCount = totalLUNs;
370 if (DeviceExtension->HwInterrupt ==
NULL ||
374 DeviceExtension->InterruptCount = 0;
376 DPRINT1(
"Interrupt Count: 0\n");
387 ULONG InterruptVector[2],
i, MappedIrq[2];
388 KIRQL Dirql[2], MaxDirql;
400 DeviceExtension->InterruptCount =
404 for (
i = 0;
i < DeviceExtension->InterruptCount;
i++)
409 DeviceExtension->InterruptLevel[
i], InterruptVector[
i], &Dirql[
i],
413 if (DeviceExtension->InterruptCount == 1 || Dirql[0] > Dirql[1])
422 for (
i = 0;
i < DeviceExtension->InterruptCount;
i++)
428 InterruptShareable =
TRUE;
432 InterruptShareable =
FALSE;
438 &DeviceExtension->IrqLock,
439 MappedIrq[
i], Dirql[
i],
448 DPRINT1(
"Could not connect interrupt %d\n", InterruptVector[
i]);
449 DeviceExtension->Interrupt[
i] =
NULL;
458 DeviceExtension->IoAddress = ((*(PortConfig->
AccessRanges))[0]).RangeStart.LowPart;
460 DPRINT(
"Io Address %x\n", DeviceExtension->IoAddress);
467 DeviceExtension->ActiveRequestCounter = -1;
470 if (DeviceExtension->AdapterObject !=
NULL && PortConfig->
Master &&
473 DeviceExtension->MapRegisters =
TRUE;
477 DeviceExtension->MapRegisters =
FALSE;
484 DeviceExtension->Interrupt[0], DeviceExtension->HwInitialize,
485 DeviceExtension->MiniPortDeviceExtension))
487 DPRINT1(
"HwInitialize() failed!\n");
512 if (DeviceExtension->InterfaceName.Buffer)
521 WCHAR dosNameBuffer[12];
524 swprintf(dosNameBuffer,
L"\\??\\Scsi%lu:", DeviceExtension->PortNumber);
530 if (DeviceExtension->DeviceStarted)
537 while (DeviceExtension->InterruptCount)
539 if (DeviceExtension->Interrupt[--DeviceExtension->InterruptCount])
544 if (DeviceExtension->Buses)
546 for (
UINT8 pathId = 0; pathId < DeviceExtension->NumberOfBuses; pathId++)
561 if (DeviceExtension->PortConfig)
567 if (DeviceExtension->SrbExtensionBuffer !=
NULL && DeviceExtension->CommonBufferLength != 0)
569 if (!DeviceExtension->AdapterObject)
576 DeviceExtension->CommonBufferLength,
577 DeviceExtension->PhysicalAddress,
578 DeviceExtension->SrbExtensionBuffer,
584 if (DeviceExtension->SrbInfo !=
NULL)
588 while (DeviceExtension->MappedAddressList !=
NULL)
591 DeviceExtension->MappedAddressList->NumberOfBytes);
593 PVOID ptr = DeviceExtension->MappedAddressList;
594 DeviceExtension->MappedAddressList = DeviceExtension->MappedAddressList->NextMappedAddress;
608 WCHAR dosNameBuffer[12];
616 swprintf(dosNameBuffer,
L"\\??\\Scsi%u:", PortExtension->PortNumber);
633 &StoragePortClassGuid,
635 &PortExtension->InterfaceName);
636 DPRINT(
"IoRegisterDeviceInterface status: %x, InterfaceName: %wZ\n",
637 status, &PortExtension->InterfaceName);
644 PortExtension->DeviceStarted =
TRUE;
661 DPRINT(
"Found %u PD objects, FDOExt: %p\n", PortExtension->TotalLUCount, PortExtension);
672 if (!deviceRelations)
674 Irp->IoStatus.Information = 0;
680 deviceRelations->
Count = 0;
682 for (
UINT8 pathId = 0; pathId < PortExtension->NumberOfBuses; pathId++)
688 lunEntry = lunEntry->
Flink)
698 ASSERT(deviceRelations->
Count == PortExtension->TotalLUCount);
713 static WCHAR GenScsiAdapterId[] =
L"GEN_SCSIADAPTER";
714 PWCHAR Ids = *PwIds, NewIds;
762 ASSERT(portExt->Common.IsFDO);
784 Irp->IoStatus.Information = 0;
#define KeRaiseIrql(irql, oldIrql)
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE InterruptMode
#define STATUS_INSUFFICIENT_RESOURCES
#define KeLowerIrql(oldIrql)
_In_ ULONG _In_ ULONG _In_ ULONG Length
PDEVICE_OBJECT DeviceObject
KSERVICE_ROUTINE ScsiPortIsr
VOID NTAPI IoStartTimer(IN PDEVICE_OBJECT DeviceObject)
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
#define SRB_STATUS_AUTOSENSE_VALID
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PDEVICE_OBJECT Objects[1]
PDEVICE_OBJECT LowerDevice
NTSTATUS NTAPI IoDeleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName)
#define STATUS_INVALID_DEVICE_REQUEST
#define SRB_STATUS_NO_DEVICE
#define SCSI_PORT_SCAN_IN_PROGRESS
IO_DPC_ROUTINE ScsiPortDpcForIsr
#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH
#define InsertTailList(ListHead, Entry)
_NullNull_terminated_ WCHAR * PZZWSTR
#define SRB_FLAGS_DATA_IN
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define SCSI_PORT_NOTIFICATION_NEEDED
void __cdecl __debugbreak(void)
#define SRB_STATUS(Status)
#define SENSE_BUFFER_SIZE
#define STATUS_IO_DEVICE_ERROR
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
_In_ PDEVICE_OBJECT DeviceObject
static NTSTATUS FdoHandleQueryCompatibleId(_Inout_ PZZWSTR *PwIds)
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)
VOID NTAPI IoStopTimer(PDEVICE_OBJECT DeviceObject)
VOID SpiGetNextRequestFromLun(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, _Inout_ PSCSI_PORT_LUN_EXTENSION LunExtension, _Inout_opt_ PKIRQL OldIrql)
_In_ PVOID _In_ ULONG Event
#define INQUIRYDATABUFFERSIZE
enum _KINTERRUPT_MODE KINTERRUPT_MODE
VOID NTAPI IoDisconnectInterrupt(PKINTERRUPT InterruptObject)
#define IoCompleteRequest
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
UCHAR DeviceTypeQualifier
NTHALAPI ULONG NTAPI HalGetInterruptVector(INTERFACE_TYPE, ULONG, ULONG, ULONG, PKIRQL, PKAFFINITY)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
struct _LIST_ENTRY * Flink
#define SRB_STATUS_BAD_FUNCTION
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
#define NT_SUCCESS(StatCode)
NTSTATUS FdoStartAdapter(_In_ PSCSI_PORT_DEVICE_EXTENSION PortExtension)
#define KeAcquireSpinLock(sl, irql)
#define IRP_MN_START_DEVICE
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
_In_ ULONG _In_ ULONG _In_ ULONG _Out_ PKIRQL _Out_ PKAFFINITY Affinity
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define SRB_STATUS_DATA_OVERRUN
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
#define ExAllocatePoolWithTag(hernya, size, tag)
#define SRB_STATUS_QUEUE_FROZEN
#define DEVICE_QUALIFIER_NOT_SUPPORTED
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define SRB_STATUS_SELECTION_TIMEOUT
VOID FdoScanAdapter(_In_ PSCSI_PORT_DEVICE_EXTENSION PortExtension)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IOCTL_SCSI_EXECUTE_IN
static NTSTATUS FdoSendInquiry(_In_ PDEVICE_OBJECT DeviceObject)
static NTSTATUS FdoHandleDeviceRelations(_In_ PSCSI_PORT_DEVICE_EXTENSION PortExtension, _Inout_ PIRP Irp)
FORCEINLINE PCHAR GetIRPMinorFunctionString(UCHAR MinorFunction)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS FdoRemoveAdapter(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName)
#define KeInitializeEvent(pEvt, foo, foo2)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID NTAPI MmUnmapIoSpace(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes)
NTSTATUS RegistryInitAdapterKey(_Inout_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension)
static OUT PIO_STATUS_BLOCK IoStatusBlock
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IoSkipCurrentIrpStackLocation(Irp)
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)
SCSI_PORT_COMMON_EXTENSION Common
#define ObReferenceObject
#define SRB_FUNCTION_EXECUTE_SCSI
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
#define SRB_STATUS_SUCCESS
BOOLEAN NTAPI KeSynchronizeExecution(IN OUT PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext OPTIONAL)
NTSTATUS FdoDispatchPnp(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
#define RtlCopyMemory(Destination, Source, Length)
PSCSI_PORT_LUN_EXTENSION GetLunByPath(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
#define ExFreePoolWithTag(_P, _T)
struct _CDB::_CDB6INQUIRY CDB6INQUIRY
PDEVICE_OBJECT PdoCreateLunDevice(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension)
IN PSCSI_REQUEST_BLOCK Srb
#define STATUS_ADAPTER_HARDWARE_ERROR
#define SCSI_SENSE_ILLEGAL_REQUEST
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
#define SCSI_PORT_DISCONNECT_ALLOWED
static SERVICE_STATUS status
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define LUNEX_FROZEN_QUEUE
VOID NTAPI HalFreeCommonBuffer(IN PADAPTER_OBJECT AdapterObject, IN ULONG Length, IN PHYSICAL_ADDRESS LogicalAddress, IN PVOID VirtualAddress, IN BOOLEAN CacheEnabled)
NTSTATUS FdoCallHWInitialize(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension)
Calls HwInitialize routine of the miniport and sets up interrupts Should be called inside ScsiPortIni...