公 告
登 陆
日 历
搜 索
信 息
收 藏
WDM驱动程序开发之驱动框架(KDriver类)
kangs 发表于 2010/12/29 15:57:00
    KDriver类提供了一个设备驱动程序的框架。这个类的职责包括初始化驱动程序,把I/O请求传递给它们的目标设备对象。     KDriver是一个抽象类,驱动编写人员必须写一个新的类来继承它。新的子类必须重写DriverEntry函数,这是当系统载入驱动程序时框架要调用的函数。这个派生类会有一个构造函数,但是构造函数不允许有参数。一般来说,最好不要写这么一个构造函数。把一切的初始化工作放在DriverEntry函数里来进行。对于任何给定的驱动,只能有一个KDriver类的实例存在,而且这个实例是框架自动创建的。任何调用者可以通过调用DriverInstance静态函数来获得一个指向这个唯一实例的指针。     驱动编写人员必须做的另一件事情是通知框架:哪个类作为驱动框架来提供服务。框架提供了定义了一个宏定义DECLARE_DRIVER_CLASS来实现这个事情。任何一个驱动程序里都必须调用一次且只能调用一次这个宏,一般是在拥有DriverEntry函数的组件里。这个宏必须放在任何函数之外,因为它事实上声明一个可以被框架调用的函数。宏的参数应该是继承了KDriver类的那个类的名字。     除了DriverEntry,KDriver还有其他两个成员函数来做初始化的工作:RequestReinitialization() 和 Reinitialize()。一个驱动程序在DriverEntry函数里调用RequestReinitialization()函数来指示系统调用 Reinitialize()函数,作为第二级初始化。而Reinitialize()函数是一个可被重写的虚函数。     如果想要系统具有卸载(Unload)驱动的功能,就要在function.h文件里做一个声明:#define DRIVER_FUNCTION_UNLOAD。这是虚函数Unload()的得到声明。这个函数在基类中的实现代码调用了DeleteDevices() 函数来为这个驱动程序创建的每个设备调用析构函数。     其他成员函数对驱动程序创建的设备进行管理。GetDeviceListHead()函数取得驱动创建的一系列设备对象中的第一个(head)。DeleteDevices()遍历列表,并为每一个设备对象调用析构函数。IsDevicePresent()使驱动程序确认设备是否已经被删除。     尽管通常情况下框架会将I/O请求直接派遣给目标设备对象,KDriver还是保留了一个特性:可以派生一个成员函数在I/O请求被派遣给设备对象之前对它进行检测或预处理。这个特性通过调用EnableDispatchFilter()函数来启用,这会使所有的I/O请求被重写的DispatchFilter()函数处理后再派遣。另外,要启用这个特性,还必须在function.h文件中声明:#define DRIVER_FUNCTION_DISPATCH_FILTERING。     总结:不要在KDriver的子类中定义构造函数和析构函数,把初始化工作放在DriverEntry函数里,清理工作放在Unload函数里。

发表评论:

    昵称:
    密码:
    主页:
    标题: