Суровое предупреждение
Не пытайтесь «установить» фильтр, вручную написав разделы реестра. Как вы заметили, это непросто, и даже если вам кажется, что это работает, все это рухнет, когда ОС попытается установить следующий LWF. Кроме того, я добавил некоторые дополнительные функции повышения безопасности, предназначенные именно для того, чтобы люди не делали этого в Windows 10; вам придется нанести значительный ущерб ОС, прежде чем вы сможете взломать сетевые привязки в Windows 10.
Как структурировать пакет драйверов
В любом случае, то, что вы описываете, действительно возможно. Это можно сделать, предоставив в пакете драйвера следующее:
- A PNP-style INF. This INF has:
- The
PORTS
class
- Директива
AddService
, которая устанавливает службу вашего драйвера.
- Директива
CopyFiles
для загрузки любых файлов, которые вам нужны.
- Любые другие биты, необходимые для устройства PNP
- A NetCfg-style INF. This INF has:
- The
NETSERVICE
class
- Обычный материал LWF:
Characteristics=0x40000
, FilterMediaTypes=xxx
, FilterType=xxx
и т.д.
- Ссылка на службу, которую вы установили в другом INF (
HKR,Ndi,Service,,xxx
)
- Не включайте
AddService
или CopyFiles
; об этом уже позаботился первый INF
- One .sys file. This driver does:
- In
DriverEntry
, call NdisFRegisterFilterDriver
, and pass the name of your service "xxx"
- В
DriverEntry
позвоните WdfDriverCreate
или заполните таблицу диспетчеризации DRIVER_OBJET
, как обычно для любого другого водителя PNP.
- Реализовать
FilterAttach
и т. д. в обычном режиме; реализовать обработчики WDF EvtXxx или WDM IRP в обычном режиме
- Не забудьте вызвать
NdisFDeregisterFilterDriver
в EvtDriverUnload
или DriverUnload
, а также в пути отказа для DriverEntry
Как установить этот прекрасный беспорядок
Хорошей новостью является то, что с этими двумя INF-файлами вы можете удовлетворить свое требование, чтобы один файл .sys выполнял две задачи. Плохая новость в том, что теперь у вас есть 2 INF. Хуже того, одна из INF является INF в стиле NetCfg, так что вы не можете просто Include
+Need
ее. Единственный способ установить INF-файл в стиле NetCfg — это вызвать INetCfgClassSetup::Install
(или NetCfg.exe
, его оболочку командной строки). Центр обновления Windows знает только, как установить INF-файлы в стиле PNP, а PNP умеет только Include
устанавливать другие INF-файлы в стиле PNP.
Таким образом, самым простым решением является поставка установщика exe/msi, который вызывает INetCfg API. Если вы можете это сделать, это просто вопрос пары вызовов SetupCopyOemInf
и шаблона INetCfg
, который вы можете найти в образец bindview.
Но если вам нужно поддерживать установку, ориентированную на оборудование, вам нужно использовать большие пушки. Вам нужно будет написать Co-Installer и включите его в свой пакет драйверов. Работа Co-Installer состоит в том, чтобы вызывать INetCfg
API, когда ваш пакет драйверов установлен, и отменять регистрацию, когда пакет удаляется.
Совместные установщики обычно не рекомендуются и не поддерживаются для универсальных драйверов. Поэтому вам следует избегать Co-Installer, если у вас нет выбора. К сожалению, я не могу придумать другого способа зарегистрировать NDIS LWF, когда драйвер устройства PNP установлен через Центр обновления Windows. (Это не значит, что нет хитрого способа сделать это; я не знаю всего.)
Обратите внимание, что вам в любом случае понадобится Co-Installer, даже если вы отправляете 2 файла .sys. Необходимость вызова INetCfg
не изменится только потому, что вы объединили двоичные файлы драйвера.
Ограничения
У вас будет полноценный драйвер NDIS LWF, а также полноценный драйвер устройства PNP. Единственная (незначительная) вещь, которая не работает, это то, что вы не можете вызвать NdisRegisterDeviceEx
в этом драйвере. Причина в том, что когда вы вызываете NdisRegisterDeviceEx
из LWF, NDIS попытается кооптировать таблицу диспетчеризации вашего драйвера. Но в этом двойном драйвере PNP+LWF таблица диспетчеризации принадлежит WDF или вам. Это ограничение не является проблемой, так как вы можете вызвать WdfDeviceCreate
, и эта подпрограмма проще в использовании и в любом случае имеет больше возможностей, чем подпрограмма NDIS.
В приведенной выше конфигурации служба драйвера принадлежит PNP. Это означает, что время жизни вашего файла .sys принадлежит PNP. Вы не можете вручную «сетевой запуск» службы драйвера PNP; единственный способ загрузить ваш файл .sys - это фактически перечислить ваше оборудование. Это означает, что вы не можете запустить NDIS LWF, если аппаратное обеспечение отсутствует. Как правило, это то, что вы хотели бы в любом случае. Если это не так, вы можете попробовать возиться с директивой ServiceName, но с этим есть несколько странных предостережений, и я сам не совсем понимаю это.
person
Jeffrey Tippet
schedule
12.06.2015