处理重叠的 I/O 操作

与其设备上操作重叠的驱动程序的 DpcForIsrCustomDpc 例程不能依赖于 对 StartIo 例程输入的请求与 ISR 对 IoRequestDpcKeInsertQueueDpc 的调用之间的一对一对应关系。 此类驱动程序的 DpcForIsrCustomDpc 不一定使用指向 IRP 和 ISR 提供的上下文的输入指针或目标设备对象中的 CurrentIrp 指针来仅完成该 IRP。

在任何给定时刻,同一 DPC 对象不能排队两次。 如果在执行相应的 DpcForIsr 或 CustomDpc 之前,ISR 多次调用 IoRequestDpcKeInsertQueueDpc,则当处理器上的 IRQL 低于DISPATCH_LEVEL时,DPC 例程仅运行一次。 另一方面,如果 ISR 调用 IoRequestDpcKeInsertQueueDpc, 而相应的 DpcForIsrCustomDpc 在另一个处理器上运行,则 DPC 例程可以在两个处理器上同时运行。

因此,在其设备上重叠中断驱动 I/O 操作的任何驱动程序都必须具有以下项:

  • DpcForIsrCustomDpc 例程,可在每次调用时完成驱动程序维护的未完成请求数

  • 永远不会覆盖传递给 DpcForIsrCustomDpc 例程的上下文信息的 ISR,直到该例程使用了上下文信息并完成了上下文信息所属的 IRP

  • 一个 SynchCritSection 例程,代表 DpcForIsrCustomDpc 例程访问 ISR 的上下文区域