能力值:
( LV2,RANK:10 )
|
-
-
2 楼
《寒江独钓》 貌似有将
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
嗯,我的磁盘卷过滤驱动,就是直接拿《寒江独钓》的代码改的。他磁盘卷那一章讲的是还原驱动,没有讲如何实现写保护的。
我就是在他的代码上,加上WriteFile处理里直接返回STATUS_MEDIA_WRITE_PROTECTED的。
|
能力值:
( LV12,RANK:760 )
|
-
-
4 楼
简单的说,你搞的太高深了,直接写sfilter或者minifilter效果可能好很多。
|
能力值:
( LV10,RANK:170 )
|
-
-
5 楼
想动态更改的话,
方法1:直接上minifilter
方法2:先把卷dismount 在这个过程中通知卷过滤驱动某个devctl中返回STATUS_MEDIA_WRITE_PROTECTED,然后再mount(这个让fs自己做就行了)
切记不要再write中返回STATUS_MEDIA_WRITE_PROTECTED 这时已经晚了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
不是吧,sfilter和minifilter是文件系统层过滤吧?应该比磁盘层和磁盘卷层更复杂吧?因为文件系统过滤,我感觉,可能至少需要考虑FAT32和NTFS两种格式吧,甚至U盘的FAT格式。
我想做磁盘写保护,感觉只处理磁盘层和磁盘卷层应该就能够搞定了吧?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
磁盘写保护不是简简单单的返回STATUS_MEDIA_WRITE_PROTECTED就可以的。文件系统的缓冲管理器如果写磁盘出错,系统就会提示缓存写入失败等信息。
磁盘写保护首先要确保这个磁盘能写保护,一般数据盘可以写保护,但系统盘就不能写保护。
我说的盘是指卷,不是硬盘。
然后加层过滤驱动,不用监控写操作,磁盘被mount的时候,会发个命令IOCTL_DISK_IS_WRITABLE来查询磁盘是否可写,这时返回STATUS_MEDIA_WRITE_PROTECTED,就行,文件系统就会按照这个属性,不让进程按可写权限打开文件。
另外回答你第一个问题,给你举个例子,你开着电脑,然后别动键盘鼠标,虽然你什么都没干,但是系统还是不时往硬盘写数据!!!这点你要注意就是啦,别以为你双击个盘只是读数据,你怎么知道你双击打开盘的时候系统没写数据呢?可能就是系统查询盘是否可写的时候,你没处理(底层处理了,返回可写),写数据却被你拒绝,那报错在所难免。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
文件系统过滤驱动是比磁盘的过滤驱动更复杂,但文件过滤驱动跟文件系统的格式无关,格式相关性已经被文件系统驱动屏蔽了,文件过滤驱动都是标准的,跟文件系统格式无关。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我想当然了,谢谢大大指出啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
是在我写的卷层过滤驱动中的IRP_MJ_DEVICE_CONTROL处理IOCTL_DISK_IS_WRITABLE是吧?我试下啊
谢谢大大啊,
我马上改程序试下。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
dismount我知道。
“在这个过程中通知卷过滤驱动某个devctl中返回”,是指:通知过滤驱动,指定卷(被dismount的卷)下次发出IOCTL_DISK_IS_WRITABLE查询请求时,返回STATUS_MEDIA_WRITE_PROTECTED,是吗?
“然后再mount(这个让fs自己做就行了)”
mount是由文件系统自动做的,自动激发的,是吧?我不明白的是,在dismount后,什么情况下,或是多久后,文件系统会自动mount这个卷啊?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
一个盘被dismount后,第一次CreateFile操作到IO管理器的时候,IO管理器就会分析这个盘是否已经mount,如果没有,将会做mount操作。也就是说,如果你想让你的磁盘保护及时生效,你dismount你的盘即可,dismount成功后,无论是你去打开盘,还是其他进程去打开盘的文件,都会引发一个mount操作
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
谢谢大大,长知识了
|
能力值:
( LV12,RANK:760 )
|
-
-
14 楼
NTFS的卷必须能写才能看到文件吧~~$Log那些东西,如果不给丫写,能看到文件?
IOCTL_DISK_IS_WRITABLE 的事儿比较古怪~
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
这个我可就没研究了,不过我验证过,确实在只读的情况下,能看到NTFS卷的内容,能除了写之外的正常操作,就相当于一个NTFS只读光盘。
|
能力值:
( LV12,RANK:760 )
|
-
-
16 楼
|
能力值:
( LV12,RANK:760 )
|
-
-
17 楼
1.磁盘过滤:
SCSIOP_MODE_SENSE 请求做处理,代码不多,但是这个过滤看起来不和谐。
2.卷过滤: IOCTL_DISK_IS_WRITABLE,IOCTL_DISK_SET_PARTITION_INFO 返回STATUS_MEDIA_WRITE_PROTECTED
|
能力值:
( LV10,RANK:170 )
|
-
-
18 楼
磁盘只读 肯定不能用的 不然你os都起不起来啊
|
能力值:
( LV10,RANK:170 )
|
-
-
19 楼
卷只读是肯定可行的
|
能力值:
( LV8,RANK:120 )
|
-
-
20 楼
有点意思,之前看那份老的ntfs代码,记得有段代码这样
NtfsMountVolume()
{
WriteProtected = NtfsGetDiskGeometry( IrpContext,
DeviceObjectWeTalkTo,
&DiskGeometry,
&PartitionInfo );
if (WriteProtected) {
DebugTrace( 0, Dbg, ("Write protected volume\n") );
try_return( Status = STATUS_MEDIA_WRITE_PROTECTED );
}
}
不知道现在的流程是怎么样,如果是这样的话,dismount后再回返WriteProtected的话,就mount不上了
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
SCSIOP_MODE_SENSE倒是可以只读,但是如果盘上有操作系统 ,估计还有使用磁盘还原比较好使吧。如果是U盘,移动硬盘,就可以用了。
我看卷过滤驱动应该比较适合来做磁盘只读的吧,至少,可以把操作系统所在盘给分开。
|
能力值:
(RANK:290 )
|
-
-
22 楼
学习~~~~
|
能力值:
( LV3,RANK:30 )
|
-
-
23 楼
磁盘层做只读不是不可以,
但是你首先得查询出诸如D盘是从该磁盘的哪个扇区到哪个扇区,
之后有写请求时,
在这个范围内的,一律放过,否则拦截。
操纵系统所在分区的扇区范围,绝对不可以写失败
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
看大大的讨论,大开眼界啊,谢谢大大们~~
ITSailor大大给出的方法非常有效啊,谢谢啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
SCSIOP_MODE_SENSE这种针对磁盘层过滤的方式,动态设置是立即生效的吗?是否需要类似卷过滤,还要执行dismount啥的使其立即生效啊?
我这个主要是想用在U盘或者第二块硬盘上的
|
|
|