阅读:1589回复:11
20分再问各位大侠,在定时器函数中发自定义包死机的问题
我在IMD驱动中的定时器函数中调用NdisMIndicateReceivePacket函数向上发自定义包,使用softice调试,发现每次调用到该函数时机器会死机。
我自己分析会不会是因为定时器函数和ptreceive函数都调用NdisMIndicateReceivePacket造成冲突引起的啊? 有没有什么解决方法么? :( |
|
沙发#
发布于:2003-07-30 16:35
自己顶一下 :)
还有一个情况,如果将包的status作如下设置: NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); 系统不会死机,但是会影响上网和收发邮件,提示:“无法解析服务器ip地址” 不明白,困惑中 :P |
|
板凳#
发布于:2003-07-30 17:56
自己顶一下 :) 设置RESOURCES表示低层网卡的资源不足,这时TCP协议栈回把收发包的速度马上降下来。导致丢包。 //这是我的想法,没有经过证实。 |
|
|
地板#
发布于:2003-07-30 18:01
[quote]自己顶一下 :) 设置RESOURCES表示低层网卡的资源不足,这时TCP协议栈回把收发包的速度马上降下来。导致丢包。 //这是我的想法,没有经过证实。 [/quote] 证实~~~ |
|
|
地下室#
发布于:2003-07-30 18:22
非常高兴得到证实。:)
|
|
|
5楼#
发布于:2003-07-30 19:01
if((Seconds-LiveSeconds)>20)//如果>20秒
{ NdisDprAllocatePacket(&Status, &MyPacket, MyAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { NdisAllocateBuffer(&Status, &pPacketBuffer, MyAdapt->RecvBufferPoolHandle, m_BufferSystemVirtualAddress+Num*58, 54);// PacketLen if(Status == NDIS_STATUS_SUCCESS) { NdisChainBufferAtFront(MyPacket, pPacketBuffer); MyPacket->Private.Head->Next = NULL; MyPacket->Private.Tail = NULL; Rsvd=(PRSVD)(MyPacket->MiniportReserved); Rsvd->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE(MyPacket, 14); if(MyAdapt->MiniportHandle==NULL) { DBGPRINT(\"miniporthandle为空\\n\"); } //** NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(MyAdapt->MiniportHandle, &MyPacket, 1); NdisZeroMemory(m_BufferSystemVirtualAddress+Num*58,58); if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING) { NdisFreeBuffer(pPacketBuffer); NdisDprFreePacket(MyPacket); } } } } 上面是我的代码,麻烦各位大侠看看为什么会死机? |
|
6楼#
发布于:2003-07-31 08:07
m_BufferSystemVirtualAddress这个东西在哪里申请的?
为什么释放包的时候,没有释放m_BufferSystemVirtualAddress, m_BufferSystemVirtualAddress的总长度是多少? |
|
|
7楼#
发布于:2003-07-31 09:22
这个m_BufferSystemVirtualAddress是一个全局的变量,在mphalt中释放资源。
|
|
8楼#
发布于:2003-07-31 09:29
90%错在这里了,你自己去找把,或者把m_BufferSystemVirtualAddress的那部分代码帖出来
|
|
|
9楼#
发布于:2003-07-31 09:39
这部分的代码不会有问题,具体的过程如下:
1、这个驱动如果只能虚拟一个rst包,也就是m_BufferSystemVirtualAddress中只保存最近的一个tcp连接的各特征项,如果我在定时器函数中在向上指示这个虚拟包时,设定 NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); 程序完全正常,好像也没有发现丢包的现象,而且完全实现我的要求:超时后断开tcp连接; 2、我把这个驱动修改成可以防御多包的tcp攻击时,就出现了上述问题。 因此我认为m_BufferSystemVirtualAddress中组建的包应该没有什么问题,我想应该是原理上的,也就是我这样自己组包发送原理的问题 |
|
10楼#
发布于:2003-07-31 09:49
我刚才又看了论坛中的一个帖子“部分源码,很精彩”
在ptreceive函数中有如下设置: // // Make sure the status is set to NDIS_STATUS_RESOURCES. // NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES); 这样作的目的是什么啊? 会不会也出现降低TCP协议栈收发包的速度啊? 以前有个测试:网卡本来走ptreceivepacket函数,结果把该标志设置后,就该走ptreceive了,上面是不是这样的考虑啊? |
|
11楼#
发布于:2003-07-31 11:16
谢谢各位大侠,放分先 :D
|
|