Freigeben über


Synchronisieren von IRP-Abbruch

Aus Fahrersicht kann ein IRP jederzeit abgebrochen werden. IRP-Abbruch erfolgt asynchron; Daher müssen die Fahrer in der Lage sein, eine Reihe möglicher Rennbedingungen zu bewältigen, die erstellt werden, wenn die IRP an einem der folgenden Punkte abgesagt wird:

  • Nachdem eine Treiberroutine aufgerufen wurde, aber bevor sie eine IRP in die Warteschlange stellt.

  • Nachdem eine Treiberroutine aufgerufen wurde, aber bevor sie versucht, eine IRP zu verarbeiten. Beispielsweise kann ein IRP abgebrochen werden, nachdem die StartIo-Routine eines Treibers aufgerufen wurde, aber bevor die StartIo-Routine den IRP aus der Gerätewarteschlange entfernt.

  • Nachdem die Treiberroutine den IRP dequeniert hat, aber bevor die angeforderten E/A-Vorgänge gestartet werden.

Beachten Sie, dass ein anderer Thread auf die IRP zugreifen und diese ändern kann, nachdem ein Treiber eine IRP in die Warteschlange gestellt und alle Spinsperren zum Schutz der Warteschlange freigegeben hat. Wenn der ursprüngliche Thread fortgesetzt wird – auch sobald die nächste Codezeile – wurde die IRP möglicherweise bereits abgebrochen oder anderweitig geändert.

Der Treiber kann das abbruchsichere IRP-Warteschlangenframework verwenden, um IRP-Warteschlangen zu implementieren. Das System registriert dann eine Cancel-Routine für den Treiber, die die Synchronisierung automatisch verarbeitet, um IRPs sicher abzubrechen. Weitere Informationen finden Sie unter Cancel-Safe IRP-Warteschlangen . Andernfalls müssen Treiber ihre eigene Synchronisierung implementieren.

Die folgenden Elemente eines IRP enthalten Informationen zum Abbruch:

  • Irp-> Cancel gibt an, ob ein IRP abgebrochen wird oder abgebrochen werden soll.

  • Irp-> CancelRoutine gibt an, ob ein IRP abgebrochen werden kann. Wenn dieses Element einen Zeiger auf eine Abbruchroutine enthält, kann der IRP abgebrochen werden. Wenn dieser Member NULL ist, kann die IRP nicht abgebrochen werden. Wenn dieser Member NULL ist, aber Irp-Cancel> festgelegt ist, bedeutet dies, dass die Abbruchroutine ausgeführt wird und das IRP gerade abgebrochen wird.

Wenn ein Treiber abbrechbare IRPs verarbeitet, ist er dafür verantwortlich, die entsprechende Cancel-Routine in jedem IRP festzulegen, das er in einem abbrechbaren Zustand enthält.

Dieser Abschnitt enthält die folgenden Themen zur Synchronisierung von IRP-Abbruch.

Verwenden der Drehsperre "Abbrechen" des Systems

Synchronisieren des Abbruchs in Treiberroutinen, die IRPs verarbeiten

Synchronisieren des Abbruchs in Higher-Level Treibern ohne Abbruchroutinen

Verwenden einer Driver-Supplied Spin-Sperre