Sicherstellen, dass die Abschlussverarbeitung bei Safe IRQL ausgeführt wird
Wie unter Schreiben von Postoperation-Rückrufroutinen erwähnt, kann die Postoperation-Rückrufroutine für einen IRP-basierten E/A-Vorgang unter IRQL = DISPATCH_LEVEL aufgerufen werden, es sei denn, die Preoperations-Rückrufroutine des Minifiltertreibers synchronisiert den Vorgang, indem FLT_PREOP_SYNCHRONIZE zurückgegeben wird, oder der Vorgang ist ein Erstellungsvorgang, der inhärent synchron ist. (Weitere Informationen zu diesem Rückgabewert finden Sie unter Zurückgeben von FLT_PREOP_SYNCHRONIZE.)
Bei IRP-basierten E/A-Vorgängen, die noch nicht synchronisiert sind, können Minifiltertreiber jedoch zwei Techniken verwenden, um sicherzustellen, dass die Abschlussverarbeitung bei IRQL <= APC_LEVEL erfolgt.
Die erste Methode besteht darin, dass die Postoperationsrückrufroutine den E/A-Vorgang so lange angibt, bis die Abschlussverarbeitung unter IRQL <= APC_LEVEL ausgeführt werden kann. Dieses Verfahren wird unter Ausstehend eines E/A-Vorgangs in einer Postoperation-Rückrufroutine beschrieben.
Die zweite Technik besteht darin, dass die Postoperation-Rückrufroutine des Minifiltertreibers FltDoCompletionProcessingWhenSafe aufruft. FltDoCompletionProcessingWhenSafe stiftet den E/A-Vorgang nur, wenn die aktuelle IRQL = DISPATCH_LEVEL ist >. Andernfalls führt diese Routine die SafePostCallback-Routine des Minifiltertreibers sofort aus. Dieses Verfahren wird in FltDoCompletionProcessingWhenSafe beschrieben.