frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3202回复:14

这段代码在2000下很好,但在2003下却不行,为什么?

楼主#
更多 发布于:2005-02-02 13:23

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?谢谢!
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-03 09:50
以上代码在2000环境上编译的,在2000上跑得很好,而在2003就没有那么好了。其实这段代码很简单就是访问一个Packet(MPSend函数里得那个Packet)而已,可就是不行,各位xdjm,帮出注意一下啊,谢谢。
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-06 15:04
经过进一步排查,发现:
NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,HighPagePriority );
NdisMoveMemory(pBuff,BuffVA,BuffLen);
问题出在NdisQueryBufferSafe返回的
BuffLen大小有时候会很大,这样执行下面的内存拷贝可能要出错,可是NdisQueryBufferSafe 为什么会出错呢?在2000环境上好好的啊,把驱动搬到2003就有时候要出错,我没有2003的开发环境,只好在2000下开发,2003上用。
帮忙出出注意,谢谢!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-06 19:58
经过进一步排查,发现:
NdisQueryBufferSafe(BuffDT,&BuffVA,&BuffLen,HighPagePriority );
NdisMoveMemory(pBuff,BuffVA,BuffLen);
问题出在NdisQueryBufferSafe返回的
BuffLen大小有时候会很大,这样执行下面的内存拷贝可能要出错,可是NdisQueryBufferSafe 为什么会出错呢?在2000环境上好好的啊,把驱动搬到2003就有时候要出错,我没有2003的开发环境,只好在2000下开发,2003上用。
帮忙出出注意,谢谢!

有多大?
是不是你在2000和2003使用了不同网卡?或者网卡驱动有不一样?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-10 13:44
谢谢你的回答。我是在2000下修改、编译passthru的,然后在2003、2003上都要跑,网卡和驱动不一样。在MPSend  访问 Packet就出错,长度返回值0x8000,应该说是异常.就是不知道 why?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
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指示符
}
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-02-11 17:21
可是出错的时候BuffLen都很大,一定是>0,不需判断啊,而且
另外一个版本里我也判断过NULL != BuffVA,就是无法避免出错,特怪!

AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-02-11 22:38
可是出错的时候BuffLen都很大,一定是>0,不需判断啊,而且
另外一个版本里我也判断过NULL != BuffVA,就是无法避免出错,特怪!

 

其实最好的办法是你自己在2003下调试一下,以我的经验,这样的问题应该很好定位。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-02-13 11:45
很可惜,我没有2003DDK啊,只有2000K,不过Softice跟踪
出来的结果就是NdisQueryBufferSafe返回的长度有问题,也是已经知道了,难道非得要在百忙之中2003下重新编译驱动不可?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-02-13 13:05
难道非得要在百忙之中2003下重新编译驱动不可?
 

??????????????????????????????????????????????????
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-02-18 10:04
老兄,不好意思,写错了,我是在别人的机器上用不习惯的输入法导致了。若在2000下搞不定的话,那我真是没办法了。
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2023-10-29
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2005-02-18 12:05
很可惜,我没有2003DDK啊,只有2000K,不过Softice跟踪
出来的结果就是NdisQueryBufferSafe返回的长度有问题,也是已经知道了,难道非得要在百忙之中2003下重新编译驱动不可?
 


要用2003ddk重新编译才行啊.
好好学习,天天向上! root60931@gmail.com
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-02-18 12:59
老兄能否说说其中的到底怎么回事?或是你也曾碰到过一样的问题?谢谢!
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-02-21 10:29
今天借用了别人的2003DDK重新编译了一下,发现MPSend或MPSendPackets函数里NdisQueryPacket查询得到的结果就是异常的,很大,远大于1514,这样后续的工作就无法进行了,请各位帮帮忙啊
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-02-22 15:01
搞定,分已给,是offload的原因,谢谢各位!

[编辑 -  2/23/05 by  frog_huang]
游客

返回顶部