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


Рутины DispatchCleanup

Подпрограмма DispatchCleanup драйвера обрабатывает IRPs для кода функции ввода-вывода IRP_MJ_CLEANUP.

Драйверы могут использовать подпрограмму DispatchCleanup, чтобы выполнять очистку, необходимую после закрытия всех дескрипторов объекта файла. Обратите внимание, что DispatchCleanup вызывается в среде выполнения процесса, который закрывает окончательный дескриптор; этот процесс может отличаться от процесса, который изначально открыл дескриптор. (Как правило, это различие происходит, так как другой процесс использует подпрограмму режима пользователя DuplicateHandle для дублирования дескрипторов процессов.) Драйверы, которые должны выполнять очистку в исходном контексте процесса, могут использовать подпрограмму PsSetCreateProcessNotifyRoutine для регистрации подпрограммы обратного вызова для этой цели, но помните, что такие обратные вызовы являются ограниченным системным ресурсом.

Как правило, подпрограмма DispatchCleanup должна обрабатывать запрос IRP_MJ_CLEANUP , выполняя следующие действия для каждого IRP, который в настоящее время находится в очереди устройства (или в внутренней очереди irPs драйвера) для целевого объекта устройства и связан с объектом файла:

  • Вызовите IoSetCancelRoutine , чтобы задать указатель подпрограммы Cancel на NULL.

  • Отмените каждую IRP, которая в данный момент находится в очереди для целевого объекта устройства, если файловый объект, указанный в расположении стека ввода-вывода драйвера для поставленной в очередь IRP, соответствует файловому объекту, полученному в расположении стека ввода-вывода запроса IRP_MJ_CLEANUP.

  • Вызовите IoCompleteRequest , чтобы завершить IRP и вернуть STATUS_SUCCESS.

При обработке запроса IRP_MJ_CLEANUP драйвер может получать дополнительные запросы, такие как IRP_MJ_READ или IRP_MJ_WRITE. Таким образом, драйвер, который должен освободить ресурсы, также должен синхронизировать выполнение своей подпрограммы DispatchCleanup с другими подпрограммами отправки, такими как DispatchRead и DispatchWrite.