Coder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望34点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:1539回复:4

关于RtlVolumeDeviceToDosName函数

楼主#
更多 发布于:2004-12-09 00:34
我使用的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,不知道怎么回事,望各位高手指点,谢谢。

toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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.
...
--*/
Coder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望34点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-09 10:32
谢谢你的回答,我翻了osr上关于在sfilter中获取volumn letter的帖子,他们都说在mount例程中使用这个函数是最好的办法,我不知道是怎么回事?
我想得到全路径名,必须得到volumn对应的盘符阿,有没有什么更好的办法呢?
toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-10 06:56
对不起, 前面我说错了. 盘符是在文件系统MOUNT前就有的. 不过RtlVolumeDeviceToDosName应该是在PASSIVE_LEVEL时调用的, 不能在完成例程里面用.

toad
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-31 14:48
Coder你好,我也在为获取文件全路经而犯愁,现在尝试了很多方法都不是很成功,不知道你做的怎么样了 有进展吗 能不能把 经验共享一下?
Ideas for life!
游客

返回顶部