我对CreateFile做了hook,限制对文件的访问。要求对扩展名为txt的文件,禁止写入。
在我的hook函数中,通过判断accessmode是否包含GENERIC_WRITE属性,来决定中止Createfile,
return INVALIDE_FILE_HANDLe.
在测试中就遇到一个奇怪的问题,我用Notepad打开一个a.txt文件,修改后,保存,这个时候
Notepad会调用CreateFile,访问方式是GENERIC_READ|GENERIC_WRITE,当然我会拒绝它的访问。
Notepad发现保存失败后,会选择“另存为”的方法。我这是仍然选择文件名为a.txt,这个时候
Notepad再次调用CreateFile,访问方式居然是GENERIC_READ。关闭notepad,再次打开a.txt,
修改的结果被保存了。
    我想问一下,用CreateFile打开文件,方式选为GENERIC_READ,难道可以对文件写吗?是否还要结合CreateFile的其他参数使用呢?请大家指点。
    快过年了,祝CSDN各位朋友新年快乐。

解决方案 »

  1.   

    会不会是Notepad先保存了一个临时文件,后来又用GENERIC_RAEAD打开了临时文件,执行了SaveAs(),保存为了a.txt当然,那个临时文件没有触发你的钩子,具体为何没有触发你的钩子,就不清楚了。
      

  2.   

    又想了想,不对吧,楼主一定Debug错了
      

  3.   

    to samsun2000:这是个顺序执行的流程,要是软件那里有错的话,其他情况下,流程是不会对的。但其他情况下是对的。