严厉的警告
不要试图通过手动编写注册表项来“安装”过滤器。正如您所注意到的,这并不容易,即使您似乎让它工作,当操作系统尝试安装下一个 LWF 时,它也会崩溃。此外,我添加了一些额外的强化功能,旨在防止人们对 Windows 10 这样做;您必须先对操作系统造成重大损害,然后才能在 Windows 10 中劫持网络绑定。
如何构建驱动程序包
无论如何,您所描述的确实是可能的。方法是在您的驱动程序包中提供以下内容:
- PNP 风格的 INF。该 INF 具有:
PORTS
班级_
- 一个
AddService
指令,用于安装您的驱动程序服务
CopyFiles
引入您需要的任何文件的指令
- PNP 设备所需的任何其他位
- NetCfg 样式的 INF。该 INF 具有:
NETSERVICE
班级_
- 通常的 LWF 东西:
Characteristics=0x40000
, FilterMediaTypes=xxx
, FilterType=xxx
, 等等。
HKR,Ndi,Service,,xxx
对您在其他 INF ( )中安装的服务的引用
- 不要包含
AddService
or CopyFiles
; 第一个 INF 已经处理好了
- 一个 .sys 文件。该驱动程序执行以下操作:
- 在
DriverEntry
中,调用NdisFRegisterFilterDriver
并传递您的服务名称“xxx”
- 在
DriverEntry
,调用WdfDriverCreate
或填写DRIVER_OBJET
调度表,就像您通常对任何其他 PNP 司机所做的那样
- 正常执行
FilterAttach
等;正常实施 WDF EvtXxx 或 WDM IRP 处理程序
- 不要忘记调用or ,并且在失败路径中
NdisFDeregisterFilterDriver
调用EvtDriverUnload
DriverUnload
DriverEntry
如何安装这个烂摊子
好消息是,使用这 2 个 INF,您可以满足让 1 个 .sys 文件做两件事的要求。坏消息是你现在有 2 个 INF。更糟糕的是,其中一个 INF 是 NetCfg 风格的 INF,所以你不能只是Include
+Need
它。安装 NetCfg 风格的 INF的唯一INetCfgClassSetup::Install
方法是调用(或者NetCfg.exe
,它的命令行包装器)。Windows Update 只知道如何安装 PNP 风格的 INF,而 PNP 只知道如何安装Include
其他 PNP 风格的 INF。
所以最简单的解决方案是发布一个调用 INetCfg API 的安装程序 exe/msi。如果你能做到这一点,这只是几个调用SetupCopyOemInf
和INetCfg
你可以在bindview 示例中找到的样板的问题。
但是,如果您必须支持硬件优先的安装,您需要拿出大手笔。您需要编写一个共同安装程序并将其包含在您的驱动程序包中。INetCfg
Co-Installer 的工作是在安装驱动程序包时调用API,并在卸载驱动程序包时取消注册。
通常不鼓励共同安装程序,并且不支持通用驱动程序。因此,除非您别无选择,否则您应该避免使用 Co-Installer。不幸的是,当通过 Windows 更新安装 PNP 设备驱动程序时,我想不出任何其他方法来注册 NDIS LWF。(这并不意味着没有巧妙的方法可以做到这一点;我不知道一切。)
请注意,即使您要运送 2 个 .sys 文件,您仍然需要一个共同安装程序。调用的需要INetCfg
不会因为您合并了驱动程序二进制文件而改变。
限制
您将拥有一个成熟的 NDIS LWF 驱动程序,以及一个成熟的 PNP 设备驱动程序。唯一(次要)不起作用的是您无法调用NdisRegisterDeviceEx
此驱动程序。原因是当您NdisRegisterDeviceEx
从 LWF 调用时,NDIS 将尝试选择您的驱动程序的调度表。但是在这个 PNP+LWF 双驱动程序中,调度表归 WDF 或您所有。这个限制是没有问题的,因为你可以调用WdfDeviceCreate
,而且这个例程更容易使用并且比 NDIS 有更多的功能。
通过上述配置,驱动服务由 PNP 拥有。这意味着您的 .sys 文件的生命周期归 PNP 所有。您不能手动“网络启动” PNP 驱动程序服务;加载 .sys 文件的唯一方法是实际枚举您的硬件。这意味着当硬件不存在时,您无法运行 NDIS LWF。通常这就是你想要的。如果不是,您可以尝试弄乱 ServiceName 指令,但有一些奇怪的警告,我自己并不完全理解。