阅读:1334回复:2
我是新手(才大三) 请教各位高人问题 我实在解决不了了 先谢谢啊
这里是我的代码
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); 这是我应用程序读取共享内存数据的代码 现在的问题是 有的时候机器从起 偶然的 我改了好多天了 实在看不出来哪有毛病了 ![]() 希望各位高人在闲的时候帮我看看啊 我感激不尽啊 期待啊 ![]() |
|
最新喜欢:![]() |
沙发#
发布于:2007-08-08 10:51
自己学习,用windbg分析蓝屏dump文件,做驱动,蓝屏重启,太平常了. 做驱动,必须掌握基本的调试技巧.先花时间学学调试
|
|
板凳#
发布于:2007-08-08 14:40
版主所言极是。。。(我是来凑热闹的,我的发言可以忽略。。。测试SYS中。。。)
|
|
|