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

RtlVolumeDeviceToDosName 的问题

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

最新喜欢:

cyliucyliu
---内核开发合作或提供基础技术服务QQ:22863668 ---
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-18 10:58
【[quote]我也刚遇到了这个问题,
RtlVolumeDeviceToDosName (irpSp->FileObject->DeviceObject, dosname )
我的过滤驱动是boot启动的,还没有启动完毕就蓝屏了,也不知道怎么回事。

楼上的,我遇到的问题和你一样,也是在boot过程中蓝屏的,我实在SfCreate中调用的这个函数。

我现在也遇到这个问题了,怎么解决的你们??



本人部分测试、理解如下:

设置为BOOT,在MJ_CREATE中,当SfDebug =0xffffffff时,即想打印所有消息时,就会兰屏;而当SfDebug = SFDEBUG_DISPLAY_ATTACHMENT_NAMES|SFDEBUG_DISPLAY_CREATE_NAMES;(或者其他一些标志组合,未经过完全测试),就会停顿在这里,但不会兰屏或者重启。


在MJ_READ中,确实很难很难。连MS FILE SYSTEM GROUP的人都建议在应用层通过GetVolumeNameForVolumeMountPoint() and GetVolumePathNamesForVolumeName()来做了。


There is not support in the kernel for getting DOS drive letters.

The reason for this is that dos drive letters are a \"user mode\" concept
and can actually be different from one user to the next on the same
machine (especially with terminal server).

If you want to report a drive letter to a user, I recommend you send the
NT Device name (or GUID device name) to a user mode component that runs
in the session of the user you want.  You can then use
GetVolumeNameForVolumeMountPoint() and GetVolumePathNamesForVolumeName()
to get the DOS drive letter.

If you want it just for debug purposes, get used to the NT device names.

Neal Christiansen
Microsoft File System Filter Group
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-17 09:56
26个盘符进行循环


很有道理。

dev2dos.c,哪里找的到啊,GOOGLE都没结果。
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-07 18:02
请专家近来帮助分析我用windbg命令的输出的部分显示:
Use !analyze -v to get detailed debugging information.
BugCheck C2, {7, cd4, 81bca330, f888e2ac}
Probably caused by : Sfilter.sys ( Sfilter!SfCreate+11e )  
这里的SfCreate+11e是加16进制的语句吗?

BAD_POOL_CALLER (c2)
The current thread is making a bad pool request. Typically this is at a bad IRQL level or double freeing the same allocation, etc.
在Sfilter.c里应该如何设置IRQL level?这里的或者double freeing the same allocation, etc.是否是我们使用的ExFreePool与函数RtlVolumeDeviceToDosName或IoVolumeDeviceToDosName里的释放内存池2次了?

Arguments:
Arg1: 00000007, Attempt to free pool which was already freed而我们不使用ExFreePool,照样,是假死机!请指教?
Arg2: 00000cd4, (reserved)
Arg3: 81bca330, Memory contents of the pool block
Arg4: f888e2ac, Address of the block of pool being deallocated

lgh41
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-06 10:38
duanran:谢谢您的回复!
   但我没理解您的“ 代码你可以参考一下windwos源代码。

private\\nots\\rtl\\dev2dos.c”?

您如何得到Device\\HarddiskVolume1这样的名字?
lgh41
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-05 20:45
lgh41:

代码你可以参考一下windwos源代码。

private\\nots\\rtl\\dev2dos.c
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-04 23:39
duanran:我在xp里,先是假死!如果我在主机的windbg再按f5,将使目标机器在引导,第二次把目标机器搞成蓝屏!
能把您的代码发给我吗?,向您学习学习!
lgh@mobileelife.com
lgh41
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-04 16:45
arthurtu 老师:
…………………………………………………………
boot加载的驱动,这时候还没有文件系统,who给你dosname?RtlVolumeDeviceToDosName也是发个irp下去问的volume的symbolic link,然后一个个比较的
………………………………………………………………
我也认为BOOT加载的驱动,这个时候还没有文件系统。
但确实有些类似sfilter的驱动,StartType = 0。对此不太理解。

是不是和PNP枚举设备的顺序有关?

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

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

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

最后我自己重新实现了一下RtlVolumeDeviceToDosName函数。终于搞定了。
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于: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
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-03 14:22
确实,我在WRITE中同样的方法是可以得到的。

那老大你说READ中怎么得到?
有什么取巧的方法?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2005-06-03 13:24
楼上的,我遇到的问题和你一样,也是在boot过程中蓝屏的,我实在SfCreate中调用的这个函数。


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

[编辑 -  6/5/05 by  arthurtu]
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-06-03 10:47
zhjie374:
我正按照我在内核发的贴子,那位朋友出招:
PUNICODE_STRING Pdosname2;去做;有好结果时我告诉您!
lgh41
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-06-03 10:14
如果你去掉释放ExFreePool(&dosname2),什么效果??

我晕死了
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
14楼#
发布于: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分
15楼#
发布于:2005-06-03 09:37
在XP 2K下都不行。
和你们说的症状一样。就是如果系统已经加载了,就没有问题。

你们是怎么解决的??
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
16楼#
发布于: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分
17楼#
发布于:2005-06-02 18:21
我现在也遇到这个问题了,怎么解决的你们??
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-01-28 19:39
楼上的,我遇到的问题和你一样,也是在boot过程中蓝屏的,我实在SfCreate中调用的这个函数。
Ideas for life!
Coder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望34点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-08 16:02
我也刚遇到了这个问题,
RtlVolumeDeviceToDosName (irpSp->FileObject->DeviceObject, dosname )
我的过滤驱动是boot启动的,还没有启动完毕就蓝屏了,也不知道怎么回事。
上一页
游客

返回顶部