reactos操作系统实现(116)
来源:互联网 发布:程序员简单的周计划表 编辑:程序博客网 时间:2024/04/28 16:02
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 ULONGSupportedTransferMode[MAX_IDE_CHANNEL][MAX_IDE_DEVICE];
PCI的IDE通道是否有效函数。
#006 PCIIDE_CHANNEL_ENABLEDPciIdeChannelEnabled;
PCI的两个通道是否同时使用,还是只能分别使用。
#007 PCIIDE_SYNC_ACCESS_REQUIRED PciIdeSyncAccessRequired;
PCI的IDE设备的传输模式选择。
#008 PCIIDE_TRANSFER_MODE_SELECT_FUNC PciIdeTransferModeSelect;
是否需要清除主控位标识。
#009 BOOLEANIgnoreActiveBitForAtaDevice;
如果设置为TRUE,就清除中断控制位。
#010 BOOLEANAlwaysClearBusMasterInterrupt;
指向一个DMA是否使用的函数。
#011 PCIIDE_USEDMA_FUNCPciIdeUseDma;
指明设备对象的对齐方式。
#012 ULONGAlignmentRequirement;
保存是否只使用PIO的工作方式。
#013 ULONG DefaultPIO;
保存DMA的支持模式。
#014 PCIIDE_UDMA_MODES_SUPPORTED PciIdeUdmaModesSupported;
#015 } IDE_CONTROLLER_PROPERTIES,*PIDE_CONTROLLER_PROPERTIES;
- reactos操作系统实现(116)
- reactos操作系统实现(1)
- reactos操作系统实现(2)
- reactos操作系统实现(3)
- reactos操作系统实现(4)
- reactos操作系统实现(5)
- reactos操作系统实现(6)
- reactos操作系统实现(7)
- reactos操作系统实现(8)
- reactos操作系统实现(9)
- reactos操作系统实现(10)
- reactos操作系统实现(11)
- reactos操作系统实现(12)
- reactos操作系统实现(13)
- reactos操作系统实现(14)
- reactos操作系统实现(15)
- reactos操作系统实现(16)
- reactos操作系统实现(17)
- textarea在IE、Firefox下统一效果的解决方案
- installshield mysql
- 事务隔离级别-转
- 贝叶斯理论
- uCOS-II移植的一点心得
- reactos操作系统实现(116)
- WHERE 和HAVING的区别
- 有关数学算法中容易出错的地方
- !!!!
- Bean自动装配的5种模式
- 大会轶事录——09年SD2.0大会侧记(3)
- 2009 CSDN SD2.0大会系列之大会整体印象
- 最终的分数线什么时候下来?!
- cisco 虚拟专网VPN配置