Здравствуйте, 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
Уважаемые коллеги,помогите пожалуйста!
Написан минифильтр-драйвер файловой системы, для прерывания команд на открытие, создание, переименование и удаление файлов.
Принцип работы следующий — если операция подпадает под заданные условия, ее выполнение блокироется через возврат 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. Так ли это? И как можно решить эту проблему?
А может проблема в другом?
Здравствуйте, 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
Касательно файловой системы не знаю. Возможно просто эта ошибка возникает раньше и уже ее статус передается файловой системе.
UR>Есть предположение, что эксплорер шлет CancelIrp. Так ли это? И как можно решить эту проблему?
Нашел функцию FltSetCancelCompletion, которая по идее должна назначить функцию на отмену I/O операции.
Вызывал ее в операции удаления файла,
status = FltSetCancelCompletion( Data, SetInfoCancelCallback);
однако вызов этой функции не произошел. Значит explorer CancelIrp не вызывает.
Что же тогда это может быть?