Freigeben über


Ein einzelner DispatchErstellenClose-Routine

Viele Fahrer, insbesondere fahrer unterer Ebene in einer Kette von mehrschichtigen Treibern, müssen lediglich ihre Existenz bei Erhalt einer Erstellungsanforderung nachweisen und lediglich den Eingang einer engen Anforderung bestätigen.

Beispielsweise kann ein Porttreiber für einen Gerätecontroller mit einem oder mehreren eng gekoppelten Klassentreibern, die IoGetDeviceObjectPointer aufrufen, eine minimale DispatchCreateClose-Routine aufweisen. Die Routine kann nur die IRP wie folgt abschließen:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

Diese minimale DispatchCreateClose-Routine legt den Informationsmember des E/A-status-Blocks auf Null fest, was angibt, dass das Dateiobjekt für eine Erstellungsanforderung geöffnet wird. Informationen haben keine Bedeutung für eine enge Anforderung. Die Routine legt den Status-Member auf STATUS_SUCCESS fest und gibt auch diesen status Wert zurück, der angibt, dass der Treiber bereit ist, E/A-Anforderungen zu akzeptieren.

Diese minimale DispatchCreateClose-Routine schließt die Erstellungs-IRP ab, ohne die Priorität des Absenders des IRP (IO_NO_INCREMENT) zu erhöhen, da davon ausgegangen wird, dass der Absender auf ein unbestimmtes, aber sehr kleines Intervall wartet, bis die Anforderung abgeschlossen ist.

Wie viel Arbeit eine DispatchCreateClose-Routine leistet, hängt teilweise von der Art des Treibergeräts oder des zugrunde liegenden Geräts und teilweise vom Design des Treibers ab. Wenn ein Treiber sehr unterschiedliche Vorgänge zum Erstellen und Schließen von Anforderungen ausführt, sollte er diese Anforderungen in separaten DispatchCreate- und DispatchClose-Routinen behandeln.

Um eine Erstellungsanforderung zum Öffnen eines Dateiobjekts zu behandeln, das ein logisches oder physisches Gerät darstellt, sollte ein Treiber der höchsten Ebene folgendes ausführen:

  1. Rufen Sie IoGetCurrentIrpStackLocation auf, um einen Zeiger auf den E/A-Stapelspeicherort im IRP abzurufen.

  2. Überprüfen Sie FileObject. FileName im E/A-Stapelspeicherort, und vervollständigen Sie die IRP mit STATUS_SUCCESS, wenn die Unicode-Zeichenfolge unter FileName eine Länge von null hat. Schließen Sie andernfalls die IRP mit STATUS_INVALID_PARAMETER ab.

Durch ausführen der vorherigen Schritte wird sichergestellt, dass später kein Versuch, eine Pseudodatei auf einem Gerät zu öffnen, Probleme verursachen kann. Dies verhindert beispielsweise versuche, ein nicht vorhandenes \\device\parallel0\temp.dat zu öffnen.