zoukankan      html  css  js  c++  java
  • [转]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

  • 相关阅读:
    Linux 进程管理
    强大的bat文件搞定系统所有问题
    Java多线程设计要点
    Linux 内核
    Linux 文件和目录管理之列出、删除、复制、移动及改名
    命令dd 及简单应用
    Transferring Files with SFTP or SCP
    简述Linux文件搜索
    加强Eclipse代码自动提示的方法
    Cisco交换机配置新手篇之端口配置
  • 原文地址:https://www.cnblogs.com/adylee/p/2555594.html
Copyright © 2011-2022 走看看