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


Ошибки при обработке операций очистки и закрытия

Некоторые драйверы не могут различать задачи, необходимые в подпрограммах DispatchCleanup и DispatchClose . Диспетчер операций ввода-вывода вызывает подпрограмму DispatchCleanup драйвера при закрытии последнего дескриптора файлового объекта. Подпрограмма DispatchClose вызывается при освобождении последней ссылки из объекта файла. Драйвер не должен пытаться освободить ресурсы в своей подпрограмме DispatchCleanup , которые присоединены к объекту файла или могут использоваться другими подпрограммами DispatchXxx.

При вызове подпрограмм диспетчера операций ввода-вывода хранится ссылка на файловый объект для обычных вызовов ввода-вывода. В результате драйвер может получать запросы ввода-вывода для файлового объекта после вызова подпрограммы DispatchCleanup , но до вызова подпрограммы DispatchClose . Например, вызывающий объект пользовательского режима может закрыть дескриптор файла во время выполнения запроса диспетчера ввода-вывода из другого потока. Если драйвер удалил или освободил необходимые ресурсы до того, как диспетчер ввода-вывода вызовет свою подпрограмму DispatchClose , могут возникнуть недопустимые ссылки на указатели и другие проблемы.