文件过滤驱动操作请求、结果
2013-08-05 15:35
507 查看
IRP_MJ_CREATE:消息会在新建和打开的请求中产生。
设置完成函数,等待本次新建结束以后才能够判断是新建还是打开。
//操作的请求,保存在(currentIrpStack->Parameters.Create.Options >> 24)&0xFF。
即 currentIrpStack->Parameters.Create.Options的高8位。
#define FILE_SUPERSEDE 0x00000000
#define FILE_OPEN 0x00000001
#define FILE_CREATE 0x00000002
#define FILE_OPEN_IF 0x00000003
#define FILE_OVERWRITE 0x00000004
#define FILE_OVERWRITE_IF 0x00000005
#define FILE_MAXIMUM_DISPOSITION 0x00000005
//操作的结果,保存在calldriver函数调用后的 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
//有新建可能的请求
if(disposition==FILE_CREATE||disposition==FILE_OPEN_IF||disposition==FILE_OVERWRITE_IF)
// 初始化事件
KeInitializeEvent( &waitEvent,
NotificationEvent,
FALSE );
// 因为我们要等待完成,所以必须拷贝当前调用栈
IoCopyCurrentIrpStackLocationToNext ( Irp );
// 设置完成函数,并把事件的指针当上下文传入。
IoSetCompletionRoutine( Irp,
IoIrpCompletion,
&waitEvent, //上下文指针
TRUE,
TRUE,
TRUE );
//
// Return the results of the call to the caller
//
// 发送IRP 并等待事件完成
status = IoCallDriver( hookExt->FileSystem, Irp );
if (STATUS_PENDING == status) {
status = KeWaitForSingleObject( &waitEvent,
Executive,
KernelMode,
FALSE,
NULL );
ASSERT( STATUS_SUCCESS == status );
}
Information = Irp->IoStatus.Information; //记录本次操作的结果。
// Information == FILE_CREATED表示新建操作。
// Information == FILE_OPEND表示打开操作。
// .....
IRP_MJ_WRITE:写操作。(WriteFile)
IRP_MJ_SET_INFORATION:删除/重命名/截断文件请求(修改文件:改变文件大小)/其他(目前我没用到)。
//操作的请求,保存在currentIrpStack->Parameters.SetFile.FileInformationClass
设置完成函数,等待本次新建结束以后才能够判断是新建还是打开。
//操作的请求,保存在(currentIrpStack->Parameters.Create.Options >> 24)&0xFF。
即 currentIrpStack->Parameters.Create.Options的高8位。
#define FILE_SUPERSEDE 0x00000000
#define FILE_OPEN 0x00000001
#define FILE_CREATE 0x00000002
#define FILE_OPEN_IF 0x00000003
#define FILE_OVERWRITE 0x00000004
#define FILE_OVERWRITE_IF 0x00000005
#define FILE_MAXIMUM_DISPOSITION 0x00000005
//操作的结果,保存在calldriver函数调用后的 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
//有新建可能的请求
if(disposition==FILE_CREATE||disposition==FILE_OPEN_IF||disposition==FILE_OVERWRITE_IF)
// 初始化事件
KeInitializeEvent( &waitEvent,
NotificationEvent,
FALSE );
// 因为我们要等待完成,所以必须拷贝当前调用栈
IoCopyCurrentIrpStackLocationToNext ( Irp );
// 设置完成函数,并把事件的指针当上下文传入。
IoSetCompletionRoutine( Irp,
IoIrpCompletion,
&waitEvent, //上下文指针
TRUE,
TRUE,
TRUE );
//
// Return the results of the call to the caller
//
// 发送IRP 并等待事件完成
status = IoCallDriver( hookExt->FileSystem, Irp );
if (STATUS_PENDING == status) {
status = KeWaitForSingleObject( &waitEvent,
Executive,
KernelMode,
FALSE,
NULL );
ASSERT( STATUS_SUCCESS == status );
}
Information = Irp->IoStatus.Information; //记录本次操作的结果。
// Information == FILE_CREATED表示新建操作。
// Information == FILE_OPEND表示打开操作。
// .....
IRP_MJ_WRITE:写操作。(WriteFile)
IRP_MJ_SET_INFORATION:删除/重命名/截断文件请求(修改文件:改变文件大小)/其他(目前我没用到)。
//操作的请求,保存在currentIrpStack->Parameters.SetFile.FileInformationClass
相关文章推荐
- 在文件过滤驱动中如何判断文件访问请求来自网络
- Windows驱动_文件系统微小过滤驱动之三微小过滤驱动的操作
- 在文件过滤驱动中如何判断文件访问请求来自网络?
- 文件过滤驱动--一个Unicode操作的Lib
- 在文件过滤驱动中如何判断文件访问请求来自网络?
- 文件过滤驱动实现目录重定向(一)
- Windows文件系统过滤驱动开发教程
- cat、tail、head、tee、grep、wc、sort文件操作和过滤
- Windows驱动开发(4) - 内核模式下的文件操作
- 读源码笔记--文件过滤驱动FileSpy第3篇 -- 绑定VDO
- sfilter开源驱动分析(一)--文件过滤的基本步骤
- 文件系统过滤驱动开发(二)
- 文件过滤驱动
- 文件过滤驱动中的重入处理
- Win64 驱动内核编程-5.内核里操作文件
- Windows驱动_文件系统过滤驱动之四
- 文件系统过滤驱动基础知识
- 基于文件系统过滤驱动的信息安全防护技术
- Windows驱动_文件系统过滤驱动之九
- 第四步 使用shell操作数据库,导入分析并将结果导出成txt文件