PciIdeXFdoStartDevice函数是用来处理即插即用的启动设备消息,主要设置了DMA操作和保存设备端口的基地址,这里就是启动PCIIDE的物理设备,具体实现代码如下:
#001 static NTSTATUS
#002 PciIdeXFdoStartDevice(
#003 IN PDEVICE_OBJECT DeviceObject,
#004 IN PIRP Irp)
#005 {
#006 PPCIIDEX_DRIVER_EXTENSION DriverExtension;
#007 PFDO_DEVICE_EXTENSION DeviceExtension;
#008 PCM_RESOURCE_LIST ResourceList;
#009 NTSTATUS Status;
#010
#011 DPRINT("PciIdeXStartDevice(%p %p)/n", DeviceObject, Irp);
#012
获取驱动程序扩展对象。
#013 DriverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject, DeviceObject->DriverObject);
#014 ASSERT(DriverExtension);
#015 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
#016 ASSERT(DeviceExtension);
#017 ASSERT(DeviceExtension->Common.IsFDO);
#018
获取这个控制器的属性。
#019 DeviceExtension->Properties.Size = sizeof(IDE_CONTROLLER_PROPERTIES);
#020 DeviceExtension->Properties.ExtensionSize = DriverExtension->MiniControllerExtensionSize;
#021 Status = DriverExtension->HwGetControllerProperties(
#022 DeviceExtension->MiniControllerExtension,
#023 &DeviceExtension->Properties);
#024 if (!NT_SUCCESS(Status))
#025 return Status;
#026
设置这个设备的DMA操作函数。
#027 DriverExtension->HwUdmaModesSupported = DeviceExtension->Properties.PciIdeUdmaModesSupported;
#028 if (!DriverExtension->HwUdmaModesSupported)
#029 /* This method is optional, so provide our own one */
#030 DriverExtension->HwUdmaModesSupported = PciIdeXUdmaModesSupported;
#031
获取当前设备栈设备,并且判断设备是否合法,然后保存到这个设备的基地址到总线基地址里。
#032 /* Get bus master port base, if any */
#033 ResourceList = IoGetCurrentIrpStackLocation(Irp)->Parameters.StartDevice.AllocatedResources;
#034 if (ResourceList
#035 && ResourceList->Count == 1
#036 && ResourceList->List[0].PartialResourceList.Count == 1
#037 && ResourceList->List[0].PartialResourceList.Version == 1
#038 && ResourceList->List[0].PartialResourceList.Revision == 1
#039 && ResourceList->List[0].PartialResourceList.PartialDescriptors[0].Type == CmResourceTypePort
#040 && ResourceList->List[0].PartialResourceList.PartialDescriptors[0].u.Port.Length == 16)
#041 {
#042 DeviceExtension->BusMasterPortBase = ResourceList->List[0].PartialResourceList.PartialDescriptors[0].u.Port.Start;
#043 }
#044 return STATUS_SUCCESS;
#045 }
10.3.5 IDE_CONTROLLER_PROPERTIES结构
IDE_CONTROLLER_PROPERTIES结构是保存一个IDE控制器属性和操作函数,如下:
#001 typedef struct _IDE_CONTROLLER_PROPERTIES
#002 {
本结构的大小字节数。
#003 ULONG Size;
小端口驱动程序需要的内存大小。
#004 ULONG ExtensionSize;
IDE控制器支持的传送模式。
#005 ULONG SupportedTransferMode[MAX_IDE_CHANNEL][MAX_IDE_DEVICE];
PCI的IDE通道是否有效函数。
#006 PCIIDE_CHANNEL_ENABLED PciIdeChannelEnabled;
PCI的两个通道是否同时使用,还是只能分别使用。
#007 PCIIDE_SYNC_ACCESS_REQUIRED PciIdeSyncAccessRequired;
PCI的IDE设备的传输模式选择。
#008 PCIIDE_TRANSFER_MODE_SELECT_FUNC PciIdeTransferModeSelect;
是否需要清除主控位标识。
#009 BOOLEAN IgnoreActiveBitForAtaDevice;
如果设置为TRUE,就清除中断控制位。
#010 BOOLEAN AlwaysClearBusMasterInterrupt;
指向一个DMA是否使用的函数。
#011 PCIIDE_USEDMA_FUNC PciIdeUseDma;
指明设备对象的对齐方式。
#012 ULONG AlignmentRequirement;
保存是否只使用PIO的工作方式。
#013 ULONG DefaultPIO;
保存DMA的支持模式。
#014 PCIIDE_UDMA_MODES_SUPPORTED PciIdeUdmaModesSupported;
#015 } IDE_CONTROLLER_PROPERTIES, *PIDE_CONTROLLER_PROPERTIES;