Как перехватить попытки доступа к файлу с помощью драйвера фильтра (ядро) и предложить диалог для разрешения / запрета (пользователь)?

мы смотрели на WindowsДрайверы фильтров файловой системы, Я начал с этогоFsFilter» пример:

http://www.codeproject.com/Articles/43586/File-System-Filter-Driver-Tutorial

С усилием мне удалось собрать его и подписать в версиях, которые работают на всем: от 64-битной Win8 до 32-битной WinXP.(Ну пока бегаюBcdedit.exe -set TESTSIGNING ON чтобы он мог принять мой сертификат испытаний, так как я неt заплатить Microsoft $ 250, чтобы подписать мой файл .SYS. : - /)

Теперь я хочу изменить FsFilter. Я'Я хотел бы получить доступ для записи к определенным типам файлов, которые будут перехвачены фильтром. Затем я хочу, чтобы пользователь получил диалоговое окно, в котором он может разрешить доступ или запретить его.

Возможно, очевидно ... код режима ядра не может отображать пользовательский интерфейс. Он должен будет сигнализировать о некотором процессе пользовательского режима, который (после произвольно скрытого периода времени) сообщит пользователю 'Желание водителя. Я'я посмотрел немногоВзаимодействие в пользовательском режиме: рекомендации для драйверов режима ядра (ЗдесьGoogle»Кэш как HTMLвместо .DOC)

Я неНе знаю, как лучше атаковать это. Единственный пример, который яЯ нашел для изучения SysInternals FileMon. Установленный драйвер собирает данные в буфер, который периодически запрашивается .EXE в соответствии с циклом WM_TIMER:

// Have driver fill Stats buffer with information
if ( ! DeviceIoControl( SysHandle, IOCTL_FILEMON_GETSTATS,
            NULL, 0, &Stats, sizeof Stats,
            &StatsLen, NULL ) )
{
    Abort( hWnd, _T("Couldn't access device driver"), GetLastError() );
    return TRUE;
}

Должен ли я использовать подобную технику? Возможно, драйвер фильтра после получения запроса, который он хочет проверить, может поместить запись для отслеживания запроса в буфер, который будет содержать два объекта HEVENT. Затем было бы WaitForMultipleObjects на этих двух HEVENT, которые представляют сигнализированный "ДА" или же "НЕТ» из режима пользователя о том, разрешить ли доступ.

Периодически процесс мониторинга (запущенный в пользовательском режиме) будет опрашивать драйвер из другого потока, используя собственный IOCTL. Драйвер фильтра будет возвращать информацию о запросе ... а также два события, которые ожидает запрос. Монитор будет ждать пользователяс обратной связью, и когда доступно, сигнализируют соответствующее событие.

Я мог бы также инвертировать эту модель. Код пользовательского режима может использовать пользовательский IOCTL для передачи данных ... таких как HEVENT, которые могут сигнализироваться драйвером, и просто реализовывать какой-то безопасный протокол. Это исключило бы необходимость опроса.

В основном просто ищу руководство по методу или рабочий пример в Интернете! Я'Мне также было бы интересно узнать, какова будет механика асинхронного доступа к файлам. Я предполагаю, что тамЕсть ли способ, чтобы клиент, выполняющий проверяемый асинхронный вызов, мог продолжать работу и задерживаться только тогда, когда он ждал завершения запроса ...?

(Примечание: на пути к созданию и отладке фильтров я узнал, что есть несколько более современных методов через "минифильтры»- которые являются частью чего-то под названиемМодель диспетчера фильтров, Но на данный момент яМеня это не касается, если поддерживается устаревшая модель. Это выглядит довольно похоже в любом случае.)

 Rohan23 мая 2013 г., 15:15
По-прежнему будет предлагать взглянуть на минифильтры, в которых значительно упрощен способ работы. В двух словах, вы можете сделать запрос от ядра на блокировку пользователя, чтобы проверить доступ, а затем разрешить / запретить доступ.
 HostileFork23 мая 2013 г., 18:18
@Rohan Ах ... как-то я пропустилэтот последний разговор в плюсах:Диспетчер фильтров предоставляет общие функциональные возможности для служб пользовательского режима и управляющих программ, которые работают с драйверами минифильтров. Библиотека пользовательского режима диспетчера фильтров Filterlib.dll обеспечивает связь между службой пользовательского режима или управляющей программой и драйвером минифильтра. Filterlib.dll также предоставляет интерфейсы для инструментов управления. "  Может быть, именно то, что я хочу, япосмотрим на это!

Ответы на вопрос(1)

Решение Вопроса

Вы(a.k.a. I) в значительной степени перечислил возможности. Либо опросите, как это делает FileMon, либо пропустите событие. Передача события, вероятно, более подвержена ошибкам, и если вы не 'не гуру тогдаВероятно, больше шансов на ошибку. Но если вы склонны совершать много ошибок, драйверы устройств могут не подойти вам ... прыжки с парашютом тоже могут быть плохим выбором.

Предлагаю взглянуть на этот проект, но, пожалуйста, обратите внимание на отказ от ответственности в README.(Это только проверка и расследование)

https://github.com/hostilefork/CloneLocker

И да, поскольку Microsoft и их модель драйверов вызывают беспокойство, мини-фильтры - лучший выбор в наши дни.

Ваш ответ на вопрос