Проблема блокировки удаления файла через explorer

Тема в разделе "WASM.NT.KERNEL", создана пользователем URrik81, 2 июл 2010.

  1. URrik81

    URrik81 New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2010
    Сообщения:
    1
    Уважаемые коллеги,помогите пожалуйста!
    Написан минифильтр-драйвер файловой системы, для прерывания команд на открытие, создание, переименование и удаление файлов.
    Принцип работы следующий — если операция подпадает под заданные условия, ее выполнение блокироется через возврат FLT_PREOP_PENDING в FLT_PRE_OPERATION_CALLBACKе.
    После этого информация о событие передается в верхнеуровневое приложение, которое через некоторое время (секунды, возможно минуты) возвращает решение(разрешить/запретить) по данному событию драйверу.
    Драйвер, получив эту информацию в случает запрета завершает операцию со статусом запрета

    Код (Text):
    1. Data->IoStatus.Status = STATUS_ACCESS_DENIED;
    2. FltCompletePendedPreOperation( Data, FLT_PREOP_COMPLETE, NULL );
    а в случае разрешения продолжает операцию

    Код (Text):
    1. FltCompletePendedPreOperation( Data, FLT_PREOP_SUCCESS_NO_CALLBACK, NULL );
    Все операции работают исправно, кроме удаления файла через explorer.exe: при разрешении отложенного запроса на удаление файл не удаляется, возвращается ошибка INVALID HANDLE. При этом, например, при удалении через Far и ряд анинсталлеров такой проблемы нет.

    Предположил, что эксплорер шлет CancelIrp.
    Для проверки использовал функцию FltSetCancelCompletion, которая по идее должна назначить функцию на отмену I/O операции.
    Вызывал ее в операции удаления файла,

    Код (Text):
    1. status = FltSetCancelCompletion( Data, SetInfoCancelCallback);
    однако вызов этой функции не произошел. Значит explorer CancelIrp не вызывает.

    Что же тогда это может быть?