NDIS和微型端口驱动程序

时间:2012-06-29 02:25:35

标签: visual-studio ethernet wdk ndis

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

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

我在Visual Studio 2012中构建它后能够安装微型端口适配器[在我的网络适配器列表中显示为'Microsoft Virtual Miniport Adapter'。]我也可以为其分配IP地址和子网掩码。[我发现它没有连接到我电脑上的任何物理设备]。

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

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

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

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

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

3-我可以使用WDK中提供的样本实际执行此操作吗?

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

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

由于 阿迪亚

1 个答案:

答案 0 :(得分:5)

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请求。

回答您的具体问题:

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

  2. 请求来自TCPIP。如果您不希望TCPIP发送数据,请从适配器取消绑定。

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

  4. 如果你坐在那里思考“但我没有硬件!”,那么你可能想要创建某种虚拟微型端口。虚拟微型端口就像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