Что такое "контекст", используемый для драйвера Windows NT MiniFilter?

Я создал очень простой драйвер для минифильтров как часть урока по минифильтрам. Я также прочитал документацию по минифильтру, которую Microsoft предоставляет в виде документа в формате PDF, а также эту ссылку. Эти руководства объясняют, как настроить контекст и экземпляр. Однако они не объясняют, почему можно использовать контекст и / или экземпляр и для чего они нужны. Мой очень маленький драйвер фильтра использовал NULL как для контекста, так и для экземпляра, и до сих пор работает, поэтому я задаюсь вопросом о сценарии использования этих конструкций.

1 ответ

Решение

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

Представьте себе такой сценарий: вы являетесь антивирусом (AV) и хотите сканировать некоторые файлы, чтобы проверить, содержат ли они вредоносный код или нет. Вы регистрируете свой минифильтр и обратные вызовы, и теперь вам звонят, и вам нужно принять решение по файлу при его открытии.

Есть несколько шагов:

  1. Вы запрашиваете имя файла и контекст безопасности
  2. Вы читаете содержимое файла
  3. Также можно хэшировать файл с помощью SHA256, чтобы увидеть, например, соответствует ли он в вашей базе данных AV.
  4. Вы проверяете, имеет ли файл цифровую подпись, также является частью вашей проверки
  5. Вы анализируете PE-заголовок файла, если он есть, чтобы увидеть, какой это тип файла или исполняемого файла, чтобы помочь вам в вашем решении.
  6. Вы применяете свою политику к файлу на основе всей информации выше

Теперь давайте предположим, что файл чистый и уходит. Если вы не можете сохранить информацию, которую вы только что узнали о файле, в следующий раз, когда файл откроется, вам придется повторить все заново. Ваша производительность будет отстойной, а ваша ОС рухнет и медленно сгорит.

Здесь контексты пригодятся.

Теперь, когда у вас есть вся эта информация о файле, вы сохраняете ее в своем контексте, который затем связывается с этим файлом. В следующий раз, когда вы увидите файл, вы просто запросите его контекст и получите всю необходимую информацию.

Конечно, некоторые вещи нужно будет обновить, например, если вы заметили, что файл был изменен, вы помечаете его как грязный и обновляете по мере необходимости при следующем обратном вызове Create или Cleanup.

В качестве альтернативы вы можете использовать кеш, где после того, как файл закрыт навсегда и минифильтр хочет освободить контекст, связанный с файлом, вы можете сохранить его самостоятельно. Теперь, когда вы открываете файл в следующий раз, вы ищите контекст файла ( NTFS поддерживает уникальные идентификаторы файлов для файлов) и просто связываете его с вашим файлом и сразу знаете все, что вам нужно знать об этом файле.

Это только одно использование, но теперь вы можете сами подумать о многих других сценариях, где они полезны.

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