处理重叠的 I/O 操作
与其设备上操作重叠的驱动程序的 DpcForIsr 或 CustomDpc 例程不能依赖于 对 StartIo 例程输入的请求与 ISR 对 IoRequestDpc 或 KeInsertQueueDpc 的调用之间的一对一对应关系。 此类驱动程序的 DpcForIsr 或 CustomDpc 不一定使用指向 IRP 和 ISR 提供的上下文的输入指针或目标设备对象中的 CurrentIrp 指针来仅完成该 IRP。
在任何给定时刻,同一 DPC 对象不能排队两次。 如果在执行相应的 DpcForIsr 或 CustomDpc 之前,ISR 多次调用 IoRequestDpc 或 KeInsertQueueDpc,则当处理器上的 IRQL 低于DISPATCH_LEVEL时,DPC 例程仅运行一次。 另一方面,如果 ISR 调用 IoRequestDpc 或 KeInsertQueueDpc, 而相应的 DpcForIsr 或 CustomDpc 在另一个处理器上运行,则 DPC 例程可以在两个处理器上同时运行。
因此,在其设备上重叠中断驱动 I/O 操作的任何驱动程序都必须具有以下项:
DpcForIsr 或 CustomDpc 例程,可在每次调用时完成驱动程序维护的未完成请求数
永远不会覆盖传递给 DpcForIsr 或 CustomDpc 例程的上下文信息的 ISR,直到该例程使用了上下文信息并完成了上下文信息所属的 IRP
一个 SynchCritSection 例程,代表 DpcForIsr 或 CustomDpc 例程访问 ISR 的上下文区域