• 转]Driver 加载步骤


    1)当硬件连接到PC或从PC移除时,在硬件上会有信号跳变,BUS Driver会检测到器件的插入和移除,比如DVI的hotplug,再比如USB1.1的1.5K上拉。BUS Driver将调用IOInvalidateDevcieRelations,PNP Manager将知道BUS上的Device关系有所改变。

     

    2)为了获得新的Device关系,PNP Manager将调用IRP_MN_QUERY_DEVICE_RELATIONS。BUS Driver将会回应其BUS关系(目录)。

     

    3)一旦得知Device之间的关系,PNP Manager就能容易地确定哪些器件没有被初始化。IRP_MN_QUERY_ID将被发出来获得Device ID。

     

    4) 一旦获得这些详细信息后,PNP Manager就能确定转载那一类driver了。于是利用INF文件来安装Driver

     

    5) 接下来进入标准DriverEntry流程来初始化Driver,同时系统调用AddDevice来添加器件。

     

    6) Device添加完毕后,PNP Manger通过发出IRP_MN_QUERY_RESOURCE_REQUIREMENTS。这个IRP让BUS DRIVER来描述各种资源请求,包括中断,IO端口地址,IO MEMORY地址,DMA通道等等。

     

    7) PNP Manger针对BUS DRIVER描述的资源请求将资源分配给Driver,配置好Driver后,发出IRP_MN_START_DEVICE,接收到IRP后,Driver配置和连接一些内核资源,然后等待着被使用。

     

    后面Driver的工作,与System的交互,靠IRP来进行。而user mode与Driver交互也是通过WINAPI->System->Driver;Driver->System->WINAPI来进行。

     

     当一个WDM总线驱动程序为响应IRP_MN_QUERY_DEVICE_RELATIONS而列出新设备时,如果类型是BusRelations,它将创建一个物理设备对象(PDO)。

    下列规则决定了一个总线驱动程序是调用IoCreateDevice还是调用IoCreateDeviceSecure来创建一个设备对象:

    l         如果设备可以在原始模式(raw mode)下使用,那么必须调用IoCreateDeviceSecure。

    l         如果设备不能在原是模式下使用,那么总线驱动程序既可以调用IoCreateDevice,也可以调用IoCreateDeviceSecure。当对于总线上的设备的默认系统安全性足够的时候可以调用IoCreateDevice;调用IoCreateDeviceSecure可以指定更严格的安全描述符。

     

     

    1、I/O管理器(根总线)为总线生成并维护PDO,总线驱动为插入的设备生成并维护PDO(即下层设备驱动为上层设备生成并维护PDO);驱动程序中的AddDevice例程接受的参数PhysicalDeviceObject就是下层设备为其生成的PDO, AddDevice例程Create的只能是该设备的FDO

    2、总线驱动发现新设备插入后,通过调用IoInvalidateDeviceRelations告诉PnP管理器BusRelations改变(注意:IoInvalidateDeviceRelations中传入的DeviceObject是总线的PDO)PnP管理器发送IRP_MN_QUERY_DEVICE_RELATIONS查询BusRelations此时总线设备的FDO为新设备生成PDO,并报告。

    BTWTOASTER总线驱动是在发现新设备插入后就生成子PDO,然后通知PnP管理器;然后PnP管理器进行查询。这与DDK中说明不一致,可能无关紧要??

    3、UnPlug动作发生时,如同Plug动作发生,总线驱动(FDO) 通过调用IoInvalidateDeviceRelations告诉I/O管理器BusRelations改变(注意:IoInvalidateDeviceRelations中传入的DeviceObject是总线的PDO,不是此时UnPlug的设备PDO)

    4、当设备发生Eject动作时,总线驱动(FDO) 通过调用IoRequestDeviceEject告诉I/O管理器,此时IoRequestDeviceEject的参数PhysicalDeviceObject是该设备的PDO

    5、总线驱动程序需要处理两类PnP事件,一类发给总线FDOPnP事件,一类是总线驱动为插入的设备生成的PDOPnP事件。对于发给总线FDOPnP事件,一般都需要继续下传,而对于发给为插入的设备生成的PDOPnP事件则IoCompleteRequest

    6、每一个设备都有一个设备堆栈,在该设备堆栈里,代表该设备的PDO永远都处于最底层。总线的PDO与在总线上的设备PDO没有层次关系。但是总线驱动程序负责生成其发现的设备的PDO,设备提供商提供的驱动程序主要是该设备的FDOFDO进行数据传输/功能作业时一般不需要与代表设备的PDO进行交互。

    7、FiDO都是相对FDO而言,Upper FiDO表明该FiDO在设备堆栈中处于FDO的上面,Lower FiDO表明该FiDO在设备堆栈中处于FDO的下面;但所有的一切都处于PDO的上面。

    8、PnP管理器不保证设备堆栈中的驱动加载顺序,但是它保证了调用AddDevice的顺序来确保Stack的正确。

    9、如果设备处于Raw状态,则它的设备堆栈里只有PDO与总线驱动生成的FiDO

  • 相关阅读:
    超贴心的,手把手教你写爬虫
    人生苦短我用Python,本文助你快速入门
    RocketMQ 安装
    RocketMQ 简介
    2020年工作上的最大收获——监控告警体系
    .NET Core开源任务调度平台ScheduleMaster上新了
    从源码角度分析ScheduleMaster的节点管理流程
    使用 K8s 进行作业调度实战分享
    图解 K8s 核心概念和术语
    深度剖析 Kafka Producer 的缓冲池机制【图解 + 源码分析】
  • 原文地址:https://www.cnblogs.com/spinsoft/p/2555640.html
Copyright © 2020-2023  润新知