}
+static
+NTSTATUS
+PortFdoFilterRequirements(
+ PFDO_DEVICE_EXTENSION DeviceExtension,
+ PIRP Irp)
+{
+ PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
+
+ DPRINT1("PortFdoFilterRequirements(%p %p)\n", DeviceExtension, Irp);
+
+ /* Get the bus number and the slot number */
+ RequirementsList =(PIO_RESOURCE_REQUIREMENTS_LIST)Irp->IoStatus.Information;
+ if (RequirementsList != NULL)
+ {
+ DeviceExtension->BusNumber = RequirementsList->BusNumber;
+ DeviceExtension->SlotNumber = RequirementsList->SlotNumber;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+
NTSTATUS
NTAPI
PortFdoPnp(
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* 0x0d */
DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
+ PortFdoFilterRequirements(DeviceExtension, Irp);
return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
case IRP_MN_QUERY_PNP_DEVICE_STATE: /* 0x14 */
/* FUNCTIONS ******************************************************************/
+static
+NTSTATUS
+InitializeConfiguration(
+ _In_ PPORT_CONFIGURATION_INFORMATION PortConfig,
+ _In_ PHW_INITIALIZATION_DATA InitData,
+ _In_ ULONG BusNumber,
+ _In_ ULONG SlotNumber)
+{
+ PCONFIGURATION_INFORMATION ConfigInfo;
+ ULONG i;
+
+ DPRINT1("InitializeConfiguration(%p %p %lu %lu)\n",
+ PortConfig, InitData, BusNumber, SlotNumber);
+
+ /* Get the configurration information */
+ ConfigInfo = IoGetConfigurationInformation();
+
+ /* Initialize the port configuration */
+ RtlZeroMemory(PortConfig,
+ sizeof(PORT_CONFIGURATION_INFORMATION));
+
+ PortConfig->Length = sizeof(PORT_CONFIGURATION_INFORMATION);
+ PortConfig->SystemIoBusNumber = BusNumber;
+ PortConfig->SlotNumber = SlotNumber;
+ PortConfig->AdapterInterfaceType = InitData->AdapterInterfaceType;
+
+ PortConfig->MaximumTransferLength = -1; //SP_UNINITIALIZED_VALUE;
+ PortConfig->DmaChannel = -1; //SP_UNINITIALIZED_VALUE;
+ PortConfig->DmaPort = -1; //SP_UNINITIALIZED_VALUE;
+
+ PortConfig->InterruptMode = LevelSensitive;
+
+ PortConfig->Master = TRUE;
+ PortConfig->AtdiskPrimaryClaimed = ConfigInfo->AtDiskPrimaryAddressClaimed;
+ PortConfig->AtdiskSecondaryClaimed = ConfigInfo->AtDiskSecondaryAddressClaimed;
+ PortConfig->Dma32BitAddresses = TRUE;
+ PortConfig->DemandMode = FALSE;
+ PortConfig->MapBuffers = InitData->MapBuffers;
+
+ PortConfig->NeedPhysicalAddresses = TRUE;
+ PortConfig->TaggedQueuing = TRUE;
+ PortConfig->AutoRequestSense = TRUE;
+ PortConfig->MultipleRequestPerLu = TRUE;
+ PortConfig->ReceiveEvent = InitData->ReceiveEvent;
+ PortConfig->RealModeInitialized = FALSE;
+ PortConfig->BufferAccessScsiPortControlled = TRUE;
+ PortConfig->MaximumNumberOfTargets = 128;
+
+ PortConfig->SpecificLuExtensionSize = InitData->SpecificLuExtensionSize;
+ PortConfig->SrbExtensionSize = InitData->SrbExtensionSize;
+ PortConfig->MaximumNumberOfLogicalUnits = 1;
+ PortConfig->WmiDataProvider = TRUE;
+
+ PortConfig->NumberOfAccessRanges = InitData->NumberOfAccessRanges;
+ DPRINT1("NumberOfAccessRanges: %lu\n", PortConfig->NumberOfAccessRanges);
+ if (PortConfig->NumberOfAccessRanges != 0)
+ {
+ PortConfig->AccessRanges = ExAllocatePoolWithTag(NonPagedPool,
+ PortConfig->NumberOfAccessRanges * sizeof(ACCESS_RANGE),
+ TAG_ACCRESS_RANGE);
+ if (PortConfig->AccessRanges == NULL)
+ return STATUS_NO_MEMORY;
+
+ RtlZeroMemory(PortConfig->AccessRanges,
+ PortConfig->NumberOfAccessRanges * sizeof(ACCESS_RANGE));
+ }
+
+ for (i = 0; i < 7; i++)
+ PortConfig->InitiatorBusId[i] = 0xff;
+
+ return STATUS_SUCCESS;
+}
+
+
NTSTATUS
MiniportInitialize(
_In_ PMINIPORT Miniport,
{
PMINIPORT_DEVICE_EXTENSION MiniportExtension;
ULONG Size;
+ NTSTATUS Status;
DPRINT1("MiniportInitialize(%p %p %p)\n",
Miniport, DeviceExtension, InitData);
MiniportExtension->Miniport = Miniport;
Miniport->MiniportExtension = MiniportExtension;
- return STATUS_SUCCESS;
+ /* Initialize the port configuration */
+ Status = InitializeConfiguration(&Miniport->PortConfig,
+ InitData,
+ DeviceExtension->BusNumber,
+ DeviceExtension->SlotNumber);
+
+ return Status;
}
NULL,
NULL,
NULL,
- NULL,
+ &Miniport->PortConfig,
&Reserved);
DPRINT1("HwFindAdapter() returned %lu\n", Result);