bakeyou
驱动牛犊
驱动牛犊
  • 注册日期2010-06-17
  • 最后登录2010-06-17
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2178回复:1

这是什么原因吗?(已解决!)

楼主#
更多 发布于:2010-06-17 02:42
在PtReceive函数中对数据包进行再处理:基本架构是参照前辈胡大侠的代码:

PtReceive()
{
  Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
        if (Packet != NULL)
       {}
      else if(LookAheadBufferSize >= PacketSize)
      {}
      else
      {
       //在此当中也参考胡大侠的部分,在PtTransferDataComplete 中对数据包进行重组在进行提交:
      }
}
但是在MPReturnPacket 中对刚申请的地址进行释放:

        RecvRsvd = (PRECV_RSVD)(Packet->MiniportReserved);
        MyPacket = RecvRsvd->OriginalPkt;    
        if(MyPacket)
        {
            NdisFreePacket(Packet);
            NdisReturnPackets(&MyPacket, 1);
        }
        else
        {
            NdisUnchainBufferAtFront(Packet, &pNdisBuffer);
            if(pNdisBuffer != NULL)
            {
                NdisQueryBufferSafe( pNdisBuffer, &pPacketContent, &PackContentLen, 32);
                DbgPrint(("MPResturn 释放情况 :MyPacket:%08x,Packet:%08x pNdisBuffer:%08x pPacketContent:%08x Len:%d \n",MyPacket,Packet,pNdisBuffer,pPacketContent,PackContentLen));
                NdisFreeBuffer( pNdisBuffer );                    
                if(pPacketContent != NULL)
                {
                    NdisFreeMemory(pPacketContent, PackContentLen, 0);
                    pPacketContent = NULL;        
                }
                NdisDprFreePacket(Packet);
                DbgPrint(("已经释放完毕\n"));
            }
        }

在 NdisFreeBuffer 出现错误: 分析如下:


BAD_POOL_CALLER (c2)
The current thread is making a bad pool request.  Typically this is at a bad IRQL level or double freeing the same allocation, etc.
Arguments:
Arg1: 00000007, Attempt to free pool which was already freed
Arg2: 00000cd4, (reserved)
Arg3: 00000000, Memory contents of the pool block
Arg4: 89577ce0, Address of the block of pool being deallocated

Debugging Details:
------------------


POOL_ADDRESS:  89577ce0 Nonpaged pool

BUGCHECK_STR:  0xc2_7

DEFAULT_BUCKET_ID:  DRIVER_FAULT

PROCESS_NAME:  Test.EXE

LAST_CONTROL_TRANSFER:  from 804f9afd to 8052b5d8

STACK_TEXT:  
b4644580 804f9afd 00000003 b46448dc 00000000 nt!RtlpBreakWithStatusInstruction
b46445cc 804fa6e8 00000003 89577da0 89577cd8 nt!KiBugCheckDebugBreak+0x19
b46449ac 804fac37 000000c2 00000007 00000cd4 nt!KeBugCheck2+0x574
b46449cc 8054b583 000000c2 00000007 00000cd4 nt!KeBugCheckEx+0x1b
b4644a1c 804f032c 89577ce0 00000000 8961aad0 nt!ExFreePoolWithTag+0x2a3
b4644a30 b44fe145 89577ce0 b380e000 b380e000 nt!IoFreeMdl+0x6e
b4644a58 b7e1e87f 898c7ea8 89577da0 b4644c9c passthru!MPReturnPacket+0x105 [f:\netpassthruc\passthru\driver\miniport.c @ 1178]
b4644a80 b4b2d875 8959ca30 00000001 b4644c9c NDIS!NdisReturnPackets+0xe9
89577ce0 89500ad0 8999e0a0 b380e000 00000000 afd!AfdReturnBuffer+0xe1
WARNING: Frame IP not in any known module. Following frames may be wrong.
89577cec 00000000 00480000 00000000 00000000 0x89500ad0

