使用内存对象来描述驱动程序传入和给出的内存缓冲区。每个 内存对象表示一个缓冲区。可以使用以下方法来创建内存对象:
)% 创建一个内存对象并且分配一块指定大小的内存。
)%$ 为一块已预先分配的内存创建内存对象。
)%<2 从一个后援表创建内存缓冲区。
)#P*#L* 和 )#P*#*L* 从一个收到的 请求的缓冲区获得内存对象。要取得内存对象中缓冲区的地址和大小,使用 )C1*Q。驱动程
序可以调用 )%L1*Q)%L91*Q 来将数据移入移出内存对象的缓冲区。这些方法检查来源和目的缓冲区的大小,能够防止缓冲区过载溢出。
如果你的驱动程序调用 )%$ 创建了一个内存对象,那么以后你可以通过调用 )(&1*Q 来给该内存对象指定另外的缓冲区。当驱动程序向“ 目标”发送 请求
时,一般要向 目标对象的某个方法传递一个输入或输出缓冲区。 目标对象的发送同步 请求的方法要求 6#R64%#$9# 结构,发送异步 请求的方法要求内存对象的句柄。
分配本地缓冲区
当一个驱动程序需要本地的,内部使用的缓冲区空间,并且不会把它传递给 框架,那么不必创建内存对象来代表这个缓冲区。驱动程序仍然使用 :($:$。然而也可以使用内存对象,
这样做的一个好处就是当内存对象的父对象被删除时 会自动释放对象和其中的内存。
使用字符串对象
只支持 5 字符串。所有 对象定义的方法只接受 5 字符串。驱动程序可以用 定义的字符串对象来代表 5 字符串。你可以调用 )4&% 来创建一个字符串对象,
然后可以把一个 5 字符串复制给该对象。一些 对象的方法,比如 )#&+*4&,接受一个字符串对象的句柄作为传入参数,并且把一个字符串指定到该字符串对象。你可以调用
)4&C54& 来访问对象中的字符串。
基于 KMDF 的驱动程序的同步技术
内核模式驱动程序中的同步操作是一个驱动程序写作者需要完成的最具挑战性的工作之一。如果每个驱动程序都运行在单处理器系统中,只需要支持一个设备,如果每个设备只需要一次处理一个同步的 操作,
并且系统不允许多个设备共享中断向量,那就不会有同步问题。写作驱动程序将会变得相对容易一些。然而,典型的设备驱动程序要同时支持系统中的多个设备,每个设备都产生异步 操作。多个处理器可能
并行执行驱动程序的线程,而且有时是在不同的 #+ 等级上。多个不同种类的设备共享一个中断向量;多个应用程序同时访问一个设备。 提供了同步能力G简化了驱动程序需要处理的同步任务。以下主题
描述了 提供的机制,帮助你同步驱动程序的操作。
使用自动同步
基于 的驱动程序的几乎所有代码都以事件回调函数的形式存在。 自动同步了驱动程序的大多数回调函数: 总是同步一般设备对象、功能设备对象和物理设备对象$的回调函数,使
每一个设备在任一时刻只有一个回调函数能被执行。这些回调函数支持即插即用和电源管理事件,并且在 #+<8$(4476<7< 等级上执行。 能同步处理驱动程序 请求的回调函数的执行,使得在
任一时刻只有一个回调函数能被执行。特别地, 能同步队列、中断、延迟过程调用$%、计时器、工作项 2@、文件对象还有请求对象的 #P*% 回调函数。 在
4$(9%>6<7< 上调用大多数上述的回调函数,但是你可以强制让队列和文件对象的回调函数运行在 $(4476<7<工作项回调函数总是运行在 $(4476<7< 上。 使用一套内部同步锁来实现
这种自动同步。 保证不会有两个或更多的线程同时执行同一个回调函数,因为每个线程在执行一个回调函数前,必须等待直到获得一个同步锁。你的驱动程序应该将对象特定的数据保存在对象上下文空间
中。如果你的驱动程序只使用 预定义的接口,那么只有接收到对象句柄的回调函数才能访问对象的数据。 同步机制使得任一时刻只有一个回调函数被执行,于是对象上下文空间在任一时刻只有一
个回调函数能访问。中断服务代码和访问中断数据的代码必须执行在设备中断请求级 #+<并且需要额外的同步处理。详见中断代码同步一节。你可以选择 同步处理驱动程序 请求的方式。可供你的
驱动程序使用的同步选项如下:
J设备级同步
同步设备的所有队列中的所有请求处理,以及设备的文件对象回调函数和每个请求对象的 #P*% 回调函数,因此在任一时刻上述代码只有一份在运行。还可以让 同步中断、$%、工
作项、计时器对象的回调函数除了中断对象的 *L 回调函数,它执行在 #+<。 通过执行回调函数前获取设备同步锁来达到同步目的。
J队列级同步
对单独的队列里的请求处理进行同步,还有父设备的文件对象回调函数和每个请求对象的 #P*% 回调函数,以便它们顺序执行。还可以让 同步提供给父设备的中断、$%、工作项、
计时器对象的回调函数除了中断对象的 *L 回调函数。 通过执行回调函数前获取队列同步锁来达到同步目的。
J无同步
不提供处理 请求的回调函数间的同步,在执行回调函数前也不等待获取同步锁。如果需要同步处理,驱动程序必须自己提供。
选择同步范围
要指定你让 提供设备级同步、队列级同步或者无同步,你必须在你的一个或多个驱动程序对象中指定同步范围。对象的 61S%96(99#1594 结构的 4T4L 成员标记了对象的
同步范围。可供你的驱动程序使用的值如下:
)4T4L
)4T4L+**
)4T4L'
)4T4L$