Abschließen einer IRP in einer Versandroutine

Wenn ein Eingabe-IRP sofort abgeschlossen werden kann, führt eine Dispatchroutine folgendes aus:

  1. Legt die Status- und Informationsmember des I/O-status-Blocks des IRP im Allgemeinen mit den entsprechenden Werten fest:

    • Die Dispatchroutine legt Status entweder auf STATUS_SUCCESS oder auf einen entsprechenden Fehler (STATUS_XXX) fest, wobei es sich um den Wert handelt, der durch einen Aufruf einer Supportroutine oder bei bestimmten synchronen Anforderungen von einem niedrigeren Treiber zurückgegeben wird.

      Wenn ein Treiber auf niedrigerer Ebene STATUS_PENDING zurückgibt, sollte ein Treiber auf höherer Ebene IoCompleteRequest für das IRP nicht aufrufen, mit einer Ausnahme: Der Treiber der höheren Ebene kann ein Ereignis verwenden, um zwischen seiner IoCompletion-Routine und seiner Dispatchroutine zu synchronisieren. In diesem Fall signalisiert die IoCompletion-Routine das Ereignis und gibt STATUS_MORE_PROCESSING_REQUIRED zurück. Die Dispatchroutine wartet auf das Ereignis und ruft dann IoCompleteRequest auf, um die IRP abzuschließen.

    • Sie legt Information auf die Anzahl der Bytes fest, die erfolgreich übertragen wurden, wenn eine Anforderung zum Übertragen von Daten, z. B. eine Lese- oder Schreibanforderung, erfüllt wurde.

    • Sie legt Information auf einen Wert fest, der je nach der spezifischen Anforderung für andere IRPs variiert, die mit STATUS_SUCCESS abgeschlossen wird.

    • Es legt Information auf einen Wert fest, der je nach der spezifischen Anforderung für IRPs variiert, die mit einer Warnung STATUS_XXX abgeschlossen wird. Beispielsweise würde es Informationen auf die Anzahl der Bytes festlegen, die für eine Solche Warnung wie STATUS_BUFFER_OVERFLOW übertragen wurden.

    • Normalerweise legt er Informationen für Anforderungen auf Null fest, die mit einem Fehler STATUS_XXX abgeschlossen werden.

  2. Ruft IoCompleteRequest mit dem IRP und mit PriorityBoost = IO_NO_INCREMENT auf.

  3. Gibt die entsprechende STATUS_XXX zurück, die bereits im E/A-status-Block festgelegt wurde. Beachten Sie, dass ein Aufruf von IoCompleteRequest den Zugriff auf die angegebene IRP für den Aufrufer verhindert, sodass der Rückgabewert einer Dispatchroutine nicht aus dem E/A-status Block eines bereits abgeschlossenen IRP festgelegt werden kann.

Befolgen Sie diese Implementierungsrichtlinie zum Aufrufen von IoCompleteRequest mit einem IRP:

Lassen Sie immer alle Drehsperren los, die der Treiber hält, bevor Sie IoCompleteRequest aufrufen.

Es dauert unbestimmt lange, bis ein IRP abgeschlossen ist, insbesondere in einer Kette von mehrschichtigen Treibern. Darüber hinaus kann ein Deadlock auftreten, wenn die IoCompletion-Routine eines übergeordneten Treibers einen IRP zurück an einen niedrigeren Treiber sendet, der eine Drehsperre hält.