Я постараюсь быть кратким, но полностью описательным:
Это зависит от Windows. Использование пакета разработки драйверов Windows (DDK).
Я пишу драйвер режима ядра (KMD) впервые, не имея опыта работы в режиме ядра. Сейчас я играю с образцом мини-фильтра «сканер», который идет в комплекте с DDK, и расширяю его для практики. Мини-фильтр «сканер» - это базовая схема для универсального драйвера сканирования «антивирусного» типа, который перехватывает файл, создает / закрывает файл и обрабатывает связанный файл для поиска «плохого слова» перед утверждением / отклонением запрошенной операции.
Конечная цель состоит в том, чтобы сканировать файл в приложении пользовательского режима при его открытии, решая, должен ли мини-фильтр позволять завершать операцию, без заметного замедления процесса или пользователя, который пытается открыть файл. Я также хочу снова просканировать весь файл, когда попытка сохранения решает, разрешить или нет сохранение успешно или нет. Образец мини-фильтра закладывает основу для перехвата этих вызовов, но в части «сканирования» он немного слабоват.
Я смотрю на расширение образца для сканирования всего файла, который был открыт, например, для создания хэша, а не только для первого 1k (предел образца). Я изменил образец, чтобы прочитать весь файл и отправить его, используя те же механизмы в исходном образце. Этот метод использует FltReadFile
для чтения файла в KMD и FltSendMessage
для отправки буфера компоненту пользовательского режима. Приложение пользовательского режима использует GetQueuedCompletionStatus
для получения уведомлений от KMD и обработки буферов.
Однако я заметил, что этот процесс выглядит довольно медленным по сравнению с обычным открытием / чтением в C ++ с использованием стандартной библиотеки (fstream). Этот метод занимает примерно в 4-8 раз больше времени, чем простое открытие и чтение файла в простом пользовательском приложении C ++. Я отрегулировал размеры буфера, чтобы увидеть, насколько это заметно, и хотя это может немного помочь, выгоды оказались не очень значительными.
Поскольку я ищу для сканирования файлов в режиме реального времени, эта скорость передачи очень разочаровывающая и непомерно высокая. Существует ли более быстрый способ передачи содержимого файла из драйвера режима ядра в приложение пользовательского режима?