zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:5555回复:26

RtlVolumeDeviceToDosName 的问题

楼主#
更多 发布于:2004-11-23 17:52
为什么我在2000下调用 RtlVolumeDeviceToDosName 在加载的时候就兰屏,ntoskrnl.exe崩溃。
如果我不用这个函数,我能不能认为\device\harddiskvolume1 就是C:,如果盘符被改了会不会出现问题?

最新喜欢:

cyliucyliu
---内核开发合作或提供基础技术服务QQ:22863668 ---
toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-24 02:23
How did you call RtlVolumeToDosName? Hopefully you passed in an incorrect parameter.

You can't regard device\harddiskvolume1 as "c:" because the dos name can be changed by disk manager. "c:" may never exist in one system.
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-11-26 10:46
我是这样调用的
 RtlVolumeDeviceToDosName(pFileObject->DeviceObject,&DosName);
  
可以问题是我调试的时候这个驱动还没加载就崩溃了,是再内核加载驱动之前就崩溃了。ntoskrnl.exe崩溃。
没有这个函数就没问题,这是为什么?
---内核开发合作或提供基础技术服务QQ:22863668 ---
toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-26 14:22
你是怎么初始化DosName的?
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-11-26 14:39
我试过好几种情况一种是没初始化
一种是用RtlInitUnicodeString 初始化一个长串
一种是直接EXALLOCPOOL 分配
都不行。
---内核开发合作或提供基础技术服务QQ:22863668 ---
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2004-11-26 14:48
RtlVolumeDeviceToDosName allocates the Unicode string buffer for the MS-DOS path from the memory pool. After the buffer is no longer required, a caller of this routine should use ExFreePool to free it.

Drivers that must work on older NT-based operating systems may use this routine. Drivers written for Windows XP and later must use IoVolumeDeviceToDosName instead.

花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-11-26 17:47
没错!

会不会是DDK也得是2000的
---内核开发合作或提供基础技术服务QQ:22863668 ---
ildee
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-08 15:21
传进去的第一个参数应该是pfile_object
Coder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望34点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-08 16:02
我也刚遇到了这个问题,
RtlVolumeDeviceToDosName (irpSp->FileObject->DeviceObject, dosname )
我的过滤驱动是boot启动的,还没有启动完毕就蓝屏了,也不知道怎么回事。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-28 19:39
楼上的,我遇到的问题和你一样,也是在boot过程中蓝屏的,我实在SfCreate中调用的这个函数。
Ideas for life!
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-02 18:21
我现在也遇到这个问题了,怎么解决的你们??
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-06-02 19:15
很久了你是在Win2k下还是在WinXP下调用?实在什么地方地方的?最好把WinDbg分析的结果发上来
Ideas for life!
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-06-03 09:37
在XP 2K下都不行。
和你们说的症状一样。就是如果系统已经加载了,就没有问题。

你们是怎么解决的??
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-06-03 09:48
我在内核版提出相同的问题,还没专家参与!在此一起贴出来!

与RtlVolumeDeviceToDosName 功能相同的,在xp里对应的例程
IoVolumeDeviceToDosName的使用问题?

我想在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
lgh41
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-06-03 10:14
如果你去掉释放ExFreePool(&dosname2),什么效果??

我晕死了
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-06-03 10:47
zhjie374:
我正按照我在内核发的贴子,那位朋友出招:
PUNICODE_STRING Pdosname2;去做;有好结果时我告诉您!
lgh41
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2005-06-03 13:24
楼上的,我遇到的问题和你一样,也是在boot过程中蓝屏的,我实在SfCreate中调用的这个函数。


RtlVolumeDeviceToDosName也是发个irp下去问的volume的symbolic link,然后一个个比较的

[编辑 -  6/5/05 by  arthurtu]
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-06-03 14:22
确实,我在WRITE中同样的方法是可以得到的。

那老大你说READ中怎么得到?
有什么取巧的方法?
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-06-04 15:50
arthurtu 老师:
   …………………………………………………………
boot加载的驱动,这时候还没有文件系统,who给你dosname?RtlVolumeDeviceToDosName也是发个irp下去问的volume的symbolic link,然后一个个比较的
………………………………………………………………
我查了我使用的sfilter.inf的[Sfilter.Service]
StartType        = 0 ;SERVICE_BOOT_START 即是boot加载,您认为改成什么方式加载与取文件的盘符相容呢?
谢谢您的大力帮助?

lgh41
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-06-04 16:38
RtlVolumeDeviceToDosName()这个函数我在XP下调用同样也遇到问题,但不是篮屏,而是假死。

这个函数的实现是先通过下发IRP来查询你给定DeviceObject的名字,这时会得到Device\\HarddiskVolume1这样的名字,然后这个函数开始26个盘符进行循环,通过调用ZwOpenSymbolicLinkObject这个函数,看那个盘符对应的连接名字是Device\\HarddiskVolume1。接着好像处理一些关于装配点的东西,我没太搞明白。

我们在FileMon或sfilter很容易得到Device\\HarddiskVolume1这样的名字,因此没有必要在去下发IRP来查询了。

最后我自己重新实现了一下RtlVolumeDeviceToDosName函数。终于搞定了。
上一页
游客

返回顶部