lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
阅读:4555回复:13

(增加最简nat源码)passthru PtRecieve调用ndissend应该处理内存

楼主#
更多 发布于:2004-02-11 14:49
在ptRecieve中

先做好合适的正确的包pPacketContent
然后
NdisAllocateBuffer(&Status,&FirstBuffer,send_handle,pPacketContent,len);//分配buffer,并把全局变量或在本函数上面定义的数据包地址pPacketContent中的
//内容复制到分配的buffer里
NdisChainBufferAtFront( MyPacket, FirstBuffer);//把刚分配的buffer设为要发送包MyPacket的第一个buffer

Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
Rsvd->OriginalPkt = Packet;
MyPacket->Private.Head->Next =NULL;//把buffer的链接下一个指针置0,即设置发送链表只有一个buffer元素
MyPacket->Private.Tail =NULL;//把Tail指针也置0
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);//设置Flags*/
DBGPRINT("  to call ndissend start!n");
NdisSend(&Status,pAdapt->BindingHandle,MyPacket);

*** C:NTDDKsrcnetworkndispassthruprotocol.c (1012) ***  locate packet for mypacket from send_handle
*** C:NTDDKsrcnetworkndispassthruprotocol.c (1047) ***  copy packet to MyPacket finished
*** C:NTDDKsrcnetworkndispassthruprotocol.c (1052) ***  to call ndissend start!n

*** Fatal System Error: 0x000000d1
                       (0x05018064,0x00000002,0x00000000,0xF40ADD81)
在ptRecieve中调用ndissend如何处理内存比较合理?


[编辑 -  3/8/04 by  lauer]

最新喜欢:

xiaojian521xiaoji...
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-02-12 11:00
用ndissend发送如何处理内存才正确呢?

困扰中!

[编辑 -  2/12/04 by  lauer]
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2004-02-12 16:29
问题解决了
就是PtSendComplete是要自己释放载PtRecieve的Packet
而不能继续调用NdisMSendComplete
因为这个包不是Protocol层发出的,
不用还原原始包。
我测试完基本的Nat功能后就放一个最简nat源码上来!
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-02-13 15:20
刚刚测试完的passthru nat例子
实现:
在局域网内把一台机器来的udp或ip包在ndis层
更改mac地址和ip地址实现nat
(发回原地本例仅是调换而已,更多的就看发挥了)

本例传输大数据依然存在很多问题
主要是内存分配和buffer链处理
希望有经验的大大给个指导


[编辑 -  2/13/04 by  lauer]

这个例子有很多错误,我已经修改了很多
不过由于现在基本上已经完成了整个任务
基于工作上的原因,不能把新的代码放上来
只能写一些修改意见在我下面的贴子中。


[编辑 -  3/8/04 by  lauer]
附件名称/大小 下载次数 最后更新
2004-02-13_passthru_nat.rar (56KB)  228
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-03-08 14:45
当然是使用DbgPrint或DBGPRINT
借助vmware虚拟系统和com口使用windbg就可以
可方便的实现debug了

强烈推荐使用vmware调试ndis驱动
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2004-03-08 14:51
对于碰到的碎片包,
按照MpSend里的方法复制包的OOB数据等
同时对碎片不用修改协议层的端口等(碎片可能没有协议层)
就可以顺利的把碎片包发出

还有就是需要做一个队列把发送的包记住
这样再PtSendComplete时就了一区别对待是否自己发送的包
以保证在发送大包碎片时不会出错

如果需要做pat,那就麻烦多了--需要把碎片先存下来,
到齐了修改完了,再分别发出
游客

返回顶部