IoCompletion-Routinen des Speicherklassentreibers
Ein Speicherklassentreiber muss über eine oder mehrere IoCompletion-Routinen verfügen, es sei denn, der Treiber wartet synchron auf den Abschluss jedes IRP, das er an den Porttreiber sendet, wiederholt Anforderungen nach Bedarf und gibt dann Arbeitsspeicher für SRBs aus einer Dispatch- oder BuildRequest-Routine frei. Beachten Sie, dass die synchrone Behandlung jedes IRP die Leistung des Klassentreibers beeinträchtigt. Darüber hinaus müssen Speicherklassentreiber für Geräte, die möglicherweise die Systemseitendatei enthalten, alle Übertragungsanforderungen asynchron verarbeiten und daher über eine IoCompletion-Routine für Lese-/Schreibanforderungen verfügen.
Wie unter BuildRequest-Routine des Speicherklassentreibers beschrieben, sind Speicherklassentreiber für die Freigabe des Arbeitsspeichers verantwortlich, den sie für SRBs zuweisen, sei es zurück zu einer Lookaside-Liste oder zu einem nicht ausgelagerten Pool. Wie jeder andere Kernelmodustreiber auf höherer Ebene sind sie auch für die Freigabe aller IRPs verantwortlich, die sie zuordnen, z. B. ein IRP zum Aufteilen einer Übertragungsanforderung, wie unter SplitTransferRequest Routine des Speicherklassentreibers beschrieben.
Die IoCompletion-Routine eines Klassentreibers ist letztendlich dafür verantwortlich, sicherzustellen, dass der E/A-status-Block festgelegt ist, und für das Abschließen des ursprünglichen IRP. Beachten Sie, dass das Abschließen eines IRP die Übersetzung eines Fehlers, der im ScsiStatus-Member oder SenseInfoBuffer-Member des SRB zurückgegeben wird, in einen WERT vom Typ NTSTATUS und/oder das Protokollieren eines Fehlers umfassen kann, wie unter Abschließen von IRPs in Dispatch-Routinen beschrieben.
Wenn bestimmte Arten von Fehlern bei der Verarbeitung einer Anforderung auftreten, friert ein Speicherporttreiber seine interne Warteschlange für die Ziel-LU (Logical Unit) ein und legt SRB_STATUS_QUEUE_FROZEN nach Abschluss der Anforderung fest. Daher verfügen Klassentreiber in der Regel über interne Routinen, um die status der Warteschlange für ihre Geräte-E/A-Anforderungen zu ändern. Weitere Informationen finden Sie unter ReleaseQueue-Routine des Speicherklassentreibers.
Wenn die BuildRequest-Routine des Treibers angefordert hat, dass der Porttreiber Informationen zur Anforderungsoptimierung für eine Anforderung zurückgibt, ruft seine IoCompletion-Routine entweder eine interne InterpretRequestSense-Routine auf oder implementiert die gleiche Funktionalität inline. Weitere Informationen finden Sie unter InterpretRequestSense-Routine des Speicherklassentreibers.
Speicherklassentreiber sind für Wiederholungsanforderungen verantwortlich, die aufgrund von Zielcontrollerfehlern, Busrücksetzungen oder Anforderungstimeouts fehlschlagen. Wenn der Porttreiber eine bestimmte Anforderung zurückgibt, deren SrbStatus auf einen solchen Fehler festgelegt ist, kann der Klassentreiber eine RetryRequest-Routine aus seiner IoCompletion-Routine oder möglicherweise aus seiner InterpretRequestSense-Routine aufrufen. Weitere Informationen finden Sie unter Storage Class Driver's RetryRequest Routine.
Allgemeine Informationen zu IoCompletion-Routinen finden Sie unter Abschließen von IRPs.