推荐用于主虚拟NIC管控双从物理NIC的NDIS驱动栈架构
核心架构选型
推荐采用**虚拟Miniport驱动(主NIC)+ 两个Intermediate Filter驱动(分别绑定物理从NIC)**的组合,你的推测方向正确,无需额外单独使用Filter驱动(Intermediate Filter已具备流量拦截与转发能力),具体分工:
- 虚拟Miniport:向上暴露标准虚拟网卡(主NIC),作为TCP/IP协议栈的唯一交互入口,负责接收上层出站流量、聚合下层入站流量。
- Intermediate Filter:分别绑定到两个物理从NIC,拦截物理网卡的入站/出站流量,与虚拟Miniport双向通信,实现流量的复制转发。
实现细节
虚拟Miniport驱动实现
- 初始化与设备暴露:
- 实现
MiniportInitializeEx,创建虚拟网卡实例,自定义MAC地址(或从物理网卡复制),注册NDIS核心处理函数,向上层协议栈注册为可用网卡,确保TCP/IP等协议绑定到该虚拟网卡。
- 实现
- 出站流量处理:
- 在
MiniportSendNetBufferLists中接收上层发送的NetBufferLists(NBLs),调用NdisAllocateCloneNetBufferList复制两份NBL副本(注意维护引用计数)。 - 通过预先建立的通道,将两份NBL分别发送给绑定两个物理NIC的Intermediate Filter。
- 在
- 入站流量处理:
- 接收来自两个Intermediate Filter转发的入站NBLs,直接调用
NdisMIndicateReceiveNetBufferLists向上传递给协议栈;若需去重,可基于包ID或序列号在虚拟Miniport中实现简单过滤逻辑。
- 接收来自两个Intermediate Filter转发的入站NBLs,直接调用
- 通信通道建立:
- 虚拟Miniport启动后,通过
NdisEnumerateAdapters找到绑定了Intermediate Filter的物理网卡并获取句柄,或让Filter主动通过自定义IOCTL连接虚拟Miniport。
- 虚拟Miniport启动后,通过
Intermediate Filter驱动实现
- 绑定与初始化:
- 实现
FilterAttach,绑定到目标物理NIC,保存底层Miniport(物理NIC)和上层协议的句柄;在FilterSetModuleOptions中配置双向流量拦截。
- 实现
- 出站流量拦截:
- 重写
FilterSendNetBufferLists,拦截物理NIC的自主出站请求并直接返回成功(出站流量由虚拟Miniport统一下发);若需允许物理NIC发送特定流量(如ARP包),可添加白名单逻辑。
- 重写
- 入站流量转发:
- 在
FilterReceiveNetBufferLists中拦截物理NIC的入站NBLs,调用NdisFIndicateReceiveNetBufferLists转发给虚拟Miniport(而非上层协议),同时增加NBL引用计数避免提前释放。
- 在
- 接收虚拟Miniport下发的流量:
- 实现自定义接收函数,接收虚拟Miniport发来的复制后NBLs,调用
NdisSendNetBufferLists下发给绑定的物理NIC发送。
- 实现自定义接收函数,接收虚拟Miniport发来的复制后NBLs,调用
关键注意事项
- NBL引用计数管理:所有NBL的复制、转发操作必须正确维护引用计数,完成后调用
NdisFreeNetBufferList或NdisReturnNetBufferLists释放,避免内存泄漏或野指针。 - 同步与锁:多线程场景下(如两个物理NIC同时上报流量),虚拟Miniport的入站处理需用自旋锁或互斥锁保证线程安全。
- 性能优化:大流量场景下使用NBL链批量处理,减少复制开销;避免在中断上下文执行复杂逻辑,尽量延迟到DPC队列处理。
安装配置建议
- INF文件编写
- 虚拟Miniport的INF:指定
Class = Net,ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318},添加MiniportDriver节,定义虚拟网卡硬件ID(如ROOT\VIRTUAL_MASTER_NIC)。 - Intermediate Filter的INF:指定
Class = NetService,ClassGUID = {4D36E974-E325-11CE-BFC1-08002BE10318},设置FilterType = INTERMEDIATE,在BindList中指定目标物理NIC的硬件ID(如PCI\VEN_XXXX&DEV_XXXX)。
- 虚拟Miniport的INF:指定
- 安装顺序
- 先安装虚拟Miniport驱动:执行
pnputil /add-driver virtual_nic.inf /install。 - 再安装Intermediate Filter驱动:同样用
pnputil安装,系统会自动绑定到指定物理NIC。
- 先安装虚拟Miniport驱动:执行
- 系统配置
- 在“网络连接”中,仅将TCP/IP协议绑定到虚拟主NIC,取消物理NIC的协议绑定,避免流量绕过虚拟NIC。
- 禁用物理NIC的自动IP配置,确保所有网络流量经虚拟主NIC管控。
内容的提问来源于stack exchange,提问作者Ziffusion
相关产品推荐
相关产品推荐

