Мини-фильтр перехватывает перетаскивание файлов на диск?

Я разрабатываю мини-фильтр для перехвата файлов и получения имен файлов, которые перетаскиваются на конкретный диск, и получения имен файлов.

Если я перетаскиваю файл, я могу получить это имя и успешно перехватить его (это значит, что этот файл не создан на диске).

Если я перетаскиваю несколько файлов, я могу получить только первое имя файла, а другое нет. Но когда я открываю диск, я не вижу здесь никакого файла (это значит, что мини-фильтр успешно перехватывает их). Поэтому я не могу получить имена файлов (кроме первого файла)

Я перехватываю drag & drop, перенаправляя их:

  1. Получить имя файла с помощью FltGetFileNameInformation(), а затем FltParseFileNameInformation()
  2. Разделить его на две части
    • Во-первых, это: \Device\HarddiskVolume1\folder\
    • Второй: file.ext
  3. Добавьте имя файла для первой части: \Device\HarddiskVolume1\folder\new_file.ext
  4. Перехватить создание на диске
    • Освободите этот буфер: 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 ответа

Решение

Я обнаружил, что:

  1. Получить имя файла из Data->Iopb->TargetFileObject->FileName

    • Слайп это две части: путь к файлу и имя файла
    • Измените имя файла на имя файла перенаправления
  2. Удалить имя файла перенаправления. Этот шаг можно запустить до шага № 1

    • Если имя файла перенаправления не существует, возвращается STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034). Это не проблема для системы.
    • Если имя файла перенаправления существует. Все в порядке.

Убедитесь, что вы проверите образец simrep от Microsoft, который покажет вам, как правильно это сделать. Я бы не основывал свое предположение, что Drag&Drop имеет соответствие в ядре и в файловой системе. Он может быть реализован в пользовательском режиме многими способами, особенно если вы делаете это на том же томе. Это может быть так же просто, как переименовать. Также имейте в виду жесткие ссылки и символические ссылки и альтернативные потоки данных.

Удачи.

Другие вопросы по тегам