Partilhar via


Garantir que o processamento de conclusão seja executado em IRQL seguro

Conforme observado em Escrevendo rotinas de retorno de chamada de postoperation, a rotina de retorno de chamada de postoperation para uma operação de E/S baseada em IRP pode ser chamada em IRQL = DISPATCH_LEVEL, a menos que a rotina de retorno de chamada de pré-operação do driver de minifiltro sincronizou a operação retornando FLT_PREOP_SYNCHRONIZE ou a operação é uma operação de criação, que é inerentemente síncrona. (Para obter mais informações sobre esse valor retornado, consulte Retornando FLT_PREOP_SYNCHRONIZE.)

No entanto, para operações de E/S baseadas em IRP que ainda não estão sincronizadas, os drivers de minifiltro podem usar duas técnicas para garantir que o processamento de conclusão seja executado em IRQL <= APC_LEVEL.

A primeira técnica é que a rotina de retorno de chamada de postoperation pende a operação de E/S até que o processamento de conclusão possa ser executado em IRQL <= APC_LEVEL. Essa técnica é descrita em Pendente uma Operação de E/S em uma Rotina de Retorno de Chamada de Postoperation.

A segunda técnica é para a rotina de retorno de chamada postoperation do driver de minifiltro chamar FltDoCompletionProcessingWhenSafe. FltDoCompletionProcessingWhenSafe aguarda a operação de E/S somente se o IRQL atual for >= DISPATCH_LEVEL. Caso contrário, essa rotina executará a rotina SafePostCallback do driver de minifiltro imediatamente. Essa técnica é descrita em FltDoCompletionProcessingWhenSafe.