Обеспечение выполнения обработки завершения в безопасной среде 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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по