Что такое "контекст", используемый для драйвера Windows NT MiniFilter?
Я создал очень простой драйвер для минифильтров как часть урока по минифильтрам. Я также прочитал документацию по минифильтру, которую Microsoft предоставляет в виде документа в формате PDF, а также эту ссылку. Эти руководства объясняют, как настроить контекст и экземпляр. Однако они не объясняют, почему можно использовать контекст и / или экземпляр и для чего они нужны. Мой очень маленький драйвер фильтра использовал NULL как для контекста, так и для экземпляра, и до сих пор работает, поэтому я задаюсь вопросом о сценарии использования этих конструкций.
1 ответ
Есть много причин, по которым вы хотели бы использовать контексты для файлов, томов и т. Д. Конечно, фильтры и даже файловые системы могут работать без них, но производительность будет очень плохой.
Представьте себе такой сценарий: вы являетесь антивирусом (AV) и хотите сканировать некоторые файлы, чтобы проверить, содержат ли они вредоносный код или нет. Вы регистрируете свой минифильтр и обратные вызовы, и теперь вам звонят, и вам нужно принять решение по файлу при его открытии.
Есть несколько шагов:
- Вы запрашиваете имя файла и контекст безопасности
- Вы читаете содержимое файла
- Также можно хэшировать файл с помощью SHA256, чтобы увидеть, например, соответствует ли он в вашей базе данных AV.
- Вы проверяете, имеет ли файл цифровую подпись, также является частью вашей проверки
- Вы анализируете PE-заголовок файла, если он есть, чтобы увидеть, какой это тип файла или исполняемого файла, чтобы помочь вам в вашем решении.
- Вы применяете свою политику к файлу на основе всей информации выше
Теперь давайте предположим, что файл чистый и уходит. Если вы не можете сохранить информацию, которую вы только что узнали о файле, в следующий раз, когда файл откроется, вам придется повторить все заново. Ваша производительность будет отстойной, а ваша ОС рухнет и медленно сгорит.
Здесь контексты пригодятся.
Теперь, когда у вас есть вся эта информация о файле, вы сохраняете ее в своем контексте, который затем связывается с этим файлом. В следующий раз, когда вы увидите файл, вы просто запросите его контекст и получите всю необходимую информацию.
Конечно, некоторые вещи нужно будет обновить, например, если вы заметили, что файл был изменен, вы помечаете его как грязный и обновляете по мере необходимости при следующем обратном вызове Create или Cleanup.
В качестве альтернативы вы можете использовать кеш, где после того, как файл закрыт навсегда и минифильтр хочет освободить контекст, связанный с файлом, вы можете сохранить его самостоятельно. Теперь, когда вы открываете файл в следующий раз, вы ищите контекст файла ( NTFS поддерживает уникальные идентификаторы файлов для файлов) и просто связываете его с вашим файлом и сразу знаете все, что вам нужно знать об этом файле.
Это только одно использование, но теперь вы можете сами подумать о многих других сценариях, где они полезны.