阅读:2197回复:6
请教hugy
有关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! |
|
最新喜欢:flyfox
|
沙发#
发布于:2001-12-17 20:28
有关IoFreeMdl()得问: 我怎么知道?而且还是执行到这个函数之前就会出现 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); |
|
|
板凳#
发布于:2001-12-17 20:34
看看是否你这个MDL指向的是不是分页内存吧!因为当运行的IRQL是DISPATCH_LEVEL级的时候不不能访问分页内存的
|
|
地板#
发布于:2001-12-18 13:03
这种原因很多,很多情况都有可能,如果把代码看一看可能就回
清楚了! :D :D :D :D :D :D :D :D :D :D :D |
|
|
地下室#
发布于:2001-12-18 13:58
我得大概过程如下:
NdisAllocatePacket()分配一个Packet; NdisAllocateMemory()分配了一个跟packet大小一样得memory; 然后用IoAllocateMdl()分配了一个mdl,用MmBuildMdl()之后,来NdisChainBufferAtFront(); 这样的话,释放得时候不是要用到IoFreeMdl吗?还是我得做法本身就有问题? |
|
|
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,就可以了 |
|
|
6楼#
发布于:2001-12-18 22:48
NdisChainBufferAtFront(back)中的back指的是什么? 其中的PNDIS_BUFFER Buffer参数用什么代替? |
|
|