Подпрограммы DispatchCleanup
Подпрограмма DispatchCleanup драйвера обрабатывает irp для кода функции ввода-вывода IRP_MJ_CLEANUP .
Драйверы могут использовать подпрограмму DispatchCleanup для выполнения любых операций очистки, необходимых после закрытия всех дескрипторов файлового объекта. Обратите внимание, что DispatchCleanup вызывается в контексте процесса, закрывающего окончательный дескриптор; Этот процесс может отличаться от процесса, который изначально открыл дескриптор. (Обычно это различие происходит из-за того, что другой процесс использует подпрограмму пользовательского режима DuplicateHandle для дублирования дескрипторов процессов.) Драйверы, которые должны выполнять очистку в исходном контексте процесса, могут использовать подпрограмму PsSetCreateProcessNotifyRoutine для регистрации подпрограммы обратного вызова для этой цели, но имейте в виду, что такие обратные вызовы являются ограниченным системным ресурсом.
Как правило, подпрограмма DispatchCleanup должна обрабатывать запрос IRP_MJ_CLEANUP , выполняя следующие действия для каждого IRP, который в настоящее время находится в очереди устройств (или во внутренней очереди irP драйвера) для целевого объекта устройства и связан с объектом файла:
Вызовите IoSetCancelRoutine , чтобы задать для указателя процедуры Отменызначение NULL.
Отмените все IRP, которые в настоящее время находятся в очереди для объекта целевого устройства, если объект файла, указанный в расположении стека ввода-вывода драйвера в очереди IRP, совпадает с объектом файла, полученным в расположении стека ввода-вывода IRP_MJ_CLEANUP запроса.
Вызовите IoCompleteRequest , чтобы завершить IRP, и верните STATUS_SUCCESS.
При обработке запроса IRP_MJ_CLEANUP драйвер может получать дополнительные запросы, такие как IRP_MJ_READ или IRP_MJ_WRITE. Поэтому драйвер, который должен освободить ресурсы, также должен синхронизировать выполнение своей подпрограммы DispatchCleanup с другими подпрограммами диспетчеризации, такими как DispatchRead и DispatchWrite.