初学驱动编程,请大虾不吝指教:1、例如irptrace软件,需要用到irpdrv.sys这个驱动,但是这个驱动在系统启动时是没有加载的;运行irptrace时才被加载,这是如何做到的(动态加载如何实现);2、对于ramdisk这样的软件,需要用到rramdisk.sys这个驱动;但是系统内并不存在ramdisk的硬件实例,那么这个驱动是如何被加载的?如果用WDM开发的话,它的AddDevice例程是如何被调用的?谢谢您。

解决方案 »

  1.   

    驱动的加载是以系统服务的形式来加载的。
    服务的注册表可以开机启动,也可以象服务一样,手动启动。irptrace就是这种。
    ramdisk应该算是一种内核扩展,它不对应实际的物理硬件。只是在驱动层上架那么一层。:)
      

  2.   

    那么像虚拟串口这样的软件,它的应用程序是如何创建出串口来的呢?AddDevice是由谁来调用的?
    另外,请教一下,为什么我的windbg不能显示ntoskrnl中的符号名称呢?只有地址。
    如下:
    kd> !idtDumping IDT:37: 806ef728 
    3d: 806f0b70 
    41: 806f09cc 
    50: 806ef800 
    62: 82f949d4 f748b67e (KINTERRUPT 82f94998)
    63: 82eee774 f72bae54 (KINTERRUPT 82eee738)
             f727d954 (KINTERRUPT 82eea1f8)
    73: 82d7f044 f72bae54 (KINTERRUPT 82d7f008)
    83: 82db5344 f73ade10 (KINTERRUPT 82db5308)
    93: 82d5d9bc f7603495 (KINTERRUPT 82d5d980)
    a3: 82ee746c f760ac90 (KINTERRUPT 82ee7430)
    b1: 82f98a1c f74ff31e (KINTERRUPT 82f989e0)
    b2: 82d08dd4 f76139c0 (KINTERRUPT 82d08d98)
    c1: 806ef984 
    d1: 806eed34 
    e1: 806eff0c 
    e3: 806efc70 
    fd: 806f0464 
    fe: 806f0604 
    应该可以显示出部分函数名称的啊,例如i8042prt!I8042keyboardInterruptService+0
      

  3.   

    1. 虚拟的串口驱动程序,这个设备是一个虚拟的,虚拟的就不能在任何总线上面了。这样子,就先虚拟一个总线出来,然后告诉设备管理器,这里有一个串口。设备管理器傻乎乎的就去找一个串口的功能驱动带过来用了,然后操作系统就会以为我们这里有一个串口了。所以这个虚拟的串口驱动程序,实际上就由一个总线驱动、功能驱动构成。2.在WDM的驱动程序中,创建设备对象的任务不再由DriverEntry承担,而需要驱动程序向系统注册一个称做AddDevice的例程。此例程由PNP管理器负责调用,其函数主要职责是创建设备对象。3.symbol path设置了吗?