renpb
驱动牛犊
驱动牛犊
  • 注册日期2001-09-29
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2197回复:6

请教hugy

楼主#
更多 发布于:2001-12-17 19:24
有关IoFreeMdl()得问:

我在用packet里面自己分配内存,复制packet,然后用iofreemdl()释放,开始会很正常,但是,过一会,就会在执行这个函数之前出现一下得错误提示:
    Break due to KeBugCheckEx(Unhandle Kernel mode exception)
    Error=C2(BAD_POOL_CALLER) P1=7 P2=B68 P3=86C45F80 P4=86C45F88

为什么?错误会出现在什么地方呢?expect your answer! thx!

最新喜欢:

flyfoxflyfox
烦恼总围绕在身边 只因 我们都已长大……
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2001-12-17 20:28
有关IoFreeMdl()得问:

我在用packet里面自己分配内存,复制packet,然后用iofreemdl()释放,开始会很正常,但是,过一会,就会在执行这个函数之前出现一下得错误提示:
    Break due to KeBugCheckEx(Unhandle Kernel mode exception)
    Error=C2(BAD_POOL_CALLER) P1=7 P2=B68 P3=86C45F80 P4=86C45F88

为什么?错误会出现在什么地方呢?expect your answer! thx!
 


我怎么知道?而且还是执行到这个函数之前就会出现
kebugcheckex,这点信息不足以让我知道为什么出错,
没有dump 文件,我能说什么?就算有很多信息,说老
实话,我也不愿意去仔细debug。

你一定是什么地方内存出了问题了。

此外,我不知道你为什么要用iofreemdl这个函数?
除非你自认为对ndispacket,ndisbuffer这两个结构
非常清楚,我建议你不要这么夸张,为什么不用
ndis提供的包裹函数?我以前曾经在这上面吃过苦头,
我没有理睬ddk里面说的不要直接访问ndispacket.private
我错误理解了Packet->Private.Tail,结果不知道为什么,
就和ipsec.sys不兼容了。
释放一个packet很简单,下面是我的代码:
NdisUnchainBufferAtFront( Packet,&MyBuffer );
NdisQueryBufferSafe(MyBuffer,&pPacketContent,&bufLength, 32 );
NdisFreeBuffer(MyBuffer); // 释放buffer本身
NdisFreeMemory(pPacketContent,2000,0); // 释放buffer所指向的内存
NdisDprFreePacket(Packet);

不再回忆从前,我已经生活在幸福当中。
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-17 20:34
看看是否你这个MDL指向的是不是分页内存吧!因为当运行的IRQL是DISPATCH_LEVEL级的时候不不能访问分页内存的
m_lam12
驱动牛犊
驱动牛犊
  • 注册日期2001-07-19
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-12-18 13:03
这种原因很多,很多情况都有可能,如果把代码看一看可能就回
清楚了!
 :D :D :D :D :D :D :D :D :D :D :D
李安明
renpb
驱动牛犊
驱动牛犊
  • 注册日期2001-09-29
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-12-18 13:58
我得大概过程如下:
NdisAllocatePacket()分配一个Packet;
NdisAllocateMemory()分配了一个跟packet大小一样得memory;
然后用IoAllocateMdl()分配了一个mdl,用MmBuildMdl()之后,来NdisChainBufferAtFront();

这样的话,释放得时候不是要用到IoFreeMdl吗?还是我得做法本身就有问题?


烦恼总围绕在身边 只因 我们都已长大……
m_lam12
驱动牛犊
驱动牛犊
  • 注册日期2001-07-19
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-12-18 15:01
__________________
我得大概过程如下:
NdisAllocatePacket()分配一个Packet;
NdisAllocateMemory()分配了一个跟packet大小一样得memory;
然后用IoAllocateMdl()分配了一个mdl,用MmBuildMdl()之后,来NdisChainBufferAtFront();

这样的话,__________________________________
NdisAllocatePacket()分配一个Packet;
NdisAllocate()分配了一个跟packet大小一样得memory;
我觉得不需要再用IoAllocateMdl()分配了一个mdl,用MmBuildMdl()之后,在来NdisChainBufferAtFront,
而直接NdisChainBufferAtFront(back),就可以了,
字于
――――――――――――――――――――
释放得时候不是要用到IoFreeMdl吗?还是我得做法本身就有问题?
――――――――――――――――――
我觉得NdisUnChainBufferAtFront(back)
ndisfreeMemory,buffer,packet,就可以了

李安明
renpb
驱动牛犊
驱动牛犊
  • 注册日期2001-09-29
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-12-18 22:48

NdisChainBufferAtFront(back)中的back指的是什么?
其中的PNDIS_BUFFER  Buffer参数用什么代替?
    
烦恼总围绕在身边 只因 我们都已长大……
游客

返回顶部