zhjzhj
驱动牛犊
驱动牛犊
  • 注册日期2002-02-02
  • 最后登录2002-10-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2381回复:11

如何保护文件的内容不被改写? 100分奉送!!!

楼主#
更多 发布于:2002-04-29 19:13
请问?

保护文件不被改写,应该在什么地方处理,
在IRP_MJ_WRITE处可以吗?
如果可以,该如何处理延迟写的问题?

如果修改文件为只读,该如何处理?

另外,那位大虾能告诉我如何
判断一个FILEOBJECT代表的是一个文件OR DIR,在什么时候纪录最好?

我保护c:\\test\\下的所有文件的写权限和禁止删除,但当我在c:\\test\\目录下创建一个目录,由于过一段时间系统要更新c:\\test目录的内容,IRP_SYNCHRONOUS_PAGING_IO ,系统会报告延迟写错误;

另外,当创建的文件是有初始内容的文件(波形文件),写文件时将不成功?

我该如何处理呢?


谢谢!!!

最新喜欢:

ykwj121ykwj12...
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-29 20:48
延迟写是去不掉的吧!因为这是由于WINDOWS系统的一种处理方法!根据程序的局部性原理和连续性原理,估计WINDOWS也不会例外的!其实延迟写入失败也没什么关系啊!不知道你为什么一定要解决了!
Alexander
驱动大牛
驱动大牛
  • 注册日期2002-02-04
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-29 23:04
瞎说,不一定对:
从开机开始用非共享方式打开该文件一直到关机,不就成了嘛。
du_lin
驱动小牛
驱动小牛
  • 注册日期2002-01-26
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-30 11:13
这着我也想过,可是总觉得有一点怪,能不能写到别的地方,这样写请求就完成了,我也是瞎猜的:)
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-04-30 14:57
用户被禁言,该主题自动屏蔽!
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-30 19:56
最简单的是在IRP_MJ_CREATE时将写权去除.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
Supermi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-20
  • 最后登录2014-06-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-01 04:35

1。想知道该文件是否是一个目录,只要构建自己的IRP查询该文件的 BASIC―INFORMATION还是STANDARD――INFORMATION(记不清了),反正两个结构中有一个结构里有一项IS――DIRECTORY,检查它是真是假即可
(也可以使用 ZwQueryFileInfomation (...),你看看IFS 或是DDK的帮助吧。
    但切记不要调用API来查询,这是为了安全起见。所以,MACY 说的有些不妥
2。想保护文件,光象LU0说的那样也不对,那样只能处理驱动加载后的文件写。
3。如果想保护,可以直接返回STATUS――UNSUCCESSFUL,但这样太卤莽,理智一点的做法应该是,
    1)判断是否是元文件(文件名长度为0,很奇怪吧,或是参考 FILEMON的判断方法),如果是,不做任何处理
    2)检测是否为要保护的文件,是,则 CANCEL IRP(即,调用IoCancelIRP()  (好象是吧),并返回 IRP CANCEL,不过,你可以查看  WWW。OSR。COM 中的 INSIDE NT 中 1997, 1998 年的电子版文章,上面祥述了IRP CANCEL 的详细方法,我想你能找到你所需的全部答案。
    我以前写得文件保护程序就是该文章上的技术,很成功。


 
Supermi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-20
  • 最后登录2014-06-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-01 04:43
忘了说一点
注意 , FAST――IO――WRITE
取消它,(就是简单的返回FALSE)
切记:2K 中的文件驱动必须有 FAST――IO 系列的28个函数,你可以不对该函数作些什么,但一定要声明,并记入你的DRIVER OBJECT 中, 这样WIN NT 才能找到你的FAST IO 函数,FAST IO 的设立,就是为从缓冲中读写数据,不知是不是你所谓的”延迟写“
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-05-01 22:05
用户被禁言,该主题自动屏蔽!
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-05-01 22:17
Supermi的说法不完全好.

----------------
FASTIO的处理不应该RETURN FALSE.
应该把IOSTATUS 设置成CANCEL,然后RETURN TRUE.
这样才有效率.

RETURN FALSE 不过是让系统去生成新的IRP_MJ_WRITE而已. 代价太大.


而且一些程序使用FASTIOWRITEMDL(MS的SERVICE),一般的测试很难遇到,别忘了.

---------------------
2。想保护文件,光象LU0说的那样也不对,那样只能处理驱动加载后的文件写

不太同意.

除非你处理读/写的解/加密,在DIRVER 加载之前也想按照自己的意图处理文件读写,恐怕没有办法.(除非你实现自己的文件系统)






soso
驱动牛犊
驱动牛犊
  • 注册日期2001-08-22
  • 最后登录2008-10-16
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-03 20:21
我感觉没有什么方法是有效的。除了DOS状态之外,即使在Windows启动的条件下,你也可以通过ren命令将文件重新命名,之后就随你操作了。

从前我在处理某些系统文件无法改写时就用这个方法。
用容乃大,无欲则刚
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-05-04 17:16
NT/2K/XP确实如此. 把文件改为只读也能RENAME. 如果想禁止RENAME,按LU0的方法做没错.

只不过不要简单的理解为,对于文件打开, IRP_MJ_CREATE时将写权去除.对与DIR OPEN时的IRP_MJ_CREATE也是一样.

嘻嘻,不过, 如果你允许追加文件, 就麻烦了, 得自己处理IRP_MJ_DIRECTORY_CONTROL 和必要的FASTIO吧.
游客

返回顶部