首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NDIS和微型端口驱动程序

NDIS和微型端口驱动程序
EN

Stack Overflow用户
提问于 2012-06-29 10:25:35
回答 1查看 3.1K关注 0票数 3

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

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

在Visual Studio 2012中构建迷你端口适配器后,我能够安装它。在我的网络适配器列表中显示为“Microsoft Virtual miniport adapter”。我还可以为它分配IP地址和子网掩码。我发现它没有连接到我PC上的任何物理设备。

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

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

2-我设置Wireshark来捕获适配器上的数据,它显示有来自ARP、HTTP、SSDP、MDNS等的请求。我不能理解实际上正在与适配器通信的是什么?我怎么才能让它不说话呢?

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

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

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

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

PS-我无法使用Visual Studio 2012内置的windows调试器。我用了两台电脑,可以将驱动程序连接并安装到“目标”电脑上,但无法处理断点等问题。在“目标”电脑上安装驱动程序后,代码和程序什么也不做。对此有什么建议吗?我以为我也可以一步一步地调试驱动程序,我知道我错了。

谢谢,阿迪亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-30 01:42:22

NDIS微型端口驱动程序,就像许多低级驱动程序一样,旨在与硬件通信。微型端口的职责是从操作系统获取发送数据包,将其转换为硬件所需的任何格式,并指示硬件在线路上发送数据包。

WDK可以(实际上,过去常常)包含一个在真实硬件上发送数据包的真实示例驱动程序。但这会导致一些混乱,因为现实世界中的驱动程序必须处理许多特定于硬件的细节,这些细节分散了样本的主要观点。如果你从一个真实的驱动程序开始,你必须做的第一件事就是识别所有特定于硬件的部分,然后把它们去掉,这样你就可以用你自己的特定于硬件的部分来替换它们。

相反,WDK中的"netvmini“示例是一个假驱动程序。这意味着它假装有真正的硬件,但实际上这一切都是谎言。当操作系统将数据包发送到netvmini时,netvmini驱动程序将简单地将这些数据包广播到安装在该计算机上的任何其他netvmini微型端口适配器。(实际上,在同一台机器上安装两个netvmini适配器就相当于将两个真正的适配器插入到同一个以太网集线器中。)因此,在ASCII-art中,如果在同一系统上安装两个netvmini适配器,将会发生以下情况:

代码语言:javascript
复制
       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. 您绝对可以将数据发送到适配器。事实上,你已经观察到你已经在发送随机的超文本传输协议数据包等等,但数据不会真正到达互联网,直到你教会司机如何与你真正的硬件对话。

如果你坐在那里想“但是我没有硬件!”,那么你可能想要创建一个虚拟的迷你端口。虚拟迷你端口类似于netvmini,因为它们没有真正的硬件,但它们仍然有一些方法可以从机器上获取数据包。例如,在第二层运行的虚拟专用网小型端口(如L2TP)通常会安装第二个驱动程序-- NDIS协议驱动程序--从“真正的”物理小型端口发送和接收数据。然后,每当需要从机器上获取数据包时,虚拟微型端口都会与其协议对话。结果是:

代码语言:javascript
复制
        TCPIP
          |
  Your virtual miniport
          |
   Your NDIS protocol
          |
The real physical miniport
          |
     The Internet

还有其他体系结构;例如,在第4层运行的VPN (如SSTP)可能决定打开WSK套接字,而不是实现NDIS协议驱动程序:

代码语言:javascript
复制
        TCPIP
          |
  Your virtual miniport
          |
      WSK socket
          |
        TCPIP
          |
The real physical miniport
          |
     The Internet
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11255311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档