Самый быстрый способ передать содержимое файла из ядра в режим пользователя? - PullRequest
3 голосов
/ 16 февраля 2010

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 17 февраля 2010

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

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