lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:2488回复:10

请教内存池的释放及无文字显示蓝屏等问题

楼主#
更多 发布于:2005-06-02 18:33
向专家请教:
我想在sfilter的sfcreate例程里加一个显示盘符的程序:
UNICODE_STRING  dosname2,name2; //[定义结构UNICODE_STRING
IoVolumeDeviceToDosName(file->DeviceObject,&dosname2);(我的系统:xp)
…………………………
我查MSDN:说:IoVolumeDeviceToDosName需要ExFreePool释放内存池。  
1我用ExFreePool(dosname2.Buffer)释放内存池;造成目标机器蓝色,但不显示STOP:……………………信息,在主机的windbg的file下,无法打开转储文件;
请教这时应该如何获得信息?

2 我用ExFreePool(&dosname2); 释放内存池;
这次捉到错误。目标机器显示windowsxp等图标,停止不动!  
主机的windbg显示如下c2错误;我还输入!analyze

最新喜欢:

LeopardLeopar...
lgh41
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-03 09:38
拜托,你看清楚,NTSTATUS
  IoVolumeDeviceToDosName(
    IN  PVOID  VolumeDeviceObject,
    OUT PUNICODE_STRING  DosName
    );
最后一个参数是PUNICODE_STRING,而你传入的是已经定义的一个变量取地址,虽然也是PUNICODE_STRING,但是你那个变量是你在堆栈上定义的,是局部变量,系统退出你这个函数时会自动清除这个变量的,你应该这样定义
PUNICODE_STRING pString;
IoVolumeDeviceToDosName(file->DeviceObject,pString);
ExFreePool(pString->Buffer);
 
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-03 11:36
PUNICODE_STRING pString;
不用初始化???
还是要分配内存?
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-03 11:59
朋友,我实验了,结果是:
改为PUNICODE_STRING Pdosname2;局部变量;编译显示:

sfilter.c(1953) : error C4700: local variable \'Pdosname2\' used without having be
en initialized
将他改为全局变量,编译通过!
安装;主机、目标机器连接;目标机器停止,显示windowsxp图标处。
Windbg  显示:
Access violation - code c0000005 (!!! second chance !!!)
nt!IoVolumeDeviceToDosName+0x1c9:
80521126 668908           mov     [eax],cx
您看,还如何解决呢?
lgh41
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-06-03 12:41
传个UNICODE_STRING变量进去,这样是对的
检查一下是不是有什么其他错误,如IoVolumeDeviceToDosName失败返回
再个,dosname2不要使用全局的,用局部变量
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-06-03 13:55
传个UNICODE_STRING变量进去,这样是对的
检查一下是不是有什么其他错误,如IoVolumeDeviceToDosName失败返回
再个,dosname2不要使用全局的,用局部变量

同意。如果IoVolumeDeviceToDosName成功返回,调用ExFreePool应该没有问题。

<<在主机的windbg的file下,无法打开转储文件;
把目标机dmp文件拷贝到主机上,主机都不需要连接目标机,就可以用windbg带开dump文件,我一直这么用,肯定没有问题。


lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-03 14:55
[quote]传个UNICODE_STRING变量进去,这样是对的
检查一下是不是有什么其他错误,如IoVolumeDeviceToDosName失败返回
再个,dosname2不要使用全局的,用局部变量

同意。如果IoVolumeDeviceToDosName成功返回,调用ExFreePool应该没有问题。

<<在主机的windbg的file下,无法打开转储文件;
把目标机dmp文件拷贝到主机上,主机都不需要连接目标机,就可以用windbg带开dump文件,我一直这么用,肯定没有问题。


 [/quote]
目标机器死在启动的windowsxp图标显示处,如何把目标机器的转储文件拷贝到主机?主机连不上目标机器呀?
我没用过转储文件,我在目标机器的系统里设置完全转储,转储文件自动设置为%systemroot%\\memory.dmp;您是说将目标机器系统下的.dmp文件拷贝到主机上?在死机开始时能自动传到主机?如何用?
请指点!谢谢!
lgh41
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-06-03 15:24
[quote][quote]传个UNICODE_STRING变量进去,这样是对的
检查一下是不是有什么其他错误,如IoVolumeDeviceToDosName失败返回
再个,dosname2不要使用全局的,用局部变量

同意。如果IoVolumeDeviceToDosName成功返回,调用ExFreePool应该没有问题。

<<在主机的windbg的file下,无法打开转储文件;
把目标机dmp文件拷贝到主机上,主机都不需要连接目标机,就可以用windbg带开dump文件,我一直这么用,肯定没有问题。


 [/quote]
目标机器死在启动的windowsxp图标显示处,如何把目标机器的转储文件拷贝到主机?主机连不上目标机器呀?
我没用过转储文件,我在目标机器的系统里设置完全转储,转储文件自动设置为%systemroot%\\memory.dmp;您是说将目标机器系统下的.dmp文件拷贝到主机上?在死机开始时能自动传到主机?如何用?
请指点!谢谢! [/quote]
你手工把目标机器系统下的.dmp文件拷贝到主机上,在主机上启动windbg打开dmp文件,都不需要连接目标机器
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-03 18:15
引用:你手工把目标机器系统下的.dmp文件拷贝到主机上,在主机上启动windbg打开dmp文件,都不需要连接目标机器

您的意思我没理解?目标机器死机了,在主机,通过IP地址访问目标机器,访问不了啊!?如何手工拷贝?
我在目标机器设置完全内存转储,自动形成的%systemroot%\\memory.dmp,应该是操作系统windows下的一个文件,我怎么找不到它呢?请指点!谢谢!
lgh41
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2005-06-03 19:29
引用:你手工把目标机器系统下的.dmp文件拷贝到主机上,在主机上启动windbg打开dmp文件,都不需要连接目标机器

您的意思我没理解?目标机器死机了,在主机,通过IP地址访问目标机器,访问不了啊!?如何手工拷贝?
我在目标机器设置完全内存转储,自动形成的%systemroot%\\memory.dmp,应该是操作系统windows下的一个文件,我怎么找不到它呢?请指点!谢谢!

假设你根本没有用双机调试,就是一台机器。蓝屏后转储文件,使它
能正常启动(去掉有问题的驱动),用windbg在本机打开dmp文件,就可以分析。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-04 08:45
引用:你手工把目标机器系统下的.dmp文件拷贝到主机上,在主机上启动windbg打开dmp文件,都不需要连接目标机器

您的意思我没理解?目标机器死机了,在主机,通过IP地址访问目标机器,访问不了啊!?如何手工拷贝?
我在目标机器设置完全内存转储,自动形成的%systemroot%\\memory.dmp,应该是操作系统windows下的一个文件,我怎么找不到它呢?请指点!谢谢!

转储首先产生在PageFile中,在第二次重启的时候才被拷入你设置的memory.dmp中
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部