编写流微型驱动程序

流类驱动程序main设计目标是处理操作系统的工作,包括支持多处理器计算机和支持内核流式处理语义的复杂度。 它要求微型驱动程序仅处理它必须执行的任何操作中特定于设备的部分。 类驱动程序为微型驱动程序分配内存,对微型驱动程序可能需要的任何 NT 内核资源执行记账, (选择性地) 处理所有同步问题。

类驱动程序通过一组微型驱动程序提供的回调与微型驱动程序通信。 编写流式处理微型驱动程序的大部分工作都发生在写入这些回调中。

在本文档中,我们将每种类型的微型驱动程序提供的例程称为 StrMiniXxx。 微型驱动程序可能必须提供每个例程的一个或多个版本,具体取决于基础硬件能够执行的不同功能的数量。

流式处理驱动程序通常可以支持多个不同的数据流。 例如,DVD 播放器生成音频和视频流。 在内核流式处理上下文中,每个数据流都由 一个引脚表示。

流类驱动程序跟踪微型驱动程序上的每个引脚。 在类驱动程序的术语中,每个引脚类型都是 一个流。 与引脚类型一样,流可能有多个实例。 由于流可以接收 I/O 请求,因此驱动程序必须为每个流提供回调。

下面是微型驱动程序可能必须提供的例程。 它们在下面和参考指南中进行了更全面的介绍。

每个微型驱动程序提供的例程

StrMiniCancelPacket

StrMiniReceiveDevicePacket

StrMiniRequestTimeout

StrMiniEvent

StrMiniInterrupt

微型驱动程序为每个单独的流提供的例程

StrMiniReceiveStreamDataPacket

StrMiniReceiveStreamControlPacket

StrMiniEvent

StrMiniClock

微型驱动程序可以对多个不同的流使用相同的回调。 回调可以确定从其参数中代表其调用它的流。

与所有 WDM 驱动程序一样,微型驱动程序还必须提供 DriverEntry 例程。 微型驱动程序的 DriverEntry 例程main任务是将微型驱动程序注册到类驱动程序。

类驱动程序代表微型驱动程序接收所有 I/O 请求。 为了获取完成请求所需的信息,类驱动程序 (SRB) 生成流请求块,并将其传递给 StrMiniXXX数据包 例程之一。 类驱动程序将整个设备的 I/O 请求调度到 StrMiniReceiveDevicePacket 例程。 它将对单个流的请求传递给 StrMiniReceiveStreamDataPacket (,以便内核流式处理读取和写入请求) ,或者针对其他请求) 的 StrMiniReceiveStreamControlPacket (。

通常,类驱动程序会将其请求排队,并将它们一次传递给微型驱动程序。 微型驱动程序可以选择执行自己的同步;然后,微型驱动程序负责对无法立即处理的请求进行排队。 有关详细信息 ,请参阅微型驱动程序同步

微型驱动程序必须提供两个额外的例程来操作流请求块。 类驱动程序在收到取消 IRP 时调用 StrMiniCancelPacket ,并且需要告知微型驱动程序取消特定数据包。 类驱动程序还会跟踪微型驱动程序完成对流请求块的处理所需的时间。 如果微型驱动程序花费的时间太长,类驱动程序会超时请求,并调用微型驱动程序的 StrMiniRequestTimeout 例程。

发生硬件中断时,操作系统会向类驱动程序发出信号,类驱动程序随后调用微型驱动程序的 StrMiniInterrupt 例程来处理中断。