Поделиться через


Обеспечение выполнения обработки завершения в безопасной среде IRQL

Как указано в статье Написание процедур обратного вызова после операции, подпрограмма обратного вызова после операции ввода-вывода на основе IRP может вызываться в irQL = DISPATCH_LEVEL, если только подпрограмма обратного вызова драйвера минифильтра не синхронизировала операцию, возвращая FLT_PREOP_SYNCHRONIZE или операция создания, которая по своей сути является синхронной. (Дополнительные сведения об этом возвращаемом значении см. в разделе Возврат FLT_PREOP_SYNCHRONIZE.)

Однако для операций ввода-вывода на основе IRP, которые еще не синхронизированы, драйверы минифильтра могут использовать два метода, чтобы гарантировать, что обработка завершения выполняется в IRQL <= APC_LEVEL.

Первый способ заключается в том, чтобы подпрограмма обратного вызова после операции выполняла операцию ввода-вывода до тех пор, пока обработка завершения не будет выполнена в IRQL <= APC_LEVEL. Этот метод описан в разделе Ожидание операции ввода-вывода в процедуре обратного вызова после операции.

Второй способ заключается в том, чтобы подпрограмма обратного вызова драйвера минифильтра после операции вызывала FltDoCompletionProcessingWhenSafe. FltDoCompletionProcessingWhenSafe выполняет операцию ввода-вывода, только если текущий irQL = >DISPATCH_LEVEL. В противном случае эта подпрограмма немедленно выполняет подпрограмму SafePostCallback драйвера минифильтра. Этот способ описан в статье FltDoCompletionProcessingWhenSafe.