hsluoyz
驱动牛犊
驱动牛犊
  • 注册日期2009-01-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3108回复:9

请问多网卡的情况下调用ndisSend发包时,怎么指定从哪块网卡发出?

楼主#
更多 发布于:2012-12-08 23:51
我是在passthru的基础上改的,想做一个NAT功能,已经实现了接包后转发,但是不知道怎么指定发包网卡。我查到有人说是根据Windows路由表发出,不知道是不是这样,还是全部网卡都会转发?

我想自己指定发包网卡,比如调用ndisSend时用{62E9DB05-88D3-479D-A194-22D6A591DB96}这种形式指定网卡,请问可以做到吗?
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2024-11-22
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2012-12-10 11:23
passthru里面,可以知道自身绑定了多少个网卡,有个链表保存这些信息。这些网卡的MAC信息可以知道。
hsluoyz
驱动牛犊
驱动牛犊
  • 注册日期2009-01-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2012-12-10 23:33
谢谢,我发现PtBindAdapter会被每个物理网卡调用一次,其传入参数DeviceName就是GUID,但是有几点疑问:
1)PtBindAdapter除了绑定每个物理网卡,还会绑定一个叫\Device\ndisipwan的东西,这个是什么?从没有见过
2)我的这份passthru里NdisOpenAdapter是下面这样调用的,貌似是把得到的网卡句柄放到pAdapt->BindingHandle里,这样的话多个网卡的话岂不是只保留了最后绑定的网卡的句柄?我看了一下MPSend、MPSendPackets里的NdisSend参数都是这个BindingHandle,也就是说passthru默认所有的包都从最后绑定的网卡发出去,这样在多网卡的环境下岂不是会出错啊?
NdisOpenAdapter(Status,
                          &Sts,
                          &pAdapt->BindingHandle,
                          &MediumIndex,
                          MediumArray,
                          sizeof(MediumArray)/sizeof(NDIS_MEDIUM),
                          ProtHandle,
                          pAdapt,
                          DeviceName,
                          0,
                          NULL);
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2024-11-22
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2012-12-11 10:05
1、那个是微软创建的虚拟网卡,不鸟他
2、 PADAPT                   pAdaptList;就是保存绑定网卡的链表指针,遍历它就知道绑定哪些网卡
3、代码中,句柄都是pAdapt->BindingHandle,其实不同网卡触发的MPSendPackets,其pAdapt值是不一样的。就是说,中间层驱动绑定甲乙两个网卡,对甲网卡发送报文,MPSendPackets里面的pAdapt->BindingHandle是一个值;对乙网卡发送报文,MPSendPackets里面的pAdapt->BindingHandle又是一个值。你可以把它的地址打印出来比对一下。
iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2012-12-11 18:12
楼上说的很对。

VOID
  NdisSend(
    OUT PNDIS_STATUS  Status,
    IN NDIS_HANDLE  NdisBindingHandle,
    IN PNDIS_PACKET  Packet
    );


第二个参数你可以把它堪为网卡的句柄。
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
hsluoyz
驱动牛犊
驱动牛犊
  • 注册日期2009-01-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2012-12-11 19:00
回 zhangfresh 的帖子
zhangfresh:1、那个是微软创建的虚拟网卡,不鸟他
2、 PADAPT                   pAdaptList;就是保存绑定网卡的链表指针,遍历它就知道绑定哪些网卡
3、代码中,句柄都是pAdapt->BindingHand .. (2012-12-11 10:05)

你好,谢谢你呀
确实是这样的,pAdapt是有多个的,BindingHandle也有多个,我打印了一下,发现了这样的问题:

我在Win7里(共五块网卡:物理网卡、VMNet1、VMNet2、VMNet8、MS Loopback)测试发现,在PtBindAdapter里只能绑定到物理网卡、MS Loopback、ndiswanip、ndiswanipv6 、ndiswanbh,却绑不到VMNet的网卡。

另外我再2003 sp2虚拟机里(物理网卡1、物理网卡2、MS Loopback)也试了一下,发现只能绑定到两块物理网卡和ndiswanip,MS Loopback都绑定不到,请问这又是怎么回事呢?
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2024-11-22
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2012-12-12 09:54
中间层驱动的主inf里面,
有个HKR, Ndi\Interfaces, FilterMediaTypes, “xxxxx”的配置
就是代表要绑定哪几类网卡驱动

另外代码中,好像也有根据mediatype判断是否要绑定的。
以前碰到过绑不上某个网卡的问题,发现是天翼的中间层,把mediatype修改了,导致不绑定。
hsluoyz
驱动牛犊
驱动牛犊
  • 注册日期2009-01-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望111点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2012-12-14 23:12
回 zhangfresh 的帖子
zhangfresh:中间层驱动的主inf里面,
有个HKR, Ndi\Interfaces, FilterMediaTypes, “xxxxx”的配置
就是代表要绑定哪几类网卡驱动

另外代码中,好像也有根据mediatype判断是否要绑定的。
....... (2012-12-12 09:54)

dbgview发现PtBindAdapter对于MS Loopback来说根本就不调用,应该就是netsf.inf的问题,但是我不知道怎么修改这个文件。。还希望你能指教一下~

应该就是这几行吧?
HKR, Ndi,            FilterClass,         , failover
HKR, Ndi,            FilterDeviceInfId,   , ms_passthrump
HKR, Ndi,            Service,             , Passthru
HKR, Ndi\Interfaces, UpperRange,          , noupper
HKR, Ndi\Interfaces, LowerRange,          , nolower
HKR, Ndi\Interfaces, FilterMediaTypes,    , "ethernet, tokenring, fddi, wan"
fly4free
驱动牛犊
驱动牛犊
  • 注册日期2005-03-11
  • 最后登录2013-01-30
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望162点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2013-01-30 14:28
难道要自己维护一个PADAPT 列表?可行吗?
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2024-11-22
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2013-01-31 13:25
passthru代码里面已经维护了一个列表
游客

返回顶部