有一个包含三个NIC的PCI设备,由Altera以太网内核提供。必须为 WinXPe 实现,因此 NDIS 5.1。MVP 建议为每个核心实现一个 WDM 驱动程序,然后实现一个与各个 WDM 驱动程序通信的单个 NDIS 驱动程序,我不明白,因为单个 NDIS 驱动程序似乎没有任何多个端口或通道的概念。
如果在 DriverEntry 中,每个以太网核心的 NDIS 驱动程序称为 NdisMInitializeWrapper 一次怎么办?它每次都需要使用相同的 DriverObject 调用,但每次调用时可能会返回不同的 NdisWrapperHandle。该唯一的 NdisWrapperHandle 可用作调用所有其他 NDIS 驱动程序函数的上下文说明符。
那行不通;NdisMInitializeWrapper 每个驱动程序只能调用一次。
规则是:每个网络接口需要一个设备节点。 因此,如果需要 3 个以太网接口,则需要系统中的 3 个设备节点。 有几种方法可以到达那里:
- PCI
总线将为每个 PCI 功能编号创建一个设备节点。 如果 PCI 设备向总线公开 3 个函数,则 Windows 将枚举 3 个微型端口设备对象。 这使得驱动程序超级简单。 但是,显然,您必须能够重新调整硬件才能执行此操作。
或者,如果您只使用一个具有一个 PCI 功能的 PCI 设备,则需要自己多路复用 PCI 枚举的设备节点。 这意味着您应该创建自己的虚拟总线驱动程序 (VBD)。 PCI 总线枚举一个设备节点,该节点与 VBD 的驱动程序相关联。 然后,VBD 转身并枚举 3 个子节点,每个子节点都与一个微型端口相关联。
这种方法需要相当多的工作,因为现在您需要编写两个驱动程序。 幸运的是,WDF使普通人可以编写公共汽车司机。 VBD 需要实现代码以在子网络微型端口之间共享资源(中断、配置空间)。
大牌供应商在选择选项 #1 还是选项 #2 方面存在分歧,因此两者都可以工作。 从您的描述中,听起来您已经得到了实施 VBD 的建议。