阅读:1732回复:5
在create中怎么判断文件是 创建 还是 打开?
我想过滤掉文件的打开操作,只记录创建,试了好几种方法都不行。
按照: disposition = (currentIrpStack->Parameters.Create.Options >> 24) & 0xFF; (disposition != FILE_OPEN)? "Create" :"Open"; 不论是磁盘上文件是否真的存在,输出结果都是Create。 IRP_MJ_DIRECTORY_CONTROL 下 有一个 FileBothDirectoryInformation,从的返回结果STATUS_NO_SUCH_FILE 倒是好判断文件是否存在,但向下发送FileBothDirectoryInformation的IRP不会弄。 调用修改过的filemon里的FilemonQueryFile 在create完成后查询,却导致蓝屏(0x23,irp 损坏)。 请教各位大侠,有啥好方法可以解决? ------------------------------------------------------------------------------------------------ 后来仔细地看了一下msdn,IRP_MJ_CREATE下有一个 Irp->IoStatus.Information ,返回值的附加信息,他们的标志是: #define FILE_SUPERSEDED 0x00000000 #define FILE_OPENED 0x00000001 #define FILE_CREATED 0x00000002 #define FILE_OVERWRITTEN 0x00000003 #define FILE_EXISTS 0x00000004 #define FILE_DOES_NOT_EXIST 0x00000005 我试了一下,只是打开文件的,create后为FILE_OPENED 如果是创建,create后为FILE_CREATED 不知道大家觉得这方法怎么样. 但我还不太清楚FILE_SUPERSEDED 是什么意思。在close返回中也有。 |
|
|
驱动小牛
![]() |
沙发#
发布于:2007-06-20 13:28
CREATE NEW会有明显的标示,但是OPEN可能没有标示,OPEN的时候如果没有标示,需要自己查询
|
|
板凳#
发布于:2007-06-20 14:17
我是这样判断文件是否已经存在的
用IoCreateFileSpecifyDeviceObjectHint打开需要判断的文件,若返回值为STATUS_OBJECT_NAME_NOT_FOUND则说明文件不存在 |
|
地板#
发布于:2007-06-20 14:18
我是这样判断文件是否已经存在的
用IoCreateFileSpecifyDeviceObjectHint打开需要判断的文件,若返回值为STATUS_OBJECT_NAME_NOT_FOUND则说明文件不存在 |
|
地下室#
发布于:2007-06-21 10:22
如何判断是否是系统打开的文件
|
|
5楼#
发布于:2007-06-21 16:30
检查进程名,楼上的问题大概可以解决
|
|
|