阅读:2192回复:4
请教各位兄弟一个关于ZwReadFile的问题。
现在要做一个对分区读写的功能,如对\\Device\\Harddisk0\\Partition1进行读写。
首先用ZwCreateFile打开,然后用ZwReadFile进行读。 现在的问题是: 如果这个分区有盘符的情况下,读写很正常。 如果把这个分区的盘符在磁盘管理器中删掉,重启电脑,ZwReadFile失败,返回STATUS_DEVICE_OFF_LINE 但是如果手工给这个分区加一个盘符,然后再把这个盘符删掉,读写又很正常。 我分析是: 如果这个分区没有盘符,系统重启后,不会有文件系统装配到这个分区(卷)上面去。所以ZwReadFile失败 但如果给这个分区加一个盘符,IO管理器就会通知文件系统去MOUNT,即使再把这个盘符删掉,文件系统不会DISMOUNT,所以ZwReadFile仍可以正常。 如果我分析的对的话,现在要解决一个问题,就在一个分区(卷)没有盘符的情况下,怎么让IO管理器去通知文件系统MOUNT这个卷 |
|
|
沙发#
发布于:2008-09-18 16:41
Create的时候如果指定read or write的话,系统应该会自动mount该设备。你可以用device tree看看该设备有没有mount文件系统。
|
|
板凳#
发布于: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确实能看到这个设备。 到底怎么才能对一个分区进行读写呢,应该有办法的吧,不过我实在不知道该怎么整。 哪位兄弟指点一二。 |
|
|
地板#
发布于:2008-09-19 09:14
别管卷,直接往磁盘指定扇区,发IRP,VISTA以前DP(1)0x7e00-0x1770cfc00+1已经给了你扇区提示,VISTA以后需要走些弯路,自己发请求查询.
|
|
|
地下室#
发布于:2008-09-19 09:48
谢谢wowocock 的回答,如果没有其他办法,就只能采用wowocock 所说的办法。
各位兄弟如果有其他的办法,也请提示一下。 另外根据\\Device\\Harddisk0\\DP(1)0x7e00-0x1770cfc00+1名,为什么取不到他的DeviceObject呢。 |
|
|