阅读:3108回复:9
请问多网卡的情况下调用ndisSend发包时,怎么指定从哪块网卡发出?
我是在passthru的基础上改的,想做一个NAT功能,已经实现了接包后转发,但是不知道怎么指定发包网卡。我查到有人说是根据Windows路由表发出,不知道是不是这样,还是全部网卡都会转发?
我想自己指定发包网卡,比如调用ndisSend时用{62E9DB05-88D3-479D-A194-22D6A591DB96}这种形式指定网卡,请问可以做到吗? |
|
沙发#
发布于:2012-12-10 11:23
passthru里面,可以知道自身绑定了多少个网卡,有个链表保存这些信息。这些网卡的MAC信息可以知道。
|
|
板凳#
发布于: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); |
|
地板#
发布于:2012-12-11 10:05
1、那个是微软创建的虚拟网卡,不鸟他
2、 PADAPT pAdaptList;就是保存绑定网卡的链表指针,遍历它就知道绑定哪些网卡 3、代码中,句柄都是pAdapt->BindingHandle,其实不同网卡触发的MPSendPackets,其pAdapt值是不一样的。就是说,中间层驱动绑定甲乙两个网卡,对甲网卡发送报文,MPSendPackets里面的pAdapt->BindingHandle是一个值;对乙网卡发送报文,MPSendPackets里面的pAdapt->BindingHandle又是一个值。你可以把它的地址打印出来比对一下。 |
|
地下室#
发布于:2012-12-11 18:12
楼上说的很对。
VOID NdisSend( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_PACKET Packet ); 第二个参数你可以把它堪为网卡的句柄。 |
|
|
5楼#
发布于:2012-12-11 19:00
回 zhangfresh 的帖子
zhangfresh:1、那个是微软创建的虚拟网卡,不鸟他 你好,谢谢你呀 确实是这样的,pAdapt是有多个的,BindingHandle也有多个,我打印了一下,发现了这样的问题: 我在Win7里(共五块网卡:物理网卡、VMNet1、VMNet2、VMNet8、MS Loopback)测试发现,在PtBindAdapter里只能绑定到物理网卡、MS Loopback、ndiswanip、ndiswanipv6 、ndiswanbh,却绑不到VMNet的网卡。 另外我再2003 sp2虚拟机里(物理网卡1、物理网卡2、MS Loopback)也试了一下,发现只能绑定到两块物理网卡和ndiswanip,MS Loopback都绑定不到,请问这又是怎么回事呢? |
|
6楼#
发布于:2012-12-12 09:54
中间层驱动的主inf里面,
有个HKR, Ndi\Interfaces, FilterMediaTypes, “xxxxx”的配置 就是代表要绑定哪几类网卡驱动 另外代码中,好像也有根据mediatype判断是否要绑定的。 以前碰到过绑不上某个网卡的问题,发现是天翼的中间层,把mediatype修改了,导致不绑定。 |
|
7楼#
发布于:2012-12-14 23:12
回 zhangfresh 的帖子
zhangfresh:中间层驱动的主inf里面, 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" |
|
8楼#
发布于:2013-01-30 14:28
难道要自己维护一个PADAPT 列表?可行吗?
|
|
9楼#
发布于:2013-01-31 13:25
passthru代码里面已经维护了一个列表
|
|