Freigeben über


Synchronisieren des Abbruchs in Higher-Level Treibern ohne Abbruchroutinen

Ein Treiber auf höherer Ebene kann keine Annahmen darüber treffen, ob oder wie vorhandene Treiber auf niedrigerer Ebene abbrechbare IRPs verarbeiten. Sobald ein höherer Treiber IoCallDriver für ein IRP aufruft, besitzt er dieses IRP nicht mehr und kann die Verarbeitung des IRP durch Treiber niedrigerer Ebene weder ermitteln noch steuern.

Jeder Treiber auf höherer Ebene kann jedoch eine IoCompletion-Routine für ein IRP festlegen, indem er IoSetCompletionRoutine aufruft, bevor IoCallDriver aufgerufen wird. Der Treiber auf höherer Ebene kann bestimmen, ob ein ausstehender IRP in einem niedrigeren Treiber abgebrochen wird, indem er IoSetCompletionRoutine aufruft, wobei der InvokeOnCancel-Parameter auf TRUE festgelegt ist, bevor er die IRP an niedrigere Treiber übergibt. Dadurch wird sichergestellt, dass die IoCompletion-Routine des Treibers aufgerufen wird, unabhängig davon, ob die IRP abgebrochen oder abgeschlossen wird.

Ein Treiber auf höherer Ebene kann IoCancelIrp mit jedem ausstehenden IRP aufrufen, den der Treiber zugewiesen hat. Durch diesen Aufruf wird jedoch nicht sichergestellt, dass der vom Treiber zugewiesene IRP mit dem E/A-status-Block abgeschlossen wird, der auf STATUS_CANCELLED festgelegt ist. Möglicherweise wird der IRP bereits von einem anderen Thread abgeschlossen. Um zu überprüfen, ob das IRP abgebrochen wurde, muss der Treiber der höheren Ebene IoSetCompletionRoutine aufrufen, wobei der InvokeOnCancel-Parameter auf TRUE festgelegt ist, bevor das IRP an den nächstniedrigen Treiber übergeben wird. Weitere Informationen zu Abschlussroutinen finden Sie unter Abschließen von IRPs .

Ein Treiber auf höherer Ebene darf IoCancelIrp nicht mit einem IRP aufrufen, den er nicht zugewiesen hat.