cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:2612回复:19

如何使驱动程序收到一个由它自己构造的包?

楼主#
更多 发布于:2005-07-29 17:58
  我的驱动是用passthru改的。当我访问(如ping)局域网中一台不存在的主机时,驱动会截到ARP请求包,因为这个主机不存在,所以没有主机会响应这个ARP请求包。我想在驱动截到ARP请求包之后,让驱动自己响应ARP请求包,让系统认为这个主机是存在的,我应该怎么做?
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-30 08:27
希望版主和各们高手能够不吝赐教!谢谢!
gx_kyw
驱动牛犊
驱动牛犊
  • 注册日期2003-01-23
  • 最后登录2011-04-13
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-31 21:59
直接调用底层miniport 的 SendHandle 就能发送了吧。
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-08-01 12:05
1、我在MPSend函数中可以截到发出的ARP请求包,我是否应该让这个包发出去?
2、我应该在哪个函数里面写接收ARP应答包的代码?就在MPSend函数中可以吗?
3、要想让系统接收到ARP应答包是不是直接调用NdisMIndicateReceivePacket函数就可以呢?
我是个新手,希望各位达人能够多多指教!
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-08-02 09:33
1、既然不存在,发不发都不重要了。当然不发省点事。
2、MPSend比较合适。
3、是的。
RTW:一定要构造正确的包返回给系统。注意NdisMIndicateReceivePacket返回PENDING时的处理。
daweia
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2007-12-15
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-08-02 13:16
不同意楼上的。按我做过的说一下:
1。不发的话,上层会认为arp失败,所以,要发出去
2。我处理的可能复杂点。a首先在MPsendpackets里判断是否arp,然后修改arp类型为自定义(为了防止死锁)。b在PtSendComplete里,判断是否发完的是刚才修改过的arp包,然后调用NdisSend
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-08-02 13:29
下面是引用asmsys于2005-08-02 09:33发表的:
1、既然不存在,发不发都不重要了。当然不发省点事。
2、MPSend比较合适。
3、是的。
RTW:一定要构造正确的包返回给系统。注意NdisMIndicateReceivePacket返回PENDING时的处理。

谢谢asmsys大哥!
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-08-02 13:33
不知道daweia是在哪一层实现的,看你的描述应该是IMD了。
如果是IMD,就请教不发送为什么上层会认为ARP失败?虽然不发送,但我也返回的是成功呀,上层如何知道我发了没有。
再有一点不明白,既然都PtSendComplete,为什么还要NdisSend。
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-08-02 13:36
下面是引用daweia于2005-08-02 13:16发表的:
不同意楼上的。按我做过的说一下:
1。不发的话,上层会认为arp失败,所以,要发出去
2。我处理的可能复杂点。a首先在MPsendpackets里判断是否arp,然后修改arp类型为自定义(为了防止死锁)。b在PtSendComplete里,判断是否发完的是刚才修改过的arp包,然后调用NdisSend

谢谢daweia大哥!不过你说的第2点我不是很明白。
a如果不修改arp类型为什么会引起死锁呢?
b我就更明白了,为什么要做判断还要调用NdisSend?
daweia
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2007-12-15
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-08-02 13:53
下面是引用asmsys于2005-08-02 13:33发表的:
不知道daweia是在哪一层实现的,看你的描述应该是IMD了。
如果是IMD,就请教不发送为什么上层会认为ARP失败?虽然不发送,但我也返回的是成功呀,上层如何知道我发了没有。
再有一点不明白,既然都PtSendComplete,为什么还要NdisSend。


返回success,但是你要不要NdisMSendComplete呢,不然就不行。
PtSendComplete是指arp请求包而言,它发出了并且NdisMSendComplete了,再用NdisSend发送arp应答包
daweia
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2007-12-15
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-08-02 13:56
下面是引用cyk119于2005-08-02 13:36发表的:

谢谢daweia大哥!不过你说的第2点我不是很明白。
a如果不修改arp类型为什么会引起死锁呢?
b我就更明白了,为什么要做判断还要调用NdisSend?

