3

我正在尝试使用 Visual Studio 2012 中提供的 WDK 工具修改以太网驱动程序。

WDK 中提供的示例是“微型端口适配器”和“NDIS 轻型过滤器”等。我仍处于编写驱动程序的最开始,因此很难在代码中导航。

在 Visual Studio 2012 中构建微型端口适配器后,我能够安装它[在我的网络适配器列表中显示为“Microsoft 虚拟微型端口适配器”。]我还可以为其分配 IP 地址和子网掩码。[我发现这不会连接到我的 PC 上的任何物理设备]。

我还设置了“调试视图”软件来检查来自我的适配器的驱动程序消息。[我在代码中使用了“DbgPrint”语句然后构建它。]但是,调试消息被重复打印。

1-为什么会一次又一次地打印消息?消息来自程序的“datapath.c”文件,来自函数“MPSendNetBufferLists”。['Net Buffer' 指定在网络上发送或接收的数据。]

2-我设置了 Wireshark 来捕获适配器上的数据,它显示有来自 ARP、HTTP、SSDP、MDNS 等的请求来自它。我无法理解与适配器实际交谈的内容?我怎样才能阻止它说话?

我可以使用“ping”来查看我分配给适配器的 IP 地址上是否存在连接,它会成功响应,告诉所有数据包都已发送并且没有数据包丢失。

我的目标是通过 IP 地址向这个以太网适配器发送和接收“数据”数据包。即-我希望应用程序连接到分配给适配器的 IP 地址并与之交谈。

3- 我真的可以用 WDK 中提供的样本来做吗?

欢迎任何其他建议或意见。

PS-我无法使用 Visual Studio 2012 中内置的 Windows 调试器。我使用了 2 台 PC,能够将驱动程序连接并安装到“目标”PC 上,但无法对断点等进行任何操作。代码和在“目标”PC 上安装驱动程序后,程序什么也没做。对此有什么建议吗?我以为我也可以对驱动程序进行逐步调试。[我知道我错了]。

谢谢阿迪亚

4

1 回答 1

7

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-art 所展示的那样,您的 netvmini 适配器没有任何通往 Internet 的路径。因此,除非您添加硬件的详细信息,否则您的驱动程序不会获得可以路由到 Internet 的“真实”IP 地址。在那之前,Windows 将继续尝试发送永远不会到达任何地方的 ARP 和 HTTP 请求。

要回答您的具体问题:

  1. 每次操作系统尝试发送数据包时,都会打印来自 MPSendNetBufferLists 的消息。因为操作系统认为你有一个真实的网络连接,所以操作系统会多次尝试使用它。最终,当一切都得出结论认为这不是一个有用的链接时,这应该会平静下来。

  2. 请求来自 TCPIP。如果您不希望 TCPIP 发送数据,则将其与适配器解除绑定。

  3. 您绝对可以将数据发送到适配器。事实上,您已经观察到您已经在发送随机 HTTP 数据包等。但是数据实际上不会到达 Internet,直到您教驱动程序如何与您的真实硬件对话。

如果您坐在那里想“但我没有硬件!”,那么您可能想要创建某种虚拟微型端口。虚拟微型端口与 netvmini 类似,因为它们没有真正的硬件,但它们仍然有一些方法可以将数据包从机器中取出。例如,在第 2 层运行的 VPN 微型端口(如 L2TP)通常会安装第二个驱动程序 - 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
于 2012-06-29T17:42:22.140 回答