NDIS 微型端口驱动程序与许多低级驱动程序一样,旨在与硬件通信。微型端口的职责是从操作系统获取发送数据包,将它们转换为硬件所需的任何格式,并指示硬件在线发送数据包。
WDK 可以(事实上,曾经)包含一个在真实硬件上发送数据包的真实示例驱动程序。但这会导致一些混乱,因为现实世界的驱动程序必须处理许多特定于硬件的细节,这些细节会分散示例的要点。如果您从现实世界的驱动程序开始,您要做的第一件事就是识别所有特定于硬件的位并将其删除,以便您可以用您自己的特定于硬件的位替换它们。
相反,WDK 中的“netvmini”示例是一个假驱动程序。这意味着它假装拥有实际的硬件,但实际上这都是谎言。当操作系统将数据包发送到 netvmini 时,netvmini 驱动程序将简单地将这些数据包广播到该计算机上安装的任何其他 netvmini 微型端口适配器。 (实际上,在同一台计算机上安装 2 个 netvmini 适配器模拟了将两个真实适配器插入同一个以太网集线器时会发生的情况。)因此,在 ASCII-art 中,如果您在同一系统上安装两个 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 数据包等。但数据实际上不会到达互联网,除非您教驱动程序如何与您的真实硬件对话。
如果您坐在那里思考“但我没有硬件!”,那么您可能想要创建某种类型的虚拟微型端口。虚拟微型端口类似于 netvmini,因为它们没有真正的硬件,但它们仍然有某种方法将数据包从计算机中取出。例如,在第 2 层(如 L2TP)运行的 VPN 微型端口通常会安装第二个驱动程序(NDIS 协议驱动程序),用于从“真实”物理微型端口发送和接收数据。然后,每当虚拟微型端口需要从机器上获取数据包时,就会与其协议进行对话。结果是:
TCPIP
|
Your virtual miniport
|
Your NDIS protocol
|
The real physical miniport
|
The Internet
有替代架构;例如,在第 4 层运行的 VPN(如 SSTP)可能决定打开 WSK 套接字而不是实现 NDIS 协议驱动程序:
TCPIP
|
Your virtual miniport
|
WSK socket
|
TCPIP
|
The real physical miniport
|
The Internet