不修改类型的话,NdisSend的arp应答包又会调用PtSendComplete,实际判断是arp请求也可以。
为了保险起见,我把arp欺骗的请求包改了,也免得其他机器也回arp应答。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-08-02 14:20
下面是引用daweia于2005-08-02 13:53发表的:


返回success,但是你要不要NdisMSendComplete呢,不然就不行。
PtSendComplete是指arp请求包而言,它发出了并且NdisMSendComplete了,再用NdisSend发送arp应答包


不发送是指不调用NDISSEND,其他的操作一样进行,我说的返回成功,当然是通过NdisMSendComplete返回的了,不是简单的RETURN。

第二点,我认为“用NdisSend发送arp应答包”纯属多余,你看呢。我认为我的做法和你的一样,除了这一点。
daweia
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2007-12-15
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-08-02 14:48
下面是引用asmsys于2005-08-02 14:20发表的:


不发送是指不调用NDISSEND,其他的操作一样进行,我说的返回成功,当然是通过NdisMSendComplete返回的了,不是简单的RETURN。

第二点,我认为“用NdisSend发送arp应答包”纯属多余,你看呢。我认为我的做法和你的一样,除了这一点。

我用NdisSend而没有自己组一个包然后IndicateReceivePacket,其实是一样的。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-08-02 15:13
下面是引用daweia于2005-08-02 14:48发表的:

我用NdisSend而没有自己组一个包然后IndicateReceivePacket,其实是一样的。


我还是不明白着不IndicateReceivePacket,如何让主机收到ARP应答包。
daweia
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2007-12-15
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-08-02 15:44
下面是引用asmsys于2005-08-02 15:13发表的:


我还是不明白着不IndicateReceivePacket,如何让主机收到ARP应答包。

我调用NdisSend后,等于从本机发到网络上,然后本机自己又收到这个包,随后的IndicateReceivePacket就是在PtReceive里执行的啊,我的意思是不用自己组包IndicateReceivePacket了
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-08-03 09:09
下面是引用daweia于2005-08-02 15:44发表的:

我调用NdisSend后,等于从本机发到网络上,然后本机自己又收到这个包,随后的IndicateReceivePacket就是在PtReceive里执行的啊,我的意思是不用自己组包IndicateReceivePacket了

我基本上明白了你的意思,但还有一点我不太明白,你本来发送是ARP请求包,怎么不用自己构造ARP应答包就能在PtSendComplete中用NdisSend发送ARP应答包了呢?另外你应答的MAC地址是谁的呀?
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-08-05 15:20
下面是引用asmsys于2005-08-02 09:33发表的:
1、既然不存在,发不发都不重要了。当然不发省点事。
2、MPSend比较合适。
3、是的。
RTW:一定要构造正确的包返回给系统。注意NdisMIndicateReceivePacket返回PENDING时的处理。

在MPSend函数中只有MiniportAdapterContext句柄,而接收的时候需要ProtocolBindContext句柄,这两个句柄是一个东西吗?如果不是一个东西我应该如何在MPSend函数中获取ProtocolBindContext句柄呢?还请asmsys大哥多多指点。
zwjnj2005
驱动牛犊
驱动牛犊
  • 注册日期2005-07-11
  • 最后登录2008-09-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-08-10 15:15
cyk119:
你的问题解决了吗,请赐教
cyk119
驱动牛犊
驱动牛犊
  • 注册日期2005-07-12
  • 最后登录2010-10-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望14点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-08-10 15:19
下面是引用zwjnj2005于2005-08-10 15:15发表的:
cyk119:
你的问题解决了吗,请赐教

还没有,最近比较忙,没有时间做NDIS。
daweia
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2007-12-15
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望7点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-08-11 12:50
下面是引用cyk119于2005-08-03 09:09发表的:

我基本上明白了你的意思,但还有一点我不太明白,你本来发送是ARP请求包,怎么不用自己构造ARP应答包就能在PtSendComplete中用NdisSend发送ARP应答包了呢?另外你应答的MAC地址是谁的呀?


当然要先组包再发送了。应答包的目的MAC写自己,源mac你想指向谁就写谁的MAC
游客

返回顶部