duoniduoni_m
驱动牛犊
驱动牛犊
  • 注册日期2007-07-10
  • 最后登录2008-06-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1335回复:2

我是新手(才大三) 请教各位高人问题 我实在解决不了了 先谢谢啊

楼主#
更多 发布于:2007-08-07 15:43
这里是我的代码

void CopyPacket2Buffer(IN PNDIS_PACKET pPacket,IN OUT PUCHAR pBuff,IN OUT PUINT pLength)
{
    PNDIS_BUFFER BuffDT;
    PUCHAR BuffVA;
    UINT BuffLen;
    
    *pLength=0;
    BuffLen=0;
    
    NdisQueryPacket(pPacket,NULL,NULL,&BuffDT,NULL);
    
    while(BuffDT!=(PNDIS_BUFFER)NULL)
    {
        NdisQueryBuffer(BuffDT,&BuffVA,&BuffLen);
        NdisMoveMemory(pBuff + *pLength,BuffVA,BuffLen);
//        pBuff=pBuff+BuffLen;
        *pLength+=BuffLen;
        NdisGetNextBuffer(BuffDT,&BuffDT);
    }
    return;
}
这个函数是把packet中的数据拷贝到一个字符串中
UINT Copy_Packet(char * pPacket, UINT PacketLen)
{
    PEthHead ed;
    PIpHead id;
    int len;
//    DbgPrint(" @@@@XXXX0.8 In The Fucking Copy_Packet Function ! 0.8XXXXXX@@@\n");
    __try
    {
        __try
        {
            ed = (PEthHead)pPacket;
            id = (PIpHead)(pPacket + sizeof(EthHead));
            len = sizeof(TcpHead) + sizeof(IpHead) + 50;
            if(!gpEventObject)
            {
                DBGPRINT("@@^^^^^^^^@@   The Event Is NULL !!");
            }
            if(!SystemVirtualAddress)
            {
                DBGPRINT("$$^^^^^^^$$    The VirtualAddress Is NULL !!\n");
            }
        //    DbgPrint("@_@   @_@    @_@   Packet Len=%d\n",PacketLen);
            DbgPrint(" @@@@XXXX0.8  Packet Packet Len  =%d\n",PacketLen);
            // 检测是否为 TCP 数据包
            if(ed->SrvType == PROTOCOL_IP && gpEventObject != NULL && SystemVirtualAddress != NULL && PacketLen < 2000 && id->Protocol == IPPROTO_TCP)
            {
                if(!MyShareMemorylock)
                {
                    DbgPrint("XXXXX0.8  The Share_Memory_Lock Is Locked 0.8XXXXX");
                    return 1;
                }
                if(!KeReadStateEvent(gpEventObject))
                {
                    DbgPrint("XXXXX0.8  The Share_Memory_Lock Is UnLocked 0.8xxxxx");
                    // 复制数据到共享内存
                    MyShareMemorylock = 0;
                    NdisZeroMemory(SystemVirtualAddress,len + 1);
                    NdisMoveMemory(SystemVirtualAddress, pPacket,PacketLen);
    //                DbgPrint(" @@@@XXXX0.8 The Content Is %s",pPacket + sizeof(EthHead) + sizeof(IpHead) + sizeof(TcpHead));

                    KeSetEvent(gpEventObject, 0, FALSE);
    //                MyShareMemorylock = 1;
                }
                else{}
                return 1;
            }
        }
        except (EXCEPTION_EXECUTE_HANDLER){DbgPrint("复制发生异常!  --In Copy_Packet\n"); }
    }
    finally{}
    
    return 0;
}

这个函数是把上面复制到缓冲区中的数据拷贝到 和应用程序共享的内存中去
ShareMemoryLock 是一个整形数  意思就是如果有数据拷贝到共享内存中去 就把共享内存锁起来 不让操作内存了 直到应用程序访问完共享内存之后 再解锁 解锁是放在把事件设置成无信号的时候解锁

我在PtReceivePacket 函数中申请一块内存 2000 大小  然后调用CopyPacket2Buffer 把pakcet中的数据内容拷贝进去 紧接着调用copy-packet函数 拷贝数据到共享内存中去 然后就把内存锁了


    WaitForSingleObject(pThis->m_hEvent, INFINITE);
            // 在列表控件中显示

            CString len,fport,lport;
            int n = strlen((char *)pThis->psharememory);
            PIpHead id= (PIpHead)((char *)pThis->psharememory + sizeof(EthHead));
            PTcpHead ptcp = (PTcpHead)((PULONG)id + (id->HeaderLengthVersion & 0xF));
            fport.Format("%d",ntohs(ptcp->usSrcPort));
            lport.Format("%d",htons(ptcp->usDestPort));
            char * context = (char *)(ptcp + sizeof(TcpHead));
//            char str[100];
//            memset(str,0,100);
//            memcpy((PVOID)str,context,99);
            
            struct in_addr temp;
            temp.S_un.S_addr = id->sourceIPAddress;
            
            
            len.Format("%d",id->TotalLength);
            pThis->AddRow(inet_ntoa(temp), "Tcp",fport.GetBuffer(0),lport.GetBuffer(0), len.GetBuffer(0),context);

这是我应用程序读取共享内存数据的代码

现在的问题是 有的时候机器从起 偶然的 我改了好多天了 实在看不出来哪有毛病了 不过好象只取头部 没什么问题
希望各位高人在闲的时候帮我看看啊  我感激不尽啊 期待啊

最新喜欢:

luke_guoluke_g...
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-08-08 14:40
版主所言极是。。。(我是来凑热闹的,我的发言可以忽略。。。测试SYS中。。。)
人不靓仔心灵美,版头不正红花仔!
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-08-08 10:51
自己学习,用windbg分析蓝屏dump文件,做驱动,蓝屏重启,太平常了. 做驱动,必须掌握基本的调试技巧.先花时间学学调试
游客

返回顶部