Apple lower filter driver это что
Довелось мне как-то на работе столкнуться с задачей управления доступа и перенаправления запросов к файловой системе в рамках определенных процессов. Реализовать необходимо было простое, легко конфигурируемое решение.
Решил разрабатывать MiniFilter драйвер, конфигурируемый при помощи текстового файла.
Рассмотрим, что из себя в общем виде представляет MiniFilter:
Фильтрация осуществляется через так называемый Filter Manager, который поставляется с операционной системой Windows, активируется только при загрузке мини фильтров. Filter Manager подключается напрямую к стеку файловой системы. Мини фильтры регистрируются на обработку данных по операциям ввода/вывода при помощи функционала Filter Manager, получая, таким образом, косвенный доступ к файловой системе. После регистрации и запуска мини фильтр получает набор данных по операциям ввода/вывода, которые были указаны при конфигурировании, при необходимости может вносить изменения в эти данные, таким образом влияя на работу файловой системы.
На следующей схеме в упрощенном виде показано как функционирует Filter Manager.
Более подробную теоретическую информацию Вы можете получить на сайте MSDN, воспользовавшись ссылкой в конце статьи. Достаточно не плохо все разобрано.
Мы же двинемся в сторону разработки и рассмотрим некоторые базовые структуры, которые необходимо заполнить.
Общие глобальные данные.
В этой структуре будем хранить ссылку на объект нашего драйвера и ссылку на экземпляр фильтра. Хочу заметить, что PFLT_FILTER уникально идентифицирует мини фильтр и остается константой на все время работы драйвера. Используется при активации или остановке процесса фильтрации.
- Callbacks – ссылка на структуру, определяющую, что и при помощи каких функций мы собираемся обрабатывать.
- FilterUnload – функция, которая будет вызвана при отключении фильтра.
- FilterLoad – функция, которая будет вызвана при инициализации фильтра.
Далее рассмотрим структуру Callbacks:
Здесь мы указываем, что будем перехватывать операцию CreateFile, также указываем функции, которые будут вызываться, соответственно, до и после выполнения операции над файлом.
Далее привожу код функций, которые вызываются при инициализации и отключении фильтра.
Думаю, код не нуждается в дополнительных комментариях, так как все достаточно стандартно. Замечу только, что наш драйвер не будет работать для сети.
Теперь давайте рассмотрим функцию инициализации драйвера:
Так же обращу внимание, что загрузка файла конфигурации и его обработка выполняется посредством следующих вызовов ConfigInfo = ReadConfigurationFile(); и ParseConfigurationFile(ConfigInfo) соответственно.
Данные из конфигурационного файла преобразуются в следующий набор структур.
Головной структурой выступает CONFIGURATION_MAP, которая хранит в себе ссылку на описание процесса ProcessRule, а так же указатель на следующий элемент. В свою очередь PROCESS_CONFIGURATION_RULE хранит ссылку на имя процесса и непосредственно на структуру правил перенаправления ввода/вывода, которая так же, как и REDIRECT_MAP является связным списком.
Рассмотрим функцию выгрузки драйвера, она достаточно проста:
Здесь мы лишь удаляем регистрацию фильтра и высвобождаем все наши конфигурационные структуры.
Теперь давайте обратимся к самой интересной части, а именно к функции, которая занимается перенаправлением операций ввода/вывода. Так как у нас достаточно простой драйвер, делать это мы будем прямо в PreFileOperationCallback.
Определяем основные переменные, а также проверим, не пришло ли нам уже что-то отфильтрованное, и если так, то эту операцию нужно пропустить, в противном случае мы можем получить рекурсию вызовов, что может повлечь BSOD.
Здесь обращаемся к данным структур полученных от FilterManager. Структура PFLT_CALLBACK_DATA – хранит данные по текущей операции ввода/вывода, FilterManager руководствуется полями этой структуры при обращении к файловой системе. Соответственно, если мы хотим изменить поведение Windows при обращении к файлам или каталогам, мы должны отразить это в PFLT_CALLBACK_DATA. Более конкретно, нас интересует поле Data->Iopb->TargetFileObject, используя его мы сможем получить путь до файла в текущем разделе и позже изменить его при необходимости, изменив таким образом поведение ОС. PCFLT_RELATED_OBJECTS — содержит объекты связанные с данной операцией ввода/вывода, такие как ссылку на файл, раздел и прочее. Проверим, что нужные нам элементы структуры заполнены. Также проверим, что функция в контексте которой мы выполняемся действительно MJ_CREATE.
В этом участке кода мы выделяем память для пути и имени процесса. Не представляю какого размера будет строка, так что выделяем максимально возможную строку WCHAR. Исходный код GetProcessImageName рассматривать не буду, скажу только, что она возвращает полный путь до файла в следующем виде: \Device\HarddiskVolume4\Windows\notepad.exe. т.е раздел, ну и собственно, путь до файла.
Функция FindRuleByProcessName в случае успеха возвращает первый элемент связанного списка содержащего правила перенаправления по текущему процессу, в противном случае NULL.
Начинаем проход по всем правилам для данного процесса, сравниваем ссылку на текущий файл с тем, что у нас есть в конфигурации. Если совпало, пытаемся получить дополнительную информацию о файле, например, к какому разделу он принадлежит. Для этого используем функцию FltGetFileNameInformation.
Далее, конфигурируем системные структуры, так чтобы File Manager еще раз обработал этот запрос, но только теперь уже по другому пути. Для этого важно проставить следующие значения полей Data->IoStatus.Information = IO_REPARSE и Data->IoStatus.Status = STATUS_REPARSE;, а так же указать новый путь до файла FileObject->FileName.Buffer = fullPath.Buffer;. В качестве результата функции возвращаем FLT_PROP_COMPLETE.
Не забываем перейти к следующему элементу списка перенаправлений. FLT_PREOP_SUCCESS_NO_CALLBACK возвращаем если делать с текущей операцией Filter Manger ничего не должен.
На данный момент переопределение ввода/вывода работает только в рамках одного раздела, как только отлажу вариант с поддержкой нескольких разделов, выложу.
Устанавливать мини фильтр необходимо при помощи специально оформленного inf файла, пример, которого Вы найдете в исходниках к данной статье.
Конфигурационный файл имеет следующий вид:
Файл должен располагаться в корне диска C, имя должно быть: minifilter.conf.
Итак мы имеем возможность перенаправления запросов файлового ввода/вывода, однако реализовать в дополнение, скажем, механизм запрета доступа к файлу достаточно просто. Необходимо выделить файл, доступ к которому нужно запретить и указать следующее значение для поля системной структуры Data->IoStatus.Status = STATUS_ACCESS_DENIED;. Не забыть вернуть FLT_PROP_COMPLETE в качестве результата функции.
Для запуска драйвера в 64 битной версии Windows 7 нужно будет отключить проверку подписи драйверов, для этого нужно перезагрузить компьютер, при старте системы нажать F8 и выбрать пункт Disable Driver Signature Enforcement, либо воспользоваться утилитой Driver Signature Enforcement Overrider(DSEO). Данная утилита позволит активировать тестовый режим отладки драйверов и подписать нужный драйвер фейковым сертификатом, что в конечном итоге позволит без проблем его использовать.
В не зависимости от того, включено логирование или нет, после запуска сервиса в DbgView Вы должны наблюдать нечто подобное.
А так наш драйвер будет выглядеть в DeviceTree
Могу добавить, что код пока еще достаточно сырой и требует доработок, однако в целом функционирует нормально. Собственно, если у Вас будет BSOD, я не виноват). Тестировал только на Windows 7 X86 и Windows 7 IA64.
Ссылка на исходники и утилиты: publish.rar
Эта работа была прислана на наш "бессрочный" конкурс статей и автор получил приз - USB-мышь Logitech MX310.
Разгоном мышей на сайте уже занимались, причем аппаратным (см. статью "Модификация мыши: хвостатой, оптической, вибрирующей"). Однако поводом к написанию сего опуса и программы послужила случайно попавшаяся на глаза статья на THG.RU ("Разгоняем мышь: как увеличить частоту USB в четыре раза"). Безусловно, идея разгона правильная, потому что истинная :) и сомнениям подвергаться не может, как бы не злопыхали апологеты номиналов :) Но вот конкретная реализация – только под Windows XP SP2 и путем хака (или патча, кому как больше нравится) системного файла – удовлетворительной признана быть не может.
реклама
Краткая теория разгона.
USB мыши, как и любые другие устройства на USB шине, работают согласно стандарту этой самой шины (было бы удивительно, если бы это было не так). Стандарт же сообщает нам, что USB шина – это хост-управляемая поллинговая (опросная) шина с периодом опроса устройств в 1 миллисекунду (по версии USB1.1). Следовательно, максимально достижимая частота опроса USB мышей – 1000 опросов в секунду. Однако стандарт уточняет, что низкоскоростные (Lowspeed) устройства, к которым мыши обычно и относятся, должны запрашивать опрос не чаще, чем раз в 10 командных циклов шины, что они и делают (соблюдая стандарт).
Внимательный читатель заметит, что 10 командных циклов по 1 миллисекунде каждая даст частоту опроса в 100 раз за секунду. Почему же USB мыши по умолчанию дают частоту опроса 125? Дело в том, что драйвера хост-контроллера, писанные MS, устанавливают частоту опроса устройства по значениям степени двойки, округляя запрошенное устройством (точнее его драйвером) значение в меньшую сторону, причем в диапазоне от 1 до 32. (Стандарт USB шины позволяет запросить интервалы опроса в любое число от 1 до 255). Следовательно, запрошенный период в 10 циклов округляется до 8, что и дает искомые 125 опросов в секунду.
С номиналом функционирования устройства мы разобрались, разберемся теперь, почему возможен разгон. Как уже было сказано выше, желаемый период опроса (сообщаемый устройством) не обязательно равняется устанавливаемому (действительному) для него. Поэтому, заставив драйвер (либо самого устройства, либо хост-контроллера) запросить меньший период опроса, мы тем самым поднимем частоту опроса устройства. Патч, описанный на THG, исправляет драйвер хост-контроллера так, что он для всех низкоскоростных устройств (не только мышей) программирует хост-контроллер в более высокую частоту. Мы же пойдем другим путем – заставим драйвер самого устройства запрашивать нужную нам частоту.
Удаление значений реестра UpperFilters и LowerFilters очень часто является исправлением для нескольких различных проблем с оборудованием, которые генерируют коды ошибок диспетчера устройств в Windows.
Удаление из реестра значений UpperFilters и LowerFilters должно занять не более 10 минут.
Мы создали это пошаговое руководство, которое сопровождает руководство «Как удалить значения реестра UpperFilters и LowerFilters». В этом процессе есть несколько очень подробных шагов, каждый из которых включает реестр Windows. Этот визуальный учебник должен помочь прояснить любую путаницу и помочь вам быстрее удалить эти элементы из реестра.
Возможно, вам придется переустановить все программы, связанные с устройством, для которого вы удаляете значения UpperFilters и LowerFilters . Например, если вы удалите эти значения для своего DVD-привода, вам, возможно, придется переустановить программное обеспечение для записи DVD-дисков. Это не большая проблема, но вы должны быть осведомлены, прежде чем продолжить.
Откройте диалоговое окно «Выполнить»
Для начала откройте диалоговое окно «Выполнить». Самый простой способ сделать это во всех версиях Windows – с помощью сочетания клавиш Windows Key + R .
В этом пошаговом руководстве демонстрируется этот процесс в Windows 10, но в Windows 8, Windows 7, Windows Vista и Windows XP можно выполнить эти шаги практически точно. Мы будем выявлять любые различия по мере прохождения учебника.
Открыть редактор реестра
В текстовом поле «Выполнить» введите regedit и нажмите ENTER .
Команда regedit откроет программу редактора реестра, которая используется для внесения изменений в реестр Windows.
Если вы используете Windows 10, 8, 7 или Vista, вам может потребоваться ответить Да на любые вопросы контроля учетных записей , прежде чем откроется редактор реестра.
Изменения в реестре Windows сделаны как часть этого руководства. Чтобы избежать серьезных системных проблем, убедитесь, что вы вносите только изменения, описанные в этом пошаговом руководстве. Если вам неудобно вносить изменения в реестр или вас беспокоит ошибка, мы рекомендуем создать резервную копию ключей реестра, с которыми мы работаем. Вы увидите ссылку на инструкции по выполнению этого, когда мы достигнем этих шагов.
Нажмите на HKEY_LOCAL_MACHINE
После открытия редактора реестра найдите куст реестра HKEY_LOCAL_MACHINE .
Разверните улей HKEY_LOCAL_MACHINE , щелкнув > слева от значка папки. В Windows XP это будет символ (+) .
Перейдите к HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Class
Продолжайте расширять разделы реестра и подразделы, пока не дойдете до ключа HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Class .
Нажмите один раз на клавишу Класс . Редактор реестра должен выглядеть как на скриншоте выше.
Если вы будете осторожны и создадите резервные копии ключей реестра, с которыми работаете в этом руководстве (которое мы рекомендуем), то ключ Class предназначен для резервного копирования. См. Как сделать резервную копию реестра Windows для помощи.
Разверните ключ реестра классов
Разверните раздел реестра Class , щелкнув > слева от значка папки. Как и раньше, в Windows XP это будет символ (+) .
Теперь вы должны увидеть длинный список подразделов в Class .
Каждый из этих 32-значных ключей уникален и соответствует определенному типу оборудования в диспетчере устройств. На следующем шаге вы выясните, в каком из этих аппаратных классов искать значения реестра UpperFilters и LowerFilters .
Определите и нажмите на правильный класс GUID
Каждый из этих длинных загадочных разделов реестра, которые вы видите в разделе Class , соответствует глобальному уникальному идентификатору (GUID), представляющему определенный тип оборудования на вашем компьютере.
Что вам нужно сделать, это выяснить GUID для типа оборудования, для которого вы видите код ошибки диспетчера устройств. Вы можете сделать это, ссылаясь на этот список:
GUID класса устройства для популярных типов оборудования
Например, предположим, что ваш DVD или Blu-Ray привод показывает ошибку Code 39 в диспетчере устройств.Согласно приведенному выше списку устройства DVD и Blu-Ray относятся к классу CDROM , а GUID для этого класса – 4D36E965-E325-11CE-BFC1-08002BE10318.
Как только вы определите правильный GUID, нажмите один раз на соответствующий раздел реестра. Нет необходимости расширять этот ключ.
Многие из этих GUID выглядят одинаково, но они определенно не являются. Все они уникальны. Это может помочь узнать, что во многих случаях разница между GUID и GUID заключается в первом наборе цифр и букв, а не в последнем.
Найдите значения UpperFilters и LowerFilters
Теперь, когда выбран раздел реестра, соответствующий классу оборудования (как вы определили на последнем шаге), вы должны увидеть несколько значений реестра справа.
Среди нескольких показанных значений найдите одно с именем UpperFilters и одно с именем LowerFilters . Если у вас есть только один или другой, это нормально. (Нет необходимости выбирать их, как мы делали на скриншоте выше. Это просто для вызова значений.)
Если вы не видите ни одно из значений реестра, то тут делать нечего, и, очевидно, это решение не поможет решить вашу проблему. Еще раз проверьте, что вы выбрали правильный класс устройства и выбрали правильный раздел реестра. Если вы уверены, что у вас есть, вам нужно попробовать другое решение.
Ваш реестр также может иметь значение UpperFilters.bak и/или LowerFilters.bak в дополнение к UpperFilters и LowerFilters значения. Если это так, не беспокойтесь об этом. Нет необходимости удалять их. Ничто не повредит их удалению, но и не исправит возникшую проблему.
Удалить значение UpperFilters
Нажмите правой кнопкой мыши значение реестра UpperFilters и выберите Удалить .
Если у вас нет значения UpperFilters , перейдите к шагу 10.
Подтвердите удаление значения UpperFilters
После удаления значения реестра UpperFilters вы увидите диалоговое окно.
Выберите Да для «Удаление определенных значений реестра может привести к нестабильности системы. Вы уверены, что хотите удалить это значение навсегда?» .
Удалить значение LowerFilters
Щелкните правой кнопкой мыши значение реестра LowerFilters и выберите Удалить .
Если у вас нет значения LowerFilters , перейдите к шагу 12.
Подтвердите удаление значения LowerFilters
После удаления значения реестра LowerFilters вы снова увидите диалоговое окно.
Как и в случае с UpperFilters , выберите Да для «Удаление определенных значений реестра может вызвать нестабильность системы. Вы уверены, что хотите удалить это значение навсегда?» вопрос.
Закрыть редактор реестра
Убедитесь, что не существует ни параметра реестра UpperFilters , ни параметра реестра LowerFilters .
Закройте редактор реестра.
Перезагрузите компьютер
Вы внесли изменения в реестр Windows, поэтому, чтобы убедиться, что ваши изменения вступили в силу в Windows, вам необходимо правильно перезагрузить компьютер.
Самый быстрый способ перезапустить Windows 10 или Windows 8 – через меню Power User (это можно сделать с помощью горячей клавиши WIN + X ). Используйте меню «Пуск» в предыдущих версиях Windows.
Подождите, пока Windows перезагружается
Подождите, пока Windows полностью перезагрузится.
На следующем шаге мы увидим, действительно ли удаление значений UpperFilters и LowerFilters из реестра принесло свои плоды.
Смотрите, если удаление этих значений реестра решило проблему
Теперь пришло время проверить, решило ли вашу проблему удаление значений реестра UpperFilters и LowerFilters .
Скорее всего, вы проходите этот учебник, потому что удаление этих значений является вероятным решением кода ошибки диспетчера устройств, которое вы исследовали после того, как какая-то часть оборудования перестала работать должным образом.
Если это так, то проверка состояния устройства в диспетчере устройств и проверка отсутствия кода ошибки – это хорошая проверка, чтобы убедиться, что этот процесс работает. В противном случае, просто проверьте устройство и посмотрите, работает ли оно снова правильно.
Как я упоминал в первом шаге, вам может потребоваться переустановить программы, связанные с устройством, для которого вы удалили значения UpperFilters и LowerFilters . Например, если вы удалили эти значения для своего привода DVD, возможно, вам придется переустановить программное обеспечение для записи DVD.
Код ошибки остался или у вас все еще есть проблемы с оборудованием?
Если удаление UpperFilters и LowerFilters не сработало, вернитесь к информации об устранении неполадок для своего кода ошибки и перейдите к другим идеям. Большинство кодов ошибок диспетчера устройств имеют несколько возможных решений.
Вот краткое пошаговое руководство о том, как удалить «верхние фильтры и нижние фильтры» из реестра в Windows 10.
Что такое UpperFilter и LowerFilter в редакторе реестра?
Дополнительные драйверы UpperFilter управляют запросами на доступ к устройствам из сторонних приложений. Затем он отправляет запрос основному драйверу устройства, например дисководу компакт-дисков и т. Д.
Надстройки LowerFilters работают аналогично, обрабатывая запросы доступа к устройству от основного драйвера. Затем он отправляет запрос драйверу ядра.
К сожалению, сторонние фильтры могут конфликтовать с существующим драйвером устройства и другим программным обеспечением, установленным в вашей системе. В большинстве случаев этот конфликт приводит к системным проблемам и ошибке диспетчера устройств.
Когда следует удалять UpperFilter и LowerFilter в редакторе реестра?
Ошибки диспетчера устройств, такие как «Это устройство не запускается» (код 10), могут потребовать удаления значений реестра UpperFilters и LowerFilters в качестве потенциального исправления. Фильтры также могут повреждаться или оставаться в остатках после удаления приложений и предотвращения установки других приложений.
Хотя удалить UpperFilters и LowerFilters относительно легко, вы должны быть осторожны при этом. Удаление неверных значений реестра может вызвать другие системные проблемы, а иногда даже может потребоваться новая установка Windows.
Прежде чем пытаться удалить какие-либо значения реестра, обязательно создайте резервную копию реестра Windows. Кроме того, создайте точку восстановления системы и диск восстановления или диск восстановления системы.
Связанный: Как создавать ежедневные точки восстановления в Windows 10
Если вы случайно удалили верхний и нижний фильтры и заблокировали свой компьютер, эти решения для восстановления могут помочь вам оживить вашу систему.
Как удалить значения реестра UpperFilters и LowerFilters в Windows
Удалить UpperFilters и LowerFilters из значений реестра Windows очень просто. Следуйте инструкциям, и вы сможете удалить их через несколько минут.
Это руководство написано для ПК с Windows 10. Однако инструкции должны примерно соответствовать другим версиям ОС, включая Windows 8.1 и 7.
Чтобы удалить UpperFilters и LowerFilter:
В редакторе реестра перейдите в следующее место. Вы можете скопировать и вставить путь в адресную строку для навигации. HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Class
В ключе Class вы увидите список подключей Class GUID. Каждая часть оборудования на вашем компьютере имеет уникальный GUID класса, который выглядит примерно так:
После перезагрузки компьютера проверьте, появляется ли снова код ошибки диспетчера устройств. Затем переустановите все программное обеспечение, предназначенное для использования удаленных фильтров.
Как найти GUID класса для драйвера устройства
При возникновении ошибки диспетчера устройств можно быстро использовать код ошибки, чтобы найти GUID класса соответствующего драйвера устройства.
В противном случае вы можете найти его вручную в свойствах устройства с помощью диспетчера устройств. Вот как это сделать:
Безопасное удаление значений реестра UpperFilters и LowerFilters
Работа с редактором реестра поначалу может показаться сложной. Но знание того, как это работает, может пригодиться. С помощью нескольких настроек вы можете включить полезные скрытые настройки, которые по умолчанию недоступны в вашей системе Windows.
Как я могу установить драйвер фильтра как драйвер нижнего фильтра? Все образцы DDK являются драйвером верхнего фильтра. Есть ли какой-либо способ, кроме использования INF-файла для выполнения этой работы? Я знаю, что драйверы нижнего фильтра находятся под FDO и сверху BDO, но если их больше, чем один драйвер нижнего фильтра, как они упорядочиваются? Могу ли я поместить свой драйвер в определенное место этого стека?
How can I install a filter driver as lower filter driver?
Драйверы верхнего и нижнего фильтров устанавливаются примерно одинаково - вам фактически не требуется INF - вы можете просто установить значения в реестре. Конечно, это зависит от того, какой тип драйвера фильтра вы хотите установить, но, например, если я хочу установить драйвер фильтра более низкого класса, я открываю Regedit и перехожу к следующему ключу:
Здесь вы должны увидеть строковое значение UpperFilters, содержащее PartMgr. Если вы хотите добавить нижний фильтр, просто создайте значение LowerFilters и установите для него имя ключа вашего драйвера. GUID в имени ключа ужасен, но если вы просканируете ключ класса, вы увидите множество ключей с именем GUID - значение по умолчанию для каждого из них содержит краткое описание того, какое устройство представляет этот ключ.
Подобно PartMgr и всем остальным драйверам, вам нужно будет создать ключ драйвера HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services со всеми соответствующими значениями конфигурации. Если вы не уверены в значениях для вашего драйвера, выгрузите весь ключ HKLM \ SYSTEM в файл, установите драйвер в обычном режиме, сделайте второй дамп всего ключа HKLM \ SYSTEM и сравните дампы, чтобы увидеть, какие значения были помещены куда.
Can I put my driver at a specific location of this stack?
Вопреки тому, что кто-то говорит вам обратное, ответ отрицательный. Иногда люди считают, что, когда в значениях реестра UpperFilters и LowerFilters указано несколько драйверов, первым загружается первый из них. Я даже был свидетелем этого превращения в «войну реестров», когда водители постоянно борются за свое место в списке. Это ерунда, и вы должны спроектировать свой драйвер так, чтобы он справлялся с любым другим драйвером, который появляется выше или ниже вас.
Читайте также: