chapter 4.2: UMDF介绍

来源:互联网 发布:28岁未成年网络剧免费 编辑:程序博客网 时间:2024/05/29 19:05
UMDF是基于COM的编程模型,用于实现function,filter driver,例如USB设备驱动
framework是DLL,由一些基于COM的callback object组成
选择COM原因:
    1.程序员熟悉
    2.COM接口支持对函数的分组,让DDI容易理解
    3.支持ATI等一系列基于COM的工具
UMDF基于两种object
    1.framework object:属于framework,表示了driver、device,I/O queue等
    2.callback object:由驱动实现,响应设备相关事件,在UMDF中注册。
driver通过COM interface pointer,而不是object pointer和framework object交互
framework object反过来和driver实现的callback object交互

UMDF Framework objects

created by:

    1.framework:

        framework载入driver时,产生一个framework driver object,framework并把指针传给driver object的接口IWDFDriver,并把IWDFDeviceInitialize接口传给driver的callback object

    2.dirver:

        driver通过调用IWDFDriver::CreatDevice产生一个framework device object

    3.both

        例如I/O request object

Framework object导出的interface的命名为IWDF[Object],其中[Object]指的是是由哪个对象导出的接口

IUnknowen

所有的Framework object会导出一至多个interfaces:framework device object会导出IWDFDevice和IWDFObject

interface包含了一至多个方法,它们的目的:

    1.告诉object采取行为

    2.访问属性中的数据(get set),不同的类型是根据naming convention来区别的


UMDF Callback Objects

driver通过实现callback object处理事件和在framework上注册它来覆盖framework对event的默认处理

callback object导出了一至多个callback interfaces:每个interface处理了一系列相关的事件集。

callback interfaces由一至多个方法组成:每个方法对应了一个event,framework通过调用它来向driver通知事件,以及和向Callback Object传递相关数据

driver注册Callback Object的方式是根据framework object是framework还是driver产生的:

    1.由driver产生的framework object:

        在driver创建object时注册 Callback Objects,比如driver在调用IWDFDriver::CreateDevice时

    2.由framework产生的framework object:

        这些objcet会有一至多个方法可以让driver调用来注册callback object,比如为了给I/O request注册一个完成请求的callback object,driver调用了I/O request object的IWDFIoRequest::SetCompletionCallback方法。

driver选择处理event,决定了每个callback object导出的接口。

    若driver只需处理一个queue object的read event,callback object只需要导出一个callback interface:IQueueCallbackRead

    若driver需处理queue object的read event和cleanup event,callback object需要导出两个callback interface:IQueueCallbackRead和IObjectCleanup

    若一个framework object不产生任何事件,则不用注册callback object:driver通常不用处理memory object产生的事件。

    *callback object可以处理来自不同object的事件。