Verwenden der Abbruch-Spin-Sperre des Systems
Das System stellt eine einzelne Abbruch-Spinsperre bereit, die abgerufen oder freigegeben wird, wenn bestimmte Systemroutinen aufgerufen werden.
Treiberroutinen, die den Status von abbruchfähigen IRPs ändern, einschließlich aller Routinen, die ein IRP mit STATUS_CANCELLED abschließen können, müssen gemäß den Richtlinien in diesem Abschnitt die System-Abbruch-Spin-Sperre abrufen und freigeben.
In Treibern, die die vom E/A-Manager bereitgestellte Gerätewarteschlange verwenden, muss jede Andere Treiberroutine als die Cancel-Routine , die den abbruchfähigen Zustand eines IRP ändert, zuerst IoAcquireCancelSpinLock aufrufen, um die Systemabbruch-Spinsperre zu erhalten.
Durch das Abrufen der Abbruch-Drehsperre wird sichergestellt, dass nur der Aufrufer den abbruchfähigen Zustand dieses IRP ändern kann. Während der Aufrufer die Drehsperre hält, kann der E/A-Manager die Abbruchroutine des Treibers für diese IRP nicht aufrufen. Ebenso kann eine andere Treiberroutine, z. B. eine DispatchCleanup-Routine , nicht gleichzeitig versuchen, den abbruchfähigen Zustand dieses IRP zu ändern.
In Treibern, die ihre eigenen Warteschlangen von IRPs verwalten und vom Treiber bereitgestellte Spinsperren zum Synchronisieren des Warteschlangenzugriffs verwenden, müssen die Treiberroutinen vor dem Aufrufen von IoSetCancelRoutine nicht die Abbruch-Spin-Sperre erwerben. Diese Treiber sollten jedoch den VonIoSetCancelRoutine zurückgegebenen Cancel-Routinezeiger überprüfen, um festzustellen, ob die Cancel-Routine bereits gestartet wurde. Weitere Informationen finden Sie unter Verwenden einer Driver-Supplied Spin-Sperre .
Jede Treiberroutine, die IoAcquireCancelSpinLock aufruft , muss IoReleaseCancelSpinLock so schnell wie möglich aufrufen.
Ein Treiber darf ioCompleteRequest niemals mit einem IRP aufrufen, während er eine Drehsperre hält. Der Versuch, eine IRP abzuschließen, während eine Drehsperre gedrückt wird, kann zu einem Deadlock führen.