与许多低级驱动程序一样,NDIS微型端口驱动程序旨在与硬件通信。微型端口的职责是从操作系统获取发送数据包,将其转换为硬件所需的任何格式,并指示硬件在线路上发送数据包。
WDK可以(事实上,曾经)包含一个在真实硬件上发送数据包的真实样本驱动程序。但这会导致一些混乱,因为现实世界的驱动程序必须处理大量特定于硬件的细节,这些细节会分散样本的主要观点。如果你从一个真实的驱动程序开始,你要做的第一件事就是识别所有特定于硬件的位并将其撕掉,这样你就可以用你自己的硬件专用位替换它们。
相反,WDK中的“netvmini”示例是假驱动程序。这意味着它假装拥有实际硬件,但暗地里说这都是谎言。当操作系统向netvmini发送数据包时,netvmini驱动程序将简单地将这些数据包广播到该机器上安装的任何其他netvmini微型端口适配器。 (实际上,在同一台机器上安装2个netvmini适配器模拟了如果将两个真正的适配器插入同一个以太网集线器会发生什么。)因此,在ASCII技术中,如果在同一系统上安装两个netvmini适配器,会发生这种情况。 :
TCPIP TCPIP TCPIP | | | Real physical miniport Your netvmini #1 Your netvmini #2 | \ / [The Internet] [The netvmini virtual hub]
正如ASCII艺术所示,您的netvmini适配器没有任何Internet访问路径。因此,在添加硬件详细信息之前,您的驱动程序将无法获得可以路由到Internet的“真实”IP地址。在此之前,Windows将继续尝试发送永远不会发送的ARP和HTTP请求。
回答您的具体问题:
每次操作系统尝试发送数据包时,都会打印来自MPSendNetBufferLists的消息。因为操作系统认为您有真正的网络连接,操作系统会多次尝试使用它。最终这应该安静下来,当一切都得出结论,这不是一个有用的链接。
请求来自TCPIP。如果您不希望TCPIP发送数据,请从适配器取消绑定。
您绝对可以将数据发送到适配器。实际上,您已经观察到您已经发送了随机HTTP数据包等。但是,在您教授驱动程序如何与您的真实硬件通信之前,数据实际上不会到达Internet。
如果你坐在那里想“但我没有硬件!”,那么你可能想要创建某种虚拟微型端口。虚拟微型端口就像netvmini,因为它们没有真正的硬件,但它们仍然有一些方法可以将数据包从机器上移除。例如,在第2层(如L2TP)运行的VPN微型端口通常会安装第二个驱动程序,这个驱动程序是从“真实”物理微型端口发送和接收数据的NDIS协议驱动程序。然后虚拟微型端口在需要从机器上获取数据包时与其协议进行通信。结果是:
TCPIP | Your virtual miniport | Your NDIS protocol | The real physical miniport | The Internet
还有其他架构;例如,在第4层(如SSTP)运行的VPN可能决定打开WSK套接字而不是实现NDIS协议驱动程序:
TCPIP | Your virtual miniport | WSK socket | TCPIP | The real physical miniport | The Internet