redhatking
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望83点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分0分
阅读:2192回复:4

请教各位兄弟一个关于ZwReadFile的问题。

楼主#
更多 发布于:2008-09-18 10:46
现在要做一个对分区读写的功能,如对\\Device\\Harddisk0\\Partition1进行读写。
首先用ZwCreateFile打开,然后用ZwReadFile进行读。
现在的问题是:

如果这个分区有盘符的情况下,读写很正常。

如果把这个分区的盘符在磁盘管理器中删掉,重启电脑,ZwReadFile失败,返回STATUS_DEVICE_OFF_LINE

但是如果手工给这个分区加一个盘符,然后再把这个盘符删掉,读写又很正常。


我分析是:
如果这个分区没有盘符,系统重启后,不会有文件系统装配到这个分区(卷)上面去。所以ZwReadFile失败
但如果给这个分区加一个盘符,IO管理器就会通知文件系统去MOUNT,即使再把这个盘符删掉,文件系统不会DISMOUNT,所以ZwReadFile仍可以正常。

如果我分析的对的话,现在要解决一个问题,就在一个分区(卷)没有盘符的情况下,怎么让IO管理器去通知文件系统MOUNT这个卷
请各位多指教
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-09-18 16:41
Create的时候如果指定read or write的话,系统应该会自动mount该设备。你可以用device tree看看该设备有没有mount文件系统。
redhatking
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望83点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-09-18 22:07
今天又研究了一下,好像跟文件系统无关。用\\Device\\Harddisk0\\Partition1访问分区,实际是向VolSnap驱动发送请求,而不是我以前理解的向disk.sys发送请求的。
VolSnap虽然根据分区表创建了一个卷设备(\Device\\Harddisk0\\Partition1也是指向到这个送了设备),但是如果没有分配盘符的话,这个设备不会ONLINE,所以就会返回STATUS_DEVICE_OFF_LINE。 如何让他ONLINE,真是没有主意了。

后来尝试用\\Device\\Harddisk0\\DP(1)0x7e00-0x1770cfc00+1这样的方式去访问,返回STATUS_NO_SUCH_DEVICE,但是用WINOBJ确实能看到这个设备。

到底怎么才能对一个分区进行读写呢,应该有办法的吧,不过我实在不知道该怎么整。

哪位兄弟指点一二。
请各位多指教
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2008-09-19 09:14
别管卷,直接往磁盘指定扇区,发IRP,VISTA以前DP(1)0x7e00-0x1770cfc00+1已经给了你扇区提示,VISTA以后需要走些弯路,自己发请求查询.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
redhatking
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望83点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-09-19 09:48
谢谢wowocock 的回答,如果没有其他办法,就只能采用wowocock 所说的办法。

各位兄弟如果有其他的办法,也请提示一下。
另外根据\\Device\\Harddisk0\\DP(1)0x7e00-0x1770cfc00+1名,为什么取不到他的DeviceObject呢。
请各位多指教
游客

返回顶部