Самый быстрый способ передать содержимое файла из ядра в пользовательский режим?

StackOverflow https://stackoverflow.com/questions/2276044

Вопрос

Я постараюсь быть кратким, но полностью описательным:

Это зависит от Windows.Использование комплекта разработки драйверов Windows (DDK).

Я впервые пишу драйвер режима ядра (KMD), не имея предыдущего опыта работы в режиме ядра.В настоящее время я играю с образцом мини-фильтра "сканер", который поставляется вместе с DDK, и расширяю его для практики.Мини-фильтр "сканер" - это базовая схема универсального драйвера сканирования типа "антивирус", который отслеживает создание / закрытие файла и работает с соответствующим файлом для проверки на наличие "плохого слова", прежде чем одобрить / отклонить запрошенную операцию.

Конечная цель состоит в том, чтобы просканировать файл с помощью приложения пользовательского режима при его открытии, решая, должен ли мини-фильтр позволить завершить операцию без заметного замедления процесса или пользователя, который пытается открыть файл.Я также захочу еще раз просканировать весь файл при попытке сохранения, чтобы решить, следует ли разрешить успешное завершение сохранения или запретить сохранение.Пример мини-фильтра описывает основу для того, как перехватывать эти вызовы, но он немного слабоват в части собственно "сканирования".

Я рассматриваю возможность расширения выборки для сканирования всего файла, который был открыт, например, для генерации хэша, а не только первого 1k (ограничение выборки).Я изменил образец, чтобы прочитать файл целиком и отправить его, используя те же механизмы, что и в исходном образце.Этот метод использует FltReadFile чтобы прочитать файл в KMD и FltSendMessage чтобы отправить буфер компоненту пользовательского режима.Приложение пользовательского режима использует GetQueuedCompletionStatus чтобы получать уведомления из KMD и обрабатывать буферы.

Однако я замечаю, что этот процесс кажется довольно медленным по сравнению с обычным открытием / чтением на C ++ с использованием стандартной библиотеки (fstream).Этот метод занимает примерно в 4-8 раз больше времени, чем простое открытие и чтение файла в простом пользовательском приложении на C ++.Я скорректировал размеры буфера, чтобы посмотреть, приведет ли это к заметному улучшению, и хотя это может немного помочь, преимущества оказались не очень значительными.

Поскольку я хочу сканировать файлы в режиме "реального времени", такая скорость передачи крайне разочаровывает и непомерно высока.Есть ли более быстрый способ перенести содержимое файла из драйвера режима ядра в приложение пользовательского режима?

Это было полезно?

Решение

Я могу предложить несколько решений:

  1. Используйте DeviceIoControl с типом передачи METHOD_OUT_DIRECT для передачи больших объемов данных.
  2. Создайте раздел памяти и сопоставьте его с вашим процессом (помните об ограниченном адресном пространстве на 32-разрядных платформах).
  3. Передайте путь к файлу вашему приложению и откройте его там.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top