Trennen von DispatchCreate und DispatchClose Routinen

Die Dispatchroutinen eines Treibers für IRP_MJ_CREATE und IRP_MJ_CLOSE Anforderungen können nur die Eingabe-IRP mit STATUS_SUCCESS abschließen. Weitere Informationen finden Sie unter Abschließen von IRPs.

Die Dispatchroutinen eines anderen Treibers für IRP_MJ_CREATE und IRP_MJ_CLOSE Anforderungen können abhängig vom zugrunde liegenden Gerätetreiber oder vom zugrunde liegenden Gerät mehr Arbeit leisten. Stellen Sie sich die folgenden Szenarien vor:

  • Beim Empfang einer Erstellungsanforderung kann ein Klassentreiber eine interne Warteschlange initialisieren und eine IRP_MJ_INTERNAL_DEVICE_CONTROL Anforderung an den entsprechenden Porttreiber senden, der Gerätekonfigurationsinformationen oder exklusiven Zugriff auf einen Controllerport anfordert.

  • Der Empfang von IRP_MJ_CLOSE gibt an, dass der letzte Verweis auf das Dateiobjekt entfernt wurde, das dem Zielgerätobjekt zugeordnet ist. Dies bedeutet, dass alle Handles für das Dateiobjekt geschlossen und alle ausstehenden E/A-Anforderungen abgeschlossen oder abgebrochen wurden.

  • Nach Erhalt einer Erstellungsanforderung kann ein Treiber eines selten verwendeten Geräts MmLockPagableCodeSection aufrufen, um einige der Treiberroutinen zu erstellen, die andere IRP_MJ_XXX-Anforderungen verarbeiten. Nach Erhalt einer gegenseitigen Close-Anforderung kann der Treiber MmUnlockPagableImageSection aufrufen, um den Systemspeicher zu sparen, indem der Abschnitt "Pageable-Image" ausgelagert wird, wenn alle Dateiobjekthandles für die Geräteobjekte eines solchen Treibers geschlossen sind.

Einige Treiber verarbeiten IRP_MJ_CLOSE Anforderungen nur für Symmetrie, da die Geräteobjekte der unteren Treiberebene erst geschlossen werden, wenn ihre Geräteobjekte erst geschlossen werden, wenn das System selbst heruntergefahren wird, nachdem ihre Geräteobjekte von Treibern auf höherer Ebene geöffnet wurden. Beispielsweise richten Tastatur- und Maustreiber Geräteobjekte ein, die physische Geräte darstellen, die während der Systemausführung funktionsfähig sein müssen, sodass diese Treiber möglicherweise minimale DispatchClose-Routinen für Symmetrie aufweisen oder kombinierte DispatchCreateClose-Routinen haben.

Wenn das von einem Treiber auf niedrigerer Ebene gesteuerte Gerät verfügbar sein muss, damit das System weiter ausgeführt werden kann, wird die DispatchClose-Routine des Treibers in der Regel nicht aufgerufen. Einige der Systemdatenträgertreiber verfügen beispielsweise über keine DispatchClose-Routine , aber diese Treiber verfügen in der Regel über DispatchFlushBuffers - und DispatchShutdown-Routinen , um alle ausstehenden Datei-E/A-Vorgänge abzuschließen, bevor das System heruntergefahren wird.

Während Sie separate DRIVER_DISPATCH - und DispatchClose-Routinen implementieren können, verfügen Treiber manchmal über eine einzelne DispatchCreateClose-Routine für die Verarbeitung von Erstellungs- und Schließenanforderungen.