阅读:1539回复:4
关于RtlVolumeDeviceToDosName函数
我使用的2000ifskit中的sfilter进行调试,想在mount complete例程中进行volumn名的转换,得到类似于"c:"这样的表示方式,代码如下:
if (dosname = ExAllocatePool( NonPagedPool, BUFFER_SIZE )) { if (RtlVolumeDeviceToDosName (vpb->DeviceObject, dosname ) ) { DbgPrint("the volume DOS name is %ws \n" , dosname->Buffer ); ExFreePool( dosname); } } 运行没有出现蓝屏,但是得到的值是NULL,不知道怎么回事,望各位高手指点,谢谢。 |
|
沙发#
发布于:2004-12-09 03:33
MOUNT完的时候被你HOOK住了, 这时OS还来不及创建盘符, 当然你什么也得不到.
顺便说一下, 盘符可以在用户模式被改变和删除而不需要通知内核, 所以在内核依赖盘符是不可靠的. 而且你下面函数的用法也有问题, 会有LEAK. NTSTATUS RtlVolumeDeviceToDosName( IN PVOID VolumeDeviceObject, OUT PUNICODE_STRING DosName ) /*++ ... This caller of this routine must call ExFreePool on DosName->Buffer when it is no longer needed. ... --*/ |
|
板凳#
发布于:2004-12-09 10:32
谢谢你的回答,我翻了osr上关于在sfilter中获取volumn letter的帖子,他们都说在mount例程中使用这个函数是最好的办法,我不知道是怎么回事?
我想得到全路径名,必须得到volumn对应的盘符阿,有没有什么更好的办法呢? |
|
地板#
发布于:2004-12-10 06:56
对不起, 前面我说错了. 盘符是在文件系统MOUNT前就有的. 不过RtlVolumeDeviceToDosName应该是在PASSIVE_LEVEL时调用的, 不能在完成例程里面用.
toad |
|
地下室#
发布于:2005-01-31 14:48
Coder你好,我也在为获取文件全路经而犯愁,现在尝试了很多方法都不是很成功,不知道你做的怎么样了 有进展吗 能不能把 经验共享一下?
|
|
|