Einführung in das Abbrechen von Routinen
Jeder Treiber, in dem IRPs für ein unbestimmtes Intervall in einem ausstehenden Zustand gehalten werden können, muss über eine oder mehrere Cancel-Routinen verfügen. Beispielsweise kann ein Tastaturtreiber unbegrenzt warten, bis ein Benutzer eine Taste drückt. Wenn ein Treiber jedoch nie mehr IRPs in die Warteschlange stellt, als er in fünf Minuten abschließen kann, benötigt er wahrscheinlich keine Cancel-Routine .
Angenommen, ein Benutzermodusthread stellt eine E/A-Anforderung, die von der Dispatchroutine eines Gerätetreibers auf höchster Ebene in die Warteschlange gestellt wird, und der anfordernde Thread wird beendet, während sich die IRP in der Warteschlange befindet. IRPs, die im Namen eines beendeten Threads in die Warteschlange gestellt werden, sollten abgebrochen werden. Folglich muss der Treiber eine vom Treiber bereitgestellte Cancel-Routine in jeder IRP festlegen, die er in die Warteschlange stellt.
Ein Treiber, der zugeordnete IRPs erstellt, muss diese abbrechen, wenn die master IRP abgebrochen wird. Da zugeordnete IRPs keinem anfordernden Thread zugeordnet sind, ist die master Abbrechen-Routine des IRP für das Abbrechen aller zugehörigen IRPs verantwortlich, wenn die master IRP abgebrochen wird.
Die Anzahl der Abbruchroutinen eines Treibers hängt vom Design des Treibers ab. Im Allgemeinen sollte ein Treiber über eine Cancel-Routine für jede Phase seiner E/A-Verarbeitung verfügen, in der ein IRP für ein unbegrenztes Intervall in einem ausstehenden Zustand gehalten werden kann. Solche ausstehenden IRPs sollen in einem abbrechbaren Zustand gehalten werden.
Beachten Sie die folgenden Entwurfsrichtlinien:
Der Treiber der höchsten Ebene in einer Kette von mehrstufigen Treibern muss mindestens eine Cancel-Routine aufweisen, wenn IRPs in die Warteschlange gestellt werden oder IRPs anderweitig in einem abbrechbaren Zustand enthalten sind. Bei Bedarf kann es mehrere Cancel-Routinen geben.
Treiber auf niedrigerer Ebene, in denen IRPs für relativ lange Intervalle in einem abbrechbaren Zustand gehalten werden können, sollten ebenfalls über eine oder mehrere Cancel-Routinen verfügen.
Wenn ein Treiber seine eigenen internen Warteschlangen von IRPs verwaltet, sollte er über eine separate Cancel-Routine für jede seiner Warteschlangen verfügen.
Einige Treiber der höchsten Ebene für interaktive Geräte, z. B. Tastatur, Maus, Sound, parallele Klasse und serielle Treiber, müssen über Cancel-Routinen verfügen. Einige Treiber auf niedrigerer Ebene, z. B. ein paralleler Porttreiber, der IRPs enthält, die für eine bestimmte Anzahl von Treibern höherer Klasse für relativ lange Intervalle in die Warteschlange gestellt werden, sollten auch Über Cancel-Routinen verfügen.
Es ist unwahrscheinlich, dass Massenspeichergerätetreiber und zwischengeschaltete Treiber über sie verfügen, über Abbruchroutinen . Es liegt in der Verantwortung eines Dateisystemtreibers, das Abbrechen von Datei-E/A-Anforderungen zu verarbeiten, während die IRPs-Eingaben für Treiber für Massenspeicher auf niedrigerer Ebene in der Regel zu schnell verarbeitet werden, um abzubrechen.