Einführung in Standardtreiberroutinen
Jeder Kernelmodustreiber wird um eine Reihe systemdefinierter Standardtreiberroutinen herum erstellt. Kernelmodustreiber verarbeiten E/A-Anforderungspakete (IRPs) innerhalb dieser Standardroutinen, indem sie vom System bereitgestellte Treiberunterstützungsroutinen aufrufen.
Alle Treiber, unabhängig von ihrem Niveau in einer Kette angefügter Treiber, müssen über einen grundlegenden Satz von Standardroutinen verfügen, um IRPs verarbeiten zu können. Ob ein Treiber zusätzliche Standardroutinen implementieren muss, hängt davon ab, ob der Treiber ein physisches Gerät steuert oder sich über einen physischen Gerätetreiber befindet, sowie von der Art des zugrunde liegenden physischen Geräts. Treiber der niedrigsten Ebene, die physische Geräte steuern, verfügen über mehr erforderliche Routinen als Treiber auf höherer Ebene, die IRPs normalerweise zur Verarbeitung an einen niedrigeren Treiber übergeben.
Standardtreiberroutinen können in zwei Gruppen unterteilt werden: diejenigen, die jeder Kernelmodustreiber aufweisen muss, und diejenigen, die optional sind, je nach Treibertyp und Speicherort im Gerätestapel.
In der folgenden Tabelle sind die erforderlichen Standardroutinen aufgeführt.
Erforderliche Standardtreiberroutinen | Zweck | Wo beschrieben |
---|---|---|
DriverEntry | Initialisiert den Treiber und sein Treiberobjekt. | Schreiben einer DriverEntry-Routine |
AddDevice | Initialisiert Geräte und erstellt Geräteobjekte. | Schreiben einer AddDevice-Routine |
Versandroutinen | Empfangen und Verarbeiten von IRPs. | Schreiben von Dispatchroutinen |
Entladen | Geben Sie Systemressourcen frei, die vom Treiber abgerufen wurden. | Schreiben einer Entladeroutine |
In der folgenden Tabelle sind mehrere optionale Routinen aufgeführt.
Optionale Standardtreiberroutinen | Zweck | Wo beschrieben |
---|---|---|
Initialisieren | Schließt die Treiberinitialisierung ab, wenn DriverEntry dies nicht kann. | Schreiben einer Neuitialisierungsroutine |
StartIo | Startet einen E/A-Vorgang auf einem physischen Gerät. | Schreiben einer StartIo-Routine |
Unterbrechung der Dienstroutine | Speichert den Zustand eines Geräts, wenn es unterbrochen wird. | Schreiben einer ISR |
Verzögerte Prozeduraufrufe | Schließt die Verarbeitung eines Geräteunterbrechungs ab, nachdem ein ISR den Gerätestatus gespeichert hat. | DPC-Objekte und DPCs |
SynchCritSection | Synchronisiert den Zugriff auf Treiberdaten. | Verwenden kritischer Abschnitte |
AdapterControl | Initiiert DMA-Vorgänge. | Adapterobjekte und DMA |
IoCompletion | Schließt die Verarbeitung eines IRP durch einen Treiber ab. | Abschließen von IRPs |
Abbrechen | Bricht die Verarbeitung eines IRP durch einen Treiber ab. | Abbrechen von IRPs |
CustomTimerDpc, IoTimer | Timing und Synchronisierung von Ereignissen. | Synchronisierungstechniken |
Das aktuelle IRP- und das Zielgerätobjekt sind Eingabeparameter für viele Standardroutinen. Jeder Treiber verarbeitet jedes IRP schrittweise über seine Standardroutinen.
Gemäß der Konvention haben die vom System bereitgestellten Treiber dem Namen jeder Standardroutine mit Ausnahme von DriverEntry ein identifizierende, treiberspezifisches oder gerätespezifisches Präfix vorangestellt. In dieser Dokumentation wird beispielsweise "DD" verwendet, wie in der Abbildung in Einführung in Treiberobjekte gezeigt. Die Einhaltung dieser Konvention erleichtert das Debuggen und Verwalten von Treibern.