郁闷至死!各位大侠帮忙看看!..在此先谢过!如果代码不够的话,我再贴!非常感谢!
bakeyou
驱动牛犊
驱动牛犊
  • 注册日期2010-06-17
  • 最后登录2010-06-17
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-06-17 09:12
在MPReturnPacket中要处理NdisIndicateReceivePacket 情况,主要是因为在处理PtReceive时,分别考虑了可以完全收报和一次不能完全收到数据包的情况。PtTransferDataComplete的代码如下:VOID
PtTransferDataComplete(
    IN NDIS_HANDLE ProtocolBindingContext,
    IN PNDIS_PACKET Packet,
    IN NDIS_STATUS Status,
    IN UINT BytesTransferred
)
{
    PADAPT pAdapt = (PADAPT)ProtocolBindingContext;
    PUCHAR pPacketContent;
    PRSVD Rsvd;
    UINT OffsetSize, Result, PacketLen;

    PNDIS_BUFFER pPacketBuffer;
    PNDIS_PACKET pBakPacket;
    PNDIS_BUFFER pBakBuffer;

    PUCHAR pBakContent;
    UINT BufferLen , nPacketLen;
    UINT flag = 1;

    DbgPrint(("In PtTransferDataComplete\n"));

    //
    // Returning the Send on the Primary, will point to itself if there is no LBFO
    //
    pAdapt = pAdapt->pPrimaryAdapt;
    Rsvd = (PRSVD)(Packet->MiniportReserved);
    // pBakPacket 里是 HeaderBuffer + LookAheadBuffer 的内容。
    pBakPacket = (PNDIS_PACKET)(Rsvd->OriginalPkt);

    if(pAdapt->MiniportHandle)
    {
        if(pBakPacket == NULL)
            NdisMTransferDataComplete(pAdapt->MiniportHandle, Packet, Status, BytesTransferred);
        else
        {
            Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax);
            CopyPacket2Buffer(pBakPacket, pPacketContent, &OffsetSize);
            nPacketLen = OffsetSize ;
            CopyPacket2Buffer(Packet, pPacketContent+OffsetSize, &PacketLen);
            nPacketLen += PacketLen ;
            
            if(Monitor_flag)
            {
                if (flag && Encrypt_flag)
                    EncryptPackets(pPacketContent,nPacketLen) ;

                if(Check_Packet((char*)pPacketContent,FALSE))
                {
                    flag = 0;    // 不向上指示该包
                }                
            }
            else {}

            PacketLen += OffsetSize;
            // 释放包描述符pBakPacket、缓冲描述符pBakBuffer、内存pBakContent。
            NdisUnchainBufferAtFront(pBakPacket, &pBakBuffer);
            NdisQueryBufferSafe(pBakBuffer, &pBakContent, &BufferLen, 32);
            NdisFreeBuffer(pBakBuffer);
            NdisFreeMemory(pBakContent, BUFFER_SIZE, 0);
            NdisFreePacket(pBakPacket);

            memset(Packet->MiniportReserved, 0, sizeof(Packet->MiniportReserved));

            NdisUnchainBufferAtFront(Packet, &pPacketBuffer);
            NdisQueryBufferSafe(pPacketBuffer, &pBakContent, &BufferLen, 32);
            NdisFreeBuffer(pPacketBuffer);
            NdisFreeMemory(pBakContent, BUFFER_SIZE, 0);

            if(!flag)
            {
                // 释放资源并返回
                NdisFreePacket(Packet);
                return;
            }

            NdisAllocateBuffer(&Status, &pPacketBuffer, pAdapt->RecvBufferPoolHandle, pPacketContent, PacketLen);
            NdisChainBufferAtFront(Packet, pPacketBuffer);
            Packet->Private.Head->Next=NULL;
            Packet->Private.Tail=NULL;
            NDIS_SET_PACKET_HEADER_SIZE(Packet,14);
            
            // 向上层协议驱动指示数据包,防真网卡行为。
            NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &Packet, 1);

            if(NDIS_GET_PACKET_STATUS(Packet)!=NDIS_STATUS_PENDING)
            {
                MPReturnPacket((NDIS_HANDLE)pAdapt, Packet);
            }
        }
    }
    return;
}

各位大侠帮忙看看到底这些代码出现了什么问题
游客

返回顶部