阅读:2729回复:9
谁知道如何在FILEMON的IRP_MJ_READ中判断被拦截文件是目录还是文件?
用FILEMON做文件读写的拦截实验,在IRP_MJ_READ中已经能够得到被拦截文件的文件名,但我还想判断被拦截文件究竟是一个目录呢?还是文件。为此我在IRP_MJ_READ中加入如下代码:
case IRP_MJ_READ: PFILE_STANDARD_INFORMATION FileStandardInfo=NULL; BOOLEAN DirStatus = FALSE,status; FileStandardInfo = (PFILE_STANDARD_INFORMATION) ExAllocatePool( NonPagedPool, sizeof( FILE_STANDARD_INFORMATION ) ); status = FilemonQueryFile(hookExt->FileSystem, FileObject, FileStandardInformation, FileStandardInfo, sizeof( FILE_STANDARD_INFORMATION )); if(status) DirStatus = FileStandardInfo->Directory; if( FileStandardInfo ) ExFreePool( FileStandardInfo ); 这段代码利用了FILEMON提供的FilemonQueryFile函数获得文件标准信息,事实上FILEMON就是利用FilemonQueryFile函数获得文件名的。 这段代码大多数情况下工作正常,但在拦截NTFS文件系统下的文件时会出问题,例如打开一个NTFS文件系统下的Excel文件,进行一些修改后存盘,在文件存储过程中会生成一个临时文件,这个临时文件在经过上述代码时不光得不到文件标准信息而且还会使Excel文件失去响应无法关闭,系统也不报任何错误。 NTFS文件系统有一些很奇怪的现象,大多数文件的FileObject->FileName.Buffer是有内容的,但上述临时文件的FileObject->FileName.Buffer却是空的,它的文件名就是利用FilemonQueryFile函数查询FILE_NAME_INFORMATION获得的,此外临时文件的FileObject地址(例如:810b0508)也不是从IRP_MJ_CREATE中产生的,临时文件的FileObject地址凭空出现,不知从何而来,不知是否FILEMON没有拦截到它的产生过程。NTFS文件系统中还有一些文件如$Mft、$LogFile也是FileObject地址凭空出现,不知谁创建的?而且FileObject->FileName.Buffer是空的。但用上述代码不出问题。 我还尝试用ZwCreateFile ZwQueryInformationFile函数获得文件标准信息,却遇到文件共享错误,可能被拦截的文件不一定允许共享打开。 那么我如何才能在IRP_MJ_READ中判断被拦截文件是目录还是文件呢?代码要适用NTFS文件系统和各种文件类型而不出错。请高手指教 [编辑 - 11/15/02 by yuhui] |
|
沙发#
发布于:2003-06-17 10:54
禁止文件写有很多情况要考虑。
例如, IRP_MJ_CREATE时用了覆盖参数,则系统首先将文件拷贝到临时文件,再将原文件清空,等文件操作结束时,再进行重命名操作。很久不来,很多命令记不清了,见谅。 |
|
板凳#
发布于:2003-06-17 09:19
word修改文件是一个复杂的过程。
它修改的是一个临时文件,保存时删掉原来的文件,再把临时文件重新命名为原来的文件 |
|
|
地板#
发布于:2003-06-14 17:59
1. 那段代码必须放在IRP_MJ_CREATE里面 Coolice兄: 可以稍微消息一点吗? 另外小弟还有两个问题求教: 1.我在禁止文件写的时候,为什么用记事本打开txt文件,可以处理正确,而用Word打开这个txt文件,却可以写进去? 2.要使一个目录只读,需要处理写什么IRP操作?具体的思路应该时什么样子? 非常感谢! |
|
|
地下室#
发布于:2002-11-18 17:42
目录确实有IRP_MJ_READ的,但是也和IRP_MJ_CREATE对应
|
|
5楼#
发布于:2002-11-18 17:41
不会有凭空而生的IRP_MJ_READ的,所有的FileObject都是CREATE生成的
|
|
6楼#
发布于:2002-11-18 17:23
怪了,目录切换也会产生IRP_MJ_READ??????
|
|
7楼#
发布于:2002-11-18 16:31
我的意思是说在IRP_MJ_READ中如何通过已知的FileObject获得与该FileObject相对应文件的标准信息,从而判断该文件究竟是一个目录还是文件。难道做不到吗?病毒监控程序也拦截文件读写,我想它也要判断被拦截文件是目录还是文件的吧。
有些FileObject不通过IRP_MJ_CREATE产生,因此在IRP_MJ_CREATE中无法得到相关信息。 |
|
8楼#
发布于:2002-11-15 14:42
FileObject->FileName.Buffer在打开文件后就失效了,所以在read里检查是毫无意义的
|
|
9楼#
发布于:2002-11-15 14:39
1. 那段代码必须放在IRP_MJ_CREATE里面
2. 有些文件名是相对路径名,这时需要检查FileObject->RelatedFileObject 3. 对于NTFS META FILENAME可以不做处理 4. 还有一种情况NTFS会用ID打开文件,而不是文件名 FILEMON有很多BUG,所以必要时可以参考ifskit里的代码 |
|