victorliuhao
驱动牛犊
驱动牛犊
  • 注册日期2006-09-25
  • 最后登录2009-05-15
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望76点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
阅读:1776回复:12

关于缓冲池分配和回收的问题

楼主#
更多 发布于:2007-03-15 15:26
  我使用ExAllocatePool来分配内存,但是在调用ExFreePool的时候却出现了问题,不知是何原因。有人知道是怎么回事吗,望指点一下。谢谢!
我最老实
驱动小牛
驱动小牛
  • 注册日期2005-09-11
  • 最后登录2010-01-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望253点
  • 贡献值0点
  • 好评度189点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-15 15:30
引用第0楼victorliuhao2007-03-15 15:26发表的“关于缓冲池分配和回收的问题”:
  我使用ExAllocatePool来分配内存,但是在调用ExFreePool的时候却出现了问题,不知是何原因。有人知道是怎么回事吗,望指点一下。谢谢!


代码帖上来!才能把脉!
养牛专业户
victorliuhao
驱动牛犊
驱动牛犊
  • 注册日期2006-09-25
  • 最后登录2009-05-15
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望76点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-15 15:47
TempSourceName = (unsigned char *)ExAllocatePool(NonPagedPool,266);
strcpy(TempSourceName,"\\??\\");
strcat(TempSourceName,PathName);
...
...
ExFreePool(TempSourceName);
softice调试是显示error=c2(BAD_POOL_CALLER)
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
地板#
发布于:2007-03-15 16:01
TempSourceName = (unsigned char *)ExAllocatePool(NonPagedPool,266*sizeof(unsigned char ));
???
victorliuhao
驱动牛犊
驱动牛犊
  • 注册日期2006-09-25
  • 最后登录2009-05-15
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望76点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-03-15 16:02
为什么要这样做呢
victorliuhao
驱动牛犊
驱动牛犊
  • 注册日期2006-09-25
  • 最后登录2009-05-15
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望76点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-03-15 16:03
unsigned char 不就是一个字节吗
我最老实
驱动小牛
驱动小牛
  • 注册日期2005-09-11
  • 最后登录2010-01-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望253点
  • 贡献值0点
  • 好评度189点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-15 16:38
引用第2楼victorliuhao2007-03-15 15:47发表的“”:
TempSourceName = (unsigned char *)ExAllocatePool(NonPagedPool,266);
strcpy(TempSourceName,"\??\");
strcat(TempSourceName,PathName);
...
...
.......



TempSourceName = (unsigned char *)ExAllocatePool(NonPagedPool,266);
if(!TempSourceName)
{
      //kill urself
}
strcpy(TempSourceName,"\??\");
strcat(TempSourceName,PathName);

if(TempSourceName)
{
     ExFreePool(TempSourceName);
}
养牛专业户
victorliuhao
驱动牛犊
驱动牛犊
  • 注册日期2006-09-25
  • 最后登录2009-05-15
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望76点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-03-15 16:42
这个也加进去了
还是没用
我最老实
驱动小牛
驱动小牛
  • 注册日期2005-09-11
  • 最后登录2010-01-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望253点
  • 贡献值0点
  • 好评度189点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-03-15 17:04
引用第7楼victorliuhao2007-03-15 16:42发表的“”:
这个也加进去了
还是没用

     
养牛专业户
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
9楼#
发布于:2007-03-15 17:11
RtlCopyMemory(CompressData, MyBuffer, CompressDataLen);
试试用这个拷贝?
zh002008
驱动牛犊
驱动牛犊
  • 注册日期2004-08-22
  • 最后登录2013-09-06
  • 粉丝1
  • 关注1
  • 积分545分
  • 威望155点
  • 贡献值0点
  • 好评度51点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-03-15 22:11
TempSourceName = (unsigned char *)ExAllocatePool(NonPagedPool,266);
memset(TempSourceName,0,266);
if(!TempSourceName)
{
    //kill urself
}
strcpy(TempSourceName,"\??\");
strcat(TempSourceName,PathName);

if(TempSourceName)
{
  ExFreePool(TempSourceName);  
}
保证能分配到空间,空间内没有脏数据。
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
11楼#
发布于:2007-03-15 22:29
我已经试过,用zh002008所说的方法确实可以。关键在于加上了memset(...)这条指令,如果不加就会出现BAD_POOL_CALLER,但是我有一点还是不明白,将这片内存清0和不清有什么区别,OS究竟在这个过程中做了些什么?
作一名真实,诚实,优秀的科技工作者!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-03-16 06:20
你内存操作写错了地方,比如分配了266bytes,但写了267个。用softice永远你也不知道真正的原因

另外,把所有的string操作都换成RtlStringCchxxx/RtlStringCbxxx,这样即使你不知道错误的原因,但最起码可以保证不会有BSOD。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
游客

返回顶部