阅读:1629回复:8
PASSTHRU里MPSend函数的问题
各位大虾:
请看: PASSTHRU里MPSend函数里有如下代码 NdisSend(&Status, pAdapt->BindingHandle, MyPacket); if (Status != NDIS_STATUS_PENDING) { NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket); NdisFreePacket(MyPacket); } } else { // // We are out of packets. Silently drop it. Alternatively we can deal with it: // - By keeping separate send and receive pools // - Dynamically allocate more pools as needed and free them when not needed // } 我想请问: 1。当 NdisSend(&Status, pAdapt->BindingHandle, MyPacket); 函数返回的Status值为 NDIS_STATUS_PENDING时NdisFreePacket(MyPacket)没有执行,那前面NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle)函数声明的MyPacket的资源岂不是没有被释放,这样一来程序为什么不会出错? 2。当我不想让驱动向下发送数据包时,我将前面的NdisSend语句注释掉,结果运行后是不能发包了,但是又发现收包也不行了,这是怎么回事,如果我只想单纯的禁止发包而不影响收包应该如何修改呢? 希望能得到高手的指点,我是一只饥渴的菜鸟:( |
|
沙发#
发布于:2003-04-08 18:05
1。好像返回PENDING的时候要到SENDCOMPLETE里面释放的。
2。正在考虑 新手的理解,不知道对不对。。 |
|
板凳#
发布于:2003-04-08 18:45
第一个问题我认为楼上的说得对
第二个问题,因为网上的包大都是一个过去一个回来,有因才有果,别人收不到你的包,自然也不理你了。 |
|
地板#
发布于:2003-04-08 20:04
2。当我不想让驱动向下发送数据包时,我将前面的NdisSend语句注释掉,结果运行后是不能发包了,但是又发现收包也不行了,这是怎么回事,如果我只想单纯的禁止发包而不影响收包应该如何修改呢? 只想收包,你只要关心与receivepacket相关的函数就可以了。一般来说,只需要接收数据包,可以不用中间层,用协议(protocol)来得简单。 |
|
地下室#
发布于:2003-04-09 09:42
注掉ndisend以后,还要告诉协议层这个包你已经发出去了,让他释放资源。
|
|
|
5楼#
发布于:2003-04-09 09:47
第一个问题就是在sendcomplete里面来处理,释放你的资源
|
|
|
6楼#
发布于:2003-04-09 15:06
注掉ndisend以后,还要告诉协议层这个包你已经发出去了,让他释放资源。
是通过NdisIMCopySendCompletePerPacketInfo函数吗? |
|
7楼#
发布于:2003-04-24 11:24
估计可能是的吧!
据我的理解NdisSend 负责调用Ndis 来发送数据,而这个是提示上层协议发送完成。 |
|
8楼#
发布于:2003-04-24 11:42
sendcomplete
|
|
|