[英]Loading a Windows Driver Class other than NetService to act as an NDIS Filter
是否可以使用Windows驱动程序(例如Ports
类驱动程序),然后通过在其DriverEntry()
调用NdisFRegisterFilterDriver()
将其自身设置为NDIS筛选器( NetService
类)驱动程序? 从本质NetService
,这将使驱动程序作为Ports
和NetService
类驱动程序承担双重职责,但要在单个代码库和二进制代码内。
我正在尝试执行此操作,并且看到注册NDIS驱动程序的调用失败,尤其是以下跟踪消息:
[0][mp]<==ndisCreateFilterDriverRegistry, FilterServiceName 807EFA18 Status c0000001
[0][mp]==>NdisFRegisterFilterDriver: DriverObject 84C6C428
[0][mp]==>ndisCreateFilterDriverRegistry, FilterServiceName 807EFA18
[0][mp]<==ndisCreateFilterDriverRegistry, FilterServiceName 807EFA18 Status c0000001
我环顾四周,似乎NDIS驱动程序在很大程度上取决于INF和INF本身在注册表中放置的值。 我试图通过手动添加NetCfgInstanceId
并在尝试注册NDIS筛选器之前在我的代码中调用该值来欺骗注册表项,但发现其中的错误之处似乎在于解决方法。
推荐的解决方法是什么? 在这一点上,我想这将需要分别使用Ports
类驱动程序和NetService
类驱动程序,并使用某种复合驱动程序将它们捆绑在一起以进行通信,或者使彼此之间可以通过进程间进行通信通讯。
不要尝试通过手动编写注册表项来“安装”过滤器。 如您所知,这并不容易,即使您似乎可以正常使用它,当操作系统尝试安装下一个LWF时,它也会全部崩溃。 此外,我添加了一些其他的强化功能,这些功能旨在防止人们在Windows 10上执行此操作。 在Windows 10中劫持网络绑定之前,您必须对操作系统造成重大损害。
无论如何,您所描述的确实是可能的。 方法是在驱动程序包中提供以下内容:
PORTS
类 AddService
指令,用于安装驱动程序服务 CopyFiles
指令,可以导入您需要的任何文件 NETSERVICE
类 Characteristics=0x40000
, FilterMediaTypes=xxx
, FilterType=xxx
等等。 HKR,Ndi,Service,,xxx
) AddService
或CopyFiles
; 第一个INF已经解决了这个问题 DriverEntry
,调用NdisFRegisterFilterDriver
,并传递服务名称“ xxx” DriverEntry
,像通常对其他任何PNP驱动程序一样,调用WdfDriverCreate
或填写DRIVER_OBJET
调度表 FilterAttach
等; 正常实施WDF EvtXxx或WDM IRP处理程序 EvtDriverUnload
或DriverUnload
以及DriverEntry
的失败路径中调用NdisFDeregisterFilterDriver
好消息是,有了这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。 如果可以做到,那么只需要几次调用即可在bindview示例中找到SetupCopyOemInf
和INetCfg
样板。
但是,如果您必须支持硬件优先的安装,则需要拿出大手笔。 您需要编写一个Co-Installer,并将其包含在驱动程序包中。 共同安装者的工作是在安装驱动程序软件包时调用INetCfg
API,并在卸载软件包时注销。
通常不建议使用共同安装程序,并且通用驱动程序不支持共同安装程序。 因此,除非别无选择,否则应避免使用Co-Installer。 不幸的是,当通过Windows Update安装PNP设备驱动程序时,我无法想到其他任何方法来注册NDIS LWF。 (这并不意味着没有狡猾的方法;我不知道所有事情。)
请注意,即使您要运送2个.sys文件,也仍然需要Co-Installer。 调用INetCfg
并不会因为合并驱动程序二进制文件而改变。
您将拥有成熟的NDIS LWF驱动程序以及成熟的PNP设备驱动程序。 唯一(次要)的问题是,您无法在此驱动程序中调用NdisRegisterDeviceEx
。 其原因是,当你调用NdisRegisterDeviceEx
从LWF,NDIS将尝试增选你的驱动程序的调度表。 但是在此PNP + LWF双驱动程序中,调度表由WDF或您拥有。 此限制没有问题,因为您可以调用WdfDeviceCreate
,并且此例程比NDIS更加易于使用并且具有更多功能。
通过以上配置,驱动程序服务归PNP所有。 这意味着.sys文件的生存期归PNP所有。 您不能手动“网络启动” PNP驱动程序服务。 加载.sys文件的唯一方法是实际枚举硬件。 这意味着当不存在硬件时,您将无法运行NDIS LWF。 通常,这就是您想要的。 如果不是,您可以尝试弄乱ServiceName指令,但是对此有一些奇怪的警告,而我本人并不完全了解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.