Мини-фильтр перехватывает перетаскивание файлов на диск?
Я разрабатываю мини-фильтр для перехвата файлов и получения имен файлов, которые перетаскиваются на конкретный диск, и получения имен файлов.
Если я перетаскиваю файл, я могу получить это имя и успешно перехватить его (это значит, что этот файл не создан на диске).
Если я перетаскиваю несколько файлов, я могу получить только первое имя файла, а другое нет. Но когда я открываю диск, я не вижу здесь никакого файла (это значит, что мини-фильтр успешно перехватывает их). Поэтому я не могу получить имена файлов (кроме первого файла)
Я перехватываю drag & drop, перенаправляя их:
- Получить имя файла с помощью FltGetFileNameInformation(), а затем FltParseFileNameInformation()
- Разделить его на две части
- Во-первых, это: \Device\HarddiskVolume1\folder\
- Второй: file.ext
- Добавьте имя файла для первой части: \Device\HarddiskVolume1\folder\new_file.ext
- Перехватить создание на диске
- Освободите этот буфер: Data->Iopb->TargetFileObject->FileName.Buffer
- Присвойте первую часть Data-> Iopb-> TargetFileObject-> FileName
- Установите это: Data->Iopb->TargetFileObject->RelatedFileObject = NULL;
- Данные-> IoStatus.Information = IO_REPARSE;
- Data-> IoStatus.Status = STATUS_REPARSE;
- вернуть FLT_PREOP_SUCCESS_NO_CALLBACK;
Выше код может только перехватить все файлы и получить первое имя файла.
Как я могу сделать, чтобы перехватить каждый файл, когда я перетаскиваю несколько файлов?
2 ответа
Я обнаружил, что:
Получить имя файла из Data->Iopb->TargetFileObject->FileName
- Слайп это две части: путь к файлу и имя файла
- Измените имя файла на имя файла перенаправления
Удалить имя файла перенаправления. Этот шаг можно запустить до шага № 1
- Если имя файла перенаправления не существует, возвращается STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034). Это не проблема для системы.
- Если имя файла перенаправления существует. Все в порядке.
Убедитесь, что вы проверите образец simrep от Microsoft, который покажет вам, как правильно это сделать. Я бы не основывал свое предположение, что Drag&Drop имеет соответствие в ядре и в файловой системе. Он может быть реализован в пользовательском режиме многими способами, особенно если вы делаете это на том же томе. Это может быть так же просто, как переименовать. Также имейте в виду жесткие ссылки и символические ссылки и альтернативные потоки данных.
Удачи.