Проблема блокировки удаления файла через explorer
От: URrik81  
Дата: 01.07.10 14:31
Оценка:
Уважаемые коллеги,помогите пожалуйста!
Написан минифильтр-драйвер файловой системы, для прерывания команд на открытие, создание, переименование и удаление файлов.
Принцип работы следующий — если операция подпадает под заданные условия, ее выполнение блокироется через возврат FLT_PREOP_PENDING в FLT_PRE_OPERATION_CALLBACKе.
После этого информация о событие передается в верхнеуровневое приложение, которое через некоторое время (секунды, возможно минуты) возвращает решение(разрешить/запретить) по данному событию драйверу.
Драйвер, получив эту информацию в случает запрета завершает операцию со статусом запрета

Data->IoStatus.Status = STATUS_ACCESS_DENIED;
FltCompletePendedPreOperation( Data, FLT_PREOP_COMPLETE, NULL );


а в случае разрешения продолжает операцию

FltCompletePendedPreOperation( Data, FLT_PREOP_SUCCESS_NO_CALLBACK, NULL );


Все операции работают исправно, кроме удаления файла через explorer.exe: при разрешении отложенного запроса на удаление файл не удаляется, возвращается ошибка INVALID HANDLE. При этом, например, при удалении через Far и ряд анинсталлеров такой проблемы нет.

Есть предположение, что эксплорер шлет CancelIrp. Так ли это? И как можно решить эту проблему?
А может проблема в другом?
Re: Проблема блокировки удаления файла через explorer
От: x64 Россия  
Дата: 01.07.10 15:14
Оценка:
UR>...возвращается ошибка INVALID HANDLE.

Куда возвращается? При вызове FltCompletePendedPreOperation() с кодом FLT_PREOP_SUCCESS_NO_CALLBACK у тебя уже нет возможности узнать о результатах завершения запроса файловой системой, поэтому и справшиваю, — где ты увидел эту ошибку? И кроме того, код ошибки STATUS_INVALID_HANDLE, если я правильно тебя понял, не может быть возвращён файловой системой, по той простой причине, что она с хендлами не работает вообще.
Re[2]: Проблема блокировки удаления файла через explorer
От: URrik81  
Дата: 01.07.10 16:02
Оценка:
Здравствуйте, x64, Вы писали:

UR>>...возвращается ошибка INVALID HANDLE.


x64>Куда возвращается? При вызове FltCompletePendedPreOperation() с кодом FLT_PREOP_SUCCESS_NO_CALLBACK у тебя уже нет возможности узнать о результатах завершения запроса файловой системой, поэтому и справшиваю, — где ты увидел эту ошибку? И кроме того, код ошибки STATUS_INVALID_HANDLE, если я правильно тебя понял, не может быть возвращён файловой системой, по той простой причине, что она с хендлами не работает вообще.


Во-первых сам эксплорер выбрасывает окно с Invalid file handle.
Во-вторых вот лог с FileMon:
Результат по explorer.exe:

    292 11:16:21.313 AM explorer.exe:1120 IRP_MJ_CREATE C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS Options: Open Access: 00010080
    293 11:16:21.313 AM explorer.exe:1120 IRP_MJ_QUERY_INFORMATION C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS FileAttributeTagInformation
    294 11:16:21.313 AM explorer.exe:1120 IRP_MJ_SET_INFORMATION C:\Documents and Settings\alex\Desktop\New Text Document (3).txt INVALID HANDLE Delete
    295 11:16:25.038 AM explorer.exe:1120 IRP_MJ_CLEANUP C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS
    296 11:16:25.038 AM explorer.exe:1120 IRP_MJ_CLOSE C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS
    297 11:16:25.038 AM explorer.exe:1120 FASTIO_QUERY_OPEN C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS Attributes: A

Результат по Far.exe:

    320 11:17:12.867 AM Far.exe:760 IRP_MJ_CREATE C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS Options: Open Access: 00010080
    321 11:17:12.867 AM Far.exe:760 IRP_MJ_QUERY_INFORMATION C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS FileAttributeTagInformation
    322 11:17:12.867 AM Far.exe:760 IRP_MJ_SET_INFORMATION C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS Delete

    324 11:17:14.970 AM Far.exe:760 IRP_MJ_CLEANUP C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS
    326 11:17:14.970 AM Far.exe:760 IRP_MJ_CLOSE C:\Documents and Settings\alex\Desktop\New Text Document (3).txt SUCCESS


Касательно файловой системы не знаю. Возможно просто эта ошибка возникает раньше и уже ее статус передается файловой системе.
Re: Проблема блокировки удаления файла через explorer
От: URrik81  
Дата: 02.07.10 11:41
Оценка:
UR>Есть предположение, что эксплорер шлет CancelIrp. Так ли это? И как можно решить эту проблему?

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


status = FltSetCancelCompletion( Data, SetInfoCancelCallback);


однако вызов этой функции не произошел. Значит explorer CancelIrp не вызывает.

Что же тогда это может быть?
Re: Проблема блокировки удаления файла через explorer
От: URrik81  
Дата: 09.07.10 05:14
Оценка: 11 (3)
Здравствуйте, URrik81, Вы писали:

UR>А может проблема в другом?

Проблема решена через подключение к процессу, вызывающему операцию работы с файлом, в момент вызова FltCompletePendedPreOperation

KeStackAttachProcess(pProc, &KState);
FltCompletePendedPreOperation( Data, FLT_PREOP_SUCCESS_NO_CALLBACK, NULL );
KeUnstackDetachProcess(&KState);


Ссылки на описание и решение подобных проблем:
IoCallDriver PASSIVE_LEVEL for IRP_MJ_READ and IRP_MJ_WRITE
Автор: AlexandrSh
Дата: 08.05.03

ZwCreateFile
Автор: Valerio
Дата: 25.04.03
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.