Welchen DPC-Typ sollten Sie verwenden?

Je nach Design eines Treibers kann er über folgendes verfügen:

  • Ein einzelner DpcForIsr zum Abschließen aller unterbrechungsgesteuerten E/A-Vorgänge

  • Ein Satz von mindestens einer CustomDpc-Routine .

  • Sowohl ein DpcForIsr als auch eine Reihe von vorgangsspezifischen CustomDpc-Routinen

Ob ein Treiber über eine einzelne DpcForIsr-Routine , eine Reihe von CustomDpc-Routinen oder beides verfügt, hängt von der Art des zugrunde liegenden Geräts und den E/A-Anforderungen ab, die er unterstützen muss.

Die meisten Gerätetreiber der niedrigsten Ebene verfügen über eine einzelne DpcForIsr-Routine , um die E/A-Verarbeitung für jede IRP abzuschließen, die einen oder mehrere Vorgänge auf ihren jeweiligen Geräten erfordert. Die Verwendung eines einzelnen DpcForIsr zum Ausführen von unterbrechungsgesteuerten E/A-Vorgängen pro Anforderung auf einem Gerät, das jeweils einen Vorgang ausführt, ist relativ einfach. Der ISR eines solchen Treibers muss nur IoRequestDpc für jeden interruptgesteuerten E/A-Vorgang aufrufen.

Nur wenige Treiber der niedrigsten Ebene verfügen über CustomDpc-Routinen , es sei denn, ihre Geräte benötigen mehr als einen DPC, um eine vielzahl von unterbrechungsgesteuerten E/A-Vorgängen durchzuführen.

Die Verwendung eines einzelnen DpcForIsr zum Abschließen von überlappenden, unterbrechungsgesteuerten E/A-Vorgängen auf einem Gerät, das gleichzeitige Vorgänge ausführen kann, ist mit sorgfältigem Entwurf möglich, kann aber relativ schwierig sein. Zusätzlich zu oder anstelle einer DpcForIsr-Instanz kann ein ISR eine Reihe von vorgangsspezifischen, vom Treiber bereitgestellten CustomDpc-Routinen in die Warteschlange stellen, indem KeInsertQueueDpc aufgerufen wird.

Betrachten Sie beispielsweise einige der Entwurfsprobleme, die mit dem Schreiben eines seriellen Treibers verbunden sind. Als Treiber eines Vollduplexgeräts kann sich ein serieller Treiber nicht auf eine 1:1-Korrespondenz zwischen der Reihenfolge, in der IRPs in eine StartIo-Routine eingereiht werden, und der Sequenz der Unterbrechungen des Geräts in einem Multitasking-Multiprozessorsystem verlassen. Darüber hinaus müssen serielle Treiber zeitgesteuerte Anforderungen und asynchrone benutzergenerierte Anforderungen verarbeiten, um zuvor angeforderte Vorgänge abzubrechen, gepufferte Daten zu bereinigen usw.

Folglich kann ein serieller Treiber interne Warteschlangen für die Lese-, Schreib-, Lösch- und Wartevorgänge verwalten, die COM-Portanwendungen im Benutzermodus anfordern können. Es kann auch Die Referenzanzahl beibehalten oder einen anderen Nachverfolgungsmechanismus, z. B. eine Reihe von Flags, für die IRPs in ihren internen Warteschlangen verwenden. Seine ISR ruft KeInsertQueueDpc mit einer Reihe von treiberseitig zugeordneten und initialisierten DPC-Objekten auf, die jeweils einer vom Treiber bereitgestellten CustomDpc-Routine zugeordnet sind.