驱动老牛
![]() |
阅读:5553回复:26
RtlVolumeDeviceToDosName 的问题
为什么我在2000下调用 RtlVolumeDeviceToDosName 在加载的时候就兰屏,ntoskrnl.exe崩溃。
如果我不用这个函数,我能不能认为\device\harddiskvolume1 就是C:,如果盘符被改了会不会出现问题? |
最新喜欢:![]()
|
沙发#
发布于: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. |
|
驱动老牛
![]() |
板凳#
发布于:2004-11-26 10:46
我是这样调用的
RtlVolumeDeviceToDosName(pFileObject->DeviceObject,&DosName); 可以问题是我调试的时候这个驱动还没加载就崩溃了,是再内核加载驱动之前就崩溃了。ntoskrnl.exe崩溃。 没有这个函数就没问题,这是为什么? |
|
地板#
发布于:2004-11-26 14:22
你是怎么初始化DosName的?
|
|
驱动老牛
![]() |
地下室#
发布于:2004-11-26 14:39
我试过好几种情况一种是没初始化
一种是用RtlInitUnicodeString 初始化一个长串 一种是直接EXALLOCPOOL 分配 都不行。 |
|
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. |
|
|
驱动老牛
![]() |
6楼#
发布于:2004-11-26 17:47
没错!
会不会是DDK也得是2000的 |
|
7楼#
发布于:2004-12-08 15:21
传进去的第一个参数应该是pfile_object
|
|
8楼#
发布于:2004-12-08 16:02
我也刚遇到了这个问题,
RtlVolumeDeviceToDosName (irpSp->FileObject->DeviceObject, dosname ) 我的过滤驱动是boot启动的,还没有启动完毕就蓝屏了,也不知道怎么回事。 |
|
9楼#
发布于:2005-01-28 19:39
楼上的,我遇到的问题和你一样,也是在boot过程中蓝屏的,我实在SfCreate中调用的这个函数。
|
|
|
10楼#
发布于:2005-06-02 18:21
我现在也遇到这个问题了,怎么解决的你们??
|
|
11楼#
发布于:2005-06-02 19:15
很久了你是在Win2k下还是在WinXP下调用?实在什么地方地方的?最好把WinDbg分析的结果发上来
|
|
|
12楼#
发布于:2005-06-03 09:37
在XP 2K下都不行。
和你们说的症状一样。就是如果系统已经加载了,就没有问题。 你们是怎么解决的?? |
|
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 |
|
|
14楼#
发布于:2005-06-03 10:14
如果你去掉释放ExFreePool(&dosname2),什么效果??
我晕死了 |
|
15楼#
发布于:2005-06-03 10:47
zhjie374:
我正按照我在内核发的贴子,那位朋友出招: PUNICODE_STRING Pdosname2;去做;有好结果时我告诉您! |
|
|
16楼#
发布于:2005-06-03 13:24
楼上的,我遇到的问题和你一样,也是在boot过程中蓝屏的,我实在SfCreate中调用的这个函数。 RtlVolumeDeviceToDosName也是发个irp下去问的volume的symbolic link,然后一个个比较的 [编辑 - 6/5/05 by arthurtu] |
|
17楼#
发布于:2005-06-03 14:22
确实,我在WRITE中同样的方法是可以得到的。
那老大你说READ中怎么得到? 有什么取巧的方法? |
|
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加载,您认为改成什么方式加载与取文件的盘符相容呢? 谢谢您的大力帮助? |
|
|
19楼#
发布于:2005-06-04 16:38
RtlVolumeDeviceToDosName()这个函数我在XP下调用同样也遇到问题,但不是篮屏,而是假死。
这个函数的实现是先通过下发IRP来查询你给定DeviceObject的名字,这时会得到Device\\HarddiskVolume1这样的名字,然后这个函数开始26个盘符进行循环,通过调用ZwOpenSymbolicLinkObject这个函数,看那个盘符对应的连接名字是Device\\HarddiskVolume1。接着好像处理一些关于装配点的东西,我没太搞明白。 我们在FileMon或sfilter很容易得到Device\\HarddiskVolume1这样的名字,因此没有必要在去下发IRP来查询了。 最后我自己重新实现了一下RtlVolumeDeviceToDosName函数。终于搞定了。 |
|
上一页
下一页