首页
社区
课程
招聘
求教编写磁盘驱动写保护,磁盘过滤层WriteFile返回STATUS_MEDIA_WRITE_PROTECTED无效
发表于: 2012-8-31 10:56 13300

求教编写磁盘驱动写保护,磁盘过滤层WriteFile返回STATUS_MEDIA_WRITE_PROTECTED无效

2012-8-31 10:56
13300
菜鸟我按着自己的理解,用WDM类型的,在磁盘层加入一个过滤层,拦截WriteFile操作,直接返回STATUS_MEDIA_WRITE_PROTECTED,但是这个磁盘下的相关分区直接消失了,不出现在windows资源管理器里了。

然后我又试着在磁盘卷层加入一个过滤层,同样拦截WriteFile,直接返回STATUS_MEDIA_WRITE_PROTECTED。
这个方法,分两种情况:
1, 如果是在驱动中写死要保护的磁盘卷,如D盘,系统启动后,双击打开磁盘时,系统会弹出对话框“磁盘被写保护”(但是,我没有拦截ReadFile啊,为什么就打不开磁盘了啊?)

2,如果在系统启动好后,和驱动通信,动态设置要保护的磁盘,如D盘。这个时候,如果向D盘拷贝文件。文件图标会出现在windows资源管理器中,但是紧随着拷贝操作几秒后,windows托盘区就会报错,说“说可能磁盘损坏什么的,写入磁盘出错啥的”。重启后,D盘是没有刚拷贝进去的文件的。我感觉是windows文件系统层有了个缓存啥的。

现在我希望实现的功能是,实现写保护后,能够读取文件。但是当拷贝文件到磁盘时,系统会弹出对话框“该磁盘被写保护”。

恳求各位大大指导啊

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (25)
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
《寒江独钓》 貌似有将
2012-8-31 12:16
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯,我的磁盘卷过滤驱动,就是直接拿《寒江独钓》的代码改的。他磁盘卷那一章讲的是还原驱动,没有讲如何实现写保护的。

我就是在他的代码上,加上WriteFile处理里直接返回STATUS_MEDIA_WRITE_PROTECTED的。
2012-8-31 12:37
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
简单的说,你搞的太高深了,直接写sfilter或者minifilter效果可能好很多。
2012-8-31 13:06
0
雪    币: 229
活跃值: (498)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
想动态更改的话,
方法1:直接上minifilter
方法2:先把卷dismount 在这个过程中通知卷过滤驱动某个devctl中返回STATUS_MEDIA_WRITE_PROTECTED,然后再mount(这个让fs自己做就行了)

切记不要再write中返回STATUS_MEDIA_WRITE_PROTECTED  这时已经晚了
2012-8-31 13:19
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不是吧,sfilter和minifilter是文件系统层过滤吧?应该比磁盘层和磁盘卷层更复杂吧?因为文件系统过滤,我感觉,可能至少需要考虑FAT32和NTFS两种格式吧,甚至U盘的FAT格式。

我想做磁盘写保护,感觉只处理磁盘层和磁盘卷层应该就能够搞定了吧?
2012-8-31 13:25
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
磁盘写保护不是简简单单的返回STATUS_MEDIA_WRITE_PROTECTED就可以的。文件系统的缓冲管理器如果写磁盘出错,系统就会提示缓存写入失败等信息。

磁盘写保护首先要确保这个磁盘能写保护,一般数据盘可以写保护,但系统盘就不能写保护。

我说的盘是指卷,不是硬盘。

然后加层过滤驱动,不用监控写操作,磁盘被mount的时候,会发个命令IOCTL_DISK_IS_WRITABLE来查询磁盘是否可写,这时返回STATUS_MEDIA_WRITE_PROTECTED,就行,文件系统就会按照这个属性,不让进程按可写权限打开文件。

