阅读:1951回复:3
中间层 passthru 发包问题?调用发送后蓝屏?
我的目的是 在MpSendPackets中 如果检测到某包A,则 发送A ,并且构造另外一个包B
并且发送A和B 现在是调用NdisSend后蓝屏 代码如下 Status = NdisAllocateMemoryWithTag(&pPacketContent,PacketLen,TAG); NdisZeroMemory(pPacketContent,PacketLen); //填充包内容 FillContentData(pPacketContent,PacketLen); //分配一个新包 NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle); if(NT_SUCCESS(Status)) { //用上面的包内容 pPacketContent 分配一个新的缓冲区 PacketBuffer NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,PacketLen); //把这个新分配的缓冲区 连接到 刚分配的新的包上 NdisChainBufferAtFront( MyPacket, PacketBuffer); MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);//自己定义的包 KdPrint(("自己发网卡 handle %u",pAdapt->BindingHandle)); GetPktData(MyPacket,OutBuffer,54 ,&ReturnLen); KdPrint(("ReturnLen,%d",ReturnLen)); NdisSend(&Status, pAdapt->BindingHandle, MyPacket);//发送 if (Status != NDIS_STATUS_PENDING) { NdisUnchainBufferAtFront(MyPacket ,&PacketBuffer); NdisFreeBuffer(PacketBuffer); NdisFreeMemory(pPacketContent,2000,0); NdisDprFreePacket(MyPacket); } return ; } else { NdisFreeMemory(pPacketContent,PacketLen,0); return ; } 感觉构造和发送没有问题..是否是因为发送完之后 没有释放该包 或者发包返回Pending 之后再 SendComplete 的时候 ,把我构造的包 用NdisMSendComplete通知上层释放 导致的错误? |
|
沙发#
发布于:2007-12-25 18:15
蓝屏 是 说IRQL 问题
可是NdisSend 函数本身并应该没有这个错误啊.感觉应该是SendComplete的问题.. 请教是 是否是如此? 我再修改下Complete看看,不会调试真麻烦啊..光看打印的调试信息还看不出问题........大大们 帮我解下惑 |
|
板凳#
发布于:2007-12-26 10:43
自己构造发送的b包,不要NdisMSendComplete通知上层释放,蓝屏就是因为通知上层造成的。自己分配,自己释放
|
|
地板#
发布于:2007-12-26 17:23
谢谢了。.
不过我发现系统的包不释放也没事...就是驱动不能卸了 只能删 还有蓝屏的 BAD_POOL_HEAD 是什么错 缓冲头地址出错嘛?还是跨越 分页内存? |
|