Behandeln von überlappenden E/A-Vorgängen

Die DpcForIsr - oder CustomDpc-Routine eines Treibers, der vorgänge auf seinem Gerät überlappt, kann sich nicht auf eine 1:1-Korrespondenz zwischen der Anforderungseingabe an die StartIo-Routine und den AUFRUFEN von IoRequestDpc oder KeInsertQueueDpc durch den ISR verlassen. DpcForIsr oder CustomDpc eines Treibers kann nicht unbedingt die Eingabezeiger auf den von IRP und ISR bereitgestellten Kontext oder den CurrentIrp-Zeiger im Zielgerätobjekt verwenden, um nur diesen IRP abzuschließen.

Zu einem bestimmten Zeitpunkt kann dasselbe DPC-Objekt nicht zweimal in die Warteschlange eingereiht werden. Wenn ein ISR IoRequestDpc oder KeInsertQueueDpc mehrmals aufruft , bevor der entsprechende DpcForIsr oder CustomDpc ausgeführt wird, wird die DPC-Routine nur einmal ausgeführt, wenn die IRQL auf einem Prozessor unter DISPATCH_LEVEL fällt. Wenn der ISR dagegen IoRequestDpc oder KeInsertQueueDpc aufruft , während der entsprechende DpcForIsr oder CustomDpc auf einem anderen Prozessor ausgeführt wird, kann die DPC-Routine gleichzeitig auf zwei Prozessoren ausgeführt werden.

Daher muss jeder Treiber, der interruptgesteuerte E/A-Vorgänge auf seinem Gerät überlappt, folgendes aufweisen:

  • Eine DpcForIsr - oder CustomDpc-Routine , die bei jedem Aufruf eine vom Treiber verwaltete Anzahl ausstehender Anforderungen abschließen kann.

  • Eine ISR, die niemals die Kontextinformationen überschreibt, die sie an eine DpcForIsr - oder CustomDpc-Routine übergibt, bis diese Routine die Kontextinformationen verwendet und das IRP abgeschlossen hat, zu dem die Kontextinformationen gehören.

  • Eine SynchCritSection-Routine , die im Namen der DpcForIsr - oder CustomDpc-Routine auf den Kontextbereich des ISR zugreift