另外回答你第一个问题,给你举个例子,你开着电脑,然后别动键盘鼠标,虽然你什么都没干,但是系统还是不时往硬盘写数据!!!这点你要注意就是啦,别以为你双击个盘只是读数据,你怎么知道你双击打开盘的时候系统没写数据呢?可能就是系统查询盘是否可写的时候,你没处理(底层处理了,返回可写),写数据却被你拒绝,那报错在所难免。
2012-8-31 13:27
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
文件系统过滤驱动是比磁盘的过滤驱动更复杂,但文件过滤驱动跟文件系统的格式无关,格式相关性已经被文件系统驱动屏蔽了,文件过滤驱动都是标准的,跟文件系统格式无关。
2012-8-31 13:35
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我想当然了,谢谢大大指出啊。
2012-8-31 13:41
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
是在我写的卷层过滤驱动中的IRP_MJ_DEVICE_CONTROL处理IOCTL_DISK_IS_WRITABLE是吧?我试下啊

谢谢大大啊,

我马上改程序试下。
2012-8-31 13:51
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
dismount我知道。
“在这个过程中通知卷过滤驱动某个devctl中返回”,是指:通知过滤驱动,指定卷(被dismount的卷)下次发出IOCTL_DISK_IS_WRITABLE查询请求时,返回STATUS_MEDIA_WRITE_PROTECTED,是吗?

“然后再mount(这个让fs自己做就行了)”
mount是由文件系统自动做的,自动激发的,是吧?我不明白的是,在dismount后,什么情况下,或是多久后,文件系统会自动mount这个卷啊?
2012-8-31 13:57
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
一个盘被dismount后,第一次CreateFile操作到IO管理器的时候,IO管理器就会分析这个盘是否已经mount,如果没有,将会做mount操作。也就是说,如果你想让你的磁盘保护及时生效,你dismount你的盘即可,dismount成功后,无论是你去打开盘,还是其他进程去打开盘的文件,都会引发一个mount操作
2012-8-31 14:05
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢大大,长知识了
2012-8-31 14:17
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
NTFS的卷必须能写才能看到文件吧~~$Log那些东西,如果不给丫写,能看到文件?

IOCTL_DISK_IS_WRITABLE 的事儿比较古怪~
2012-8-31 14:40
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个我可就没研究了,不过我验证过,确实在只读的情况下,能看到NTFS卷的内容,能除了写之外的正常操作,就相当于一个NTFS只读光盘。
2012-8-31 15:34
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
16
2012-8-31 16:02
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
17
1.磁盘过滤:
SCSIOP_MODE_SENSE 请求做处理,代码不多,但是这个过滤看起来不和谐。

2.卷过滤: IOCTL_DISK_IS_WRITABLE,IOCTL_DISK_SET_PARTITION_INFO 返回STATUS_MEDIA_WRITE_PROTECTED
2012-8-31 16:19
0
雪    币: 229
活跃值: (498)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
18
磁盘只读 肯定不能用的 不然你os都起不起来啊
2012-8-31 16:25
0
雪    币: 229
活跃值: (498)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
19
卷只读是肯定可行的
2012-8-31 16:26
0
雪    币: 3116
活跃值: (1269)
能力值: ( 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不上了
2012-8-31 16:38
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
SCSIOP_MODE_SENSE倒是可以只读,但是如果盘上有操作系统,估计还有使用磁盘还原比较好使吧。如果是U盘,移动硬盘,就可以用了。

我看卷过滤驱动应该比较适合来做磁盘只读的吧,至少,可以把操作系统所在盘给分开。
2012-8-31 16:39
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
22
学习~~~~
2012-8-31 17:06
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
磁盘层做只读不是不可以,

但是你首先得查询出诸如D盘是从该磁盘的哪个扇区到哪个扇区,

之后有写请求时,

在这个范围内的,一律放过,否则拦截。

操纵系统所在分区的扇区范围,绝对不可以写失败
2012-8-31 17:20
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
看大大的讨论,大开眼界啊,谢谢大大们~~

ITSailor大大给出的方法非常有效啊,谢谢啊!
2012-8-31 20:03
0
雪    币: 53
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
SCSIOP_MODE_SENSE这种针对磁盘层过滤的方式,动态设置是立即生效的吗?是否需要类似卷过滤,还要执行dismount啥的使其立即生效啊?

我这个主要是想用在U盘或者第二块硬盘上的
2012-8-31 20:22
0
游客
登录 | 注册 方可回帖
返回
//