繁体   English   中英

加载除NetService以外的Windows驱动程序类以充当NDIS筛选器

[英]Loading a Windows Driver Class other than NetService to act as an NDIS Filter

是否可以使用Windows驱动程序(例如Ports类驱动程序),然后通过在其DriverEntry()调用NdisFRegisterFilterDriver()将其自身设置为NDIS筛选器( NetService类)驱动程序? 从本质NetService ,这将使驱动程序作为PortsNetService类驱动程序承担双重职责,但要在单个代码库和二进制代码内。

我正在尝试执行此操作,并且看到注册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中劫持网络绑定之前,您必须对操作系统造成重大损害。

如何构建驱动程序包

无论如何,您所描述的确实是可能的。 方法是在驱动程序包中提供以下内容:

  1. PNP样式的INF。 该INF具有:
    1. PORTS
    2. AddService指令,用于安装驱动程序服务
    3. 一个CopyFiles指令,可以导入您需要的任何文件
    4. PNP设备所需的任何其他位
  2. NetCfg样式的INF。 该INF具有:
    1. NETSERVICE
    2. LWF常用的东西: Characteristics=0x40000FilterMediaTypes=xxxFilterType=xxx等等。
    3. 对您在其他INF中安装的服务的引用( HKR,Ndi,Service,,xxx
    4. 不包括AddServiceCopyFiles 第一个INF已经解决了这个问题
  3. 一个.sys文件。 该驱动程序执行以下操作:
    1. DriverEntry ,调用NdisFRegisterFilterDriver ,并传递服务名称“ xxx”
    2. DriverEntry ,像通常对其他任何PNP驱动程序一样,调用WdfDriverCreate或填写DRIVER_OBJET调度表
    3. 正常执行FilterAttach等; 正常实施WDF EvtXxx或WDM IRP处理程序
    4. 不要忘记在EvtDriverUnloadDriverUnload以及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示例中找到SetupCopyOemInfINetCfg样板。

但是,如果您必须支持硬件优先的安装,则需要拿出大手笔。 您需要编写一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM