1

是否可以采用诸如类驱动程序之类的 Windows 驱动程序,然后通过调用它来Ports将其自身设置为 NDIS 过滤器(类)驱动程序?这本质上是让驱动程序作为一个和类驱动程序工作双重职责,但在一个单一的代码库和二进制文件中。NetServiceNdisFRegisterFilterDriver()DriverEntry()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 本身放置在注册表中的值。在尝试注册 NDIS 过滤器之前,我曾尝试通过手动添加并在我的代码中调用该值来欺骗注册表项NetCfgInstanceId,但已经达到了似乎是错误的处理方式的地步。

推荐的方法是什么?在这一点上,我想这将需要一个单独的Ports类驱动程序和NetService类驱动程序,并使用某种复合驱动程序将它们绑定在一起以便能够进行通信,或者有一种方法让一个或另一个通过进程间通信进行通信。

4

1 回答 1

4

严厉的警告

不要试图通过手动编写注册表项来“安装”过滤器。正如您所注意到的,这并不容易,即使您似乎让它工作,当操作系统尝试安装下一个 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=0x40000, FilterMediaTypes=xxx, FilterType=xxx, 等等。
    3. HKR,Ndi,Service,,xxx对您在其他 INF ( )中安装的服务的引用
    4. 不要包含AddServiceor CopyFiles; 第一个 INF 已经处理好了
  3. 一个 .sys 文件。该驱动程序执行以下操作:
    1. DriverEntry中,调用NdisFRegisterFilterDriver并传递您的服务名称“xxx”
    2. DriverEntry,调用WdfDriverCreate或填写DRIVER_OBJET调度表,就像您通常对任何其他 PNP 司机所做的那样
    3. 正常执行FilterAttach等;正常实施 WDF EvtXxx 或 WDM IRP 处理程序
    4. 不要忘记调用or ,并且在失败路径中NdisFDeregisterFilterDriver调用EvtDriverUnloadDriverUnloadDriverEntry

如何安装这个烂摊子

好消息是,使用这 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。如果你能做到这一点,这只是几个调用SetupCopyOemInfINetCfg你可以在bindview 示例中找到的样板的问题。

但是,如果您必须支持硬件优先的安装,您需要拿出大手笔。您需要编写一个共同安装程序并将其包含在您的驱动程序包中。INetCfgCo-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 指令,但有一些奇怪的警告,我自己并不完全理解。

于 2015-06-12T10:41:06.040 回答