DispatchReadWrite in Higher-Level-Treibern
Mit Ausnahme von Dateisystemtreibern verfügt ein Treiber auf höherer Ebene in der Regel über keine internen Treiberwarteschlangen für IRPs. Eine solche DispatchReadWrite-Routine eines Treibers kann IRPs mit gültigen Parametern an niedrigere Treiber übergeben, möglicherweise nach dem Einrichten der IoCompletion-Routine , wie unter Übergeben von IRPs im Treiberstapel beschrieben.
Die DispatchReadWrite-Routine eines SCSI-Klassentreibers ist jedoch für das Aufteilen großer Übertragungsanforderungen zuständig, falls erforderlich, bevor ein IRP mit dem Hauptfunktionscode IRP_MJ_READ oder IRP_MJ_WRITE an das SCSI-Port/Miniporttreiberpaar gesendet wird. Weitere Informationen finden Sie unter SplitTransferRequest Routine des Speicherklassentreibers.
Wenn ein Treiber auf höherer Ebene eine oder mehrere IRPs zuordnet, die er für den nächstniedrigen Treiber in seiner DispatchReadWrite-Routine eingerichtet hat, um eine bestimmte Anzahl von Teilübertragungen anzufordern, muss die DispatchReadWrite-RoutineIoSetCompletionRoutine mit jedem vom Treiber zugewiesenen IRP aufrufen. Der Treiber muss seine IoCompletion-Routine registrieren, um nachzuverfolgen, wie viele Daten in jedem Teilübertragungsvorgang übertragen werden, damit die IoCompletion-Routine alle vom Treiber zugewiesenen IRPs freigeben und schließlich die ursprüngliche Anforderung abschließen kann.
Wenn der zugrunde liegende Treiber ein Wechselmediengerät steuert, müssen alle IRPs, die vom Treiber auf höherer Ebene zugeordnet werden, über einen Threadkontext verfügen. Um einen Threadkontext einzurichten, muss der Zuweisungstreiber Irp-Tail.Overlay> festlegen. Thread in jedem neu zugeordneten IRP vom gleichen Wert im eingehenden Übertragungs-IRP. Weitere Informationen finden Sie unter Unterstützen von Wechselmedien.
Wenn der zugrunde liegende Gerätetreiber einen IRP für eine teilseitige Übertragung mit einem Fehler zurückgibt, kann die IoCompletion-Routine entweder die Anforderung für die Teilübertragung wiederholen oder den ursprünglichen IRP mit dem E/A-status block abschließen, der mit dem zurückgegebenen Fehler festgelegt ist, nachdem alle IRPs und Arbeitsspeicher freigegeben wurden, die der Treiber auf höherer Ebene zugewiesen hat.
Wenn die DispatchReadWrite-Routine eines Treibers auf höherer Ebene Arbeitsspeicher für Teilübertragungsvorgänge zuweist und auf die Zuweisung durch die IoCompletion-Routine des Treibers (oder durch den zugrunde liegenden Gerätetreiber) zugegriffen wird, muss die DispatchReadWrite-Routine diesen Arbeitsspeicher aus einem nicht auslagerungsfreien Pool zuordnen.