阅读:3202回复:14
这段代码在2000下很好,但在2003下却不行,为什么?void CopyPacket2Buffer(IN PNDIS_PACKET pPacket,IN OUT PUCHAR pBuff,IN OUT PUINT pLength) { PNDIS_BUFFER BuffDT = NULL;// buffer指示符, PUCHAR BuffVA = NULL;//Buffer的虚拟地址 UINT BuffLen;//Buffer的长度 *pLength = 0;//数据包内容的总长度,开始先置零 BuffLen = 0;//Buffer的长度,开始先置零 NdisQueryPacket(pPacket,NULL,NULL,&BuffDT,NULL);//查询Packet的信息,这里查的是Packet的Buffer指示符的链表第一个的 while(BuffDT != (PNDIS_BUFFER)NULL)//如果Buffer指示符不为NULL,则读取其中的内容 { NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,HighPagePriority );//得到BuffDT指向的那个Buffer的虚拟地BuffVA,和长度BuffLen NdisMoveMemory(pBuff,BuffVA,BuffLen);//将BuffVA其中的内容,移动到pBuff指向的那块区域 pBuff = pBuff + BuffLen;//pBuff指针后移,前BuffLen个字节已经填入数据 *pLength += BuffLen;//记录pBuff中填入数据的总长度 NdisGetNextBuffer(BuffDT,&BuffDT);//获得Buffer指示符链表中的下一个Buffer指示符 } return; } Status= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableMax); if (Status != NDIS_STATUS_SUCCESS ) { DbgPrint("Can not NdisAllocateMemory Memory!!"); } else { NdisZeroMemory (pPacketContent, 2000); CopyPacket2Buffer(Packet,pPacketContent,&PacketSize); NdisFreeMemory(pPacketContent,2000,0); } 以上代码在2000下没有问题,但是在2003下有时可以有时不行,在2003下,若访问网上邻居就会兰屏,why?谢谢! |
|
沙发#
发布于:2005-02-03 09:50
以上代码在2000环境上编译的,在2000上跑得很好,而在2003就没有那么好了。其实这段代码很简单就是访问一个Packet(MPSend函数里得那个Packet)而已,可就是不行,各位xdjm,帮出注意一下啊,谢谢。
|
|
板凳#
发布于:2005-02-06 15:04
经过进一步排查,发现:
NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,HighPagePriority ); NdisMoveMemory(pBuff,BuffVA,BuffLen); 问题出在NdisQueryBufferSafe返回的 BuffLen大小有时候会很大,这样执行下面的内存拷贝可能要出错,可是NdisQueryBufferSafe 为什么会出错呢?在2000环境上好好的啊,把驱动搬到2003就有时候要出错,我没有2003的开发环境,只好在2000下开发,2003上用。 帮忙出出注意,谢谢! |
|
地板#
发布于:2005-02-06 19:58
经过进一步排查,发现: 有多大? 是不是你在2000和2003使用了不同网卡?或者网卡驱动有不一样? |
|
|
地下室#
发布于:2005-02-10 13:44
谢谢你的回答。我是在2000下修改、编译passthru的,然后在2003、2003上都要跑,网卡和驱动不一样。在MPSend 访问 Packet就出错,长度返回值0x8000,应该说是异常.就是不知道 why?
|
|
5楼#
发布于:2005-02-10 17:43
谢谢你的回答。我是在2000下修改、编译passthru的,然后在2003、2003上都要跑,网卡和驱动不一样。在MPSend 访问 Packet就出错,长度返回值0x8000,应该说是异常.就是不知道 why? while(BuffDT != (PNDIS_BUFFER)NULL)//如果Buffer指示符不为NULL,则读取其中的内容 { NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,HighPagePriority );//得到BuffDT指向的那个Buffer的虚拟地BuffVA,和长度BuffLen NdisMoveMemory(pBuff,BuffVA,BuffLen);//将BuffVA其中的内容,移动到pBuff指向的那块区域 pBuff = pBuff + BuffLen;//pBuff指针后移,前BuffLen个字节已经填入数据 *pLength += BuffLen;//记录pBuff中填入数据的总长度 NdisGetNextBuffer(BuffDT,&BuffDT);//获得Buffer指示符链表中的下一个Buffer指示符 } 修改为 while(BuffDT != (PNDIS_BUFFER)NULL)//如果Buffer指示符不为NULL,则读取其中的内容 { NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,HighPagePriority );//得到BuffDT指向的那个Buffer的虚拟地BuffVA,和长度BuffLen if(NULL == BuffVA) break ; if(BuffLen>0) { NdisMoveMemory(pBuff,BuffVA,BuffLen);//将BuffVA其中的内容,移动到pBuff指向的那块区域 pBuff = pBuff + BuffLen;//pBuff指针后移,前BuffLen个字节已经填入数据 *pLength += BuffLen;//记录pBuff中填入数据的总长度 } NdisGetNextBuffer(BuffDT,&BuffDT);//获得Buffer指示符链表中的下一个Buffer指示符 } |
|
|
6楼#
发布于:2005-02-11 17:21
可是出错的时候BuffLen都很大,一定是>0,不需判断啊,而且
另外一个版本里我也判断过NULL != BuffVA,就是无法避免出错,特怪! |
|
7楼#
发布于:2005-02-11 22:38
可是出错的时候BuffLen都很大,一定是>0,不需判断啊,而且 其实最好的办法是你自己在2003下调试一下,以我的经验,这样的问题应该很好定位。 |
|
|
8楼#
发布于:2005-02-13 11:45
很可惜,我没有2003DDK啊,只有2000K,不过Softice跟踪
出来的结果就是NdisQueryBufferSafe返回的长度有问题,也是已经知道了,难道非得要在百忙之中2003下重新编译驱动不可? |
|
9楼#
发布于:2005-02-13 13:05
难道非得要在百忙之中2003下重新编译驱动不可? ?????????????????????????????????????????????????? |
|
|
10楼#
发布于:2005-02-18 10:04
老兄,不好意思,写错了,我是在别人的机器上用不习惯的输入法导致了。若在2000下搞不定的话,那我真是没办法了。
|
|
11楼#
发布于:2005-02-18 12:05
很可惜,我没有2003DDK啊,只有2000K,不过Softice跟踪 要用2003ddk重新编译才行啊. |
|
|
12楼#
发布于:2005-02-18 12:59
老兄能否说说其中的到底怎么回事?或是你也曾碰到过一样的问题?谢谢!
|
|
13楼#
发布于:2005-02-21 10:29
今天借用了别人的2003DDK重新编译了一下,发现MPSend或MPSendPackets函数里NdisQueryPacket查询得到的结果就是异常的,很大,远大于1514,这样后续的工作就无法进行了,请各位帮帮忙啊
|
|
14楼#
发布于:2005-02-22 15:01
搞定,分已给,是offload的原因,谢谢各位!
[编辑 - 2/23/05 by frog_huang] |
|