S’assurer que le traitement d’achèvement est effectué au niveau de l’IRQL sécurisé
Comme indiqué dans Écriture de routines de rappel de postopération, la routine de rappel postopératoire pour une opération d’E/S basée sur IRP peut être appelée dans IRQL = DISPATCH_LEVEL, sauf si la routine de rappel de préopération du pilote minifilter a synchronisé l’opération en retournant FLT_PREOP_SYNCHRONIZE ou si l’opération est une opération de création, qui est intrinsèquement synchrone. (Pour plus d’informations sur cette valeur de retour, consultez Retour FLT_PREOP_SYNCHRONIZE.)
Toutefois, pour les opérations d’E/S basées sur IRP qui ne sont pas déjà synchronisées, les pilotes minifilter peuvent utiliser deux techniques pour s’assurer que le traitement d’achèvement est effectué à IRQL <= APC_LEVEL.
La première technique consiste à ce que la routine de rappel postopératoire pende l’opération d’E/S jusqu’à ce que le traitement de fin puisse être effectué à IRQL <= APC_LEVEL. Cette technique est décrite dans En attente d’une opération d’E/S dans une routine de rappel de postopération.
La deuxième technique consiste à la routine de rappel postopératoire du pilote minifilter pour appeler FltDoCompletionProcessingWhenSafe. FltDoCompletionProcessingWhenSafe met en attente l’opération d’E/S uniquement si l’IRQL actuel est >= DISPATCH_LEVEL. Sinon, cette routine exécute immédiatement la routine SafePostCallback du pilote minifilter. Cette technique est décrite dans FltDoCompletionProcessingWhenSafe.