首页
社区
课程
招聘
[求助]文件系统过滤驱动,恳请指教,谢谢!
发表于: 2012-3-8 10:56 5689

[求助]文件系统过滤驱动,恳请指教,谢谢!

2012-3-8 10:56
5689
最近,在看寒江独钓,想利用其中的一个源代码(sflt_smpl),做一个和斑竹曾经做的监视文件的东东,
我仅在下面两个函数中添加如下的语句,但是一创建文件,系统就像死了一样,恳请大家帮帮满,谢谢!
SF_RET OnSfilterIrpPre(
                IN PDEVICE_OBJECT dev,
                IN PDEVICE_OBJECT next_dev,
                IN PVOID extension,
                IN PIRP irp,
                OUT NTSTATUS *status,
                PVOID *context)
{
        return SF_IRP_GO_ON;
}

VOID OnSfilterIrpPost(
                IN PDEVICE_OBJECT dev,
                IN PDEVICE_OBJECT next_dev,
                IN PVOID extension,
                IN PIRP irp,
                IN NTSTATUS status,
                PVOID context)
{
        ANSI_STRING aFilePath;
        WCHAR chFilePath[1024] = {0};
        POBJECT_NAME_INFORMATION  ObjectNameInformation = NULL;
    // 获得当前调用栈
        PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);
        PFILE_OBJECT file = irpsp->FileObject;
        // 我仅仅过滤文件请求。 FileObject不存在的情况一律passthru.
        if(file == NULL)
                return ;

        // 首要决定哪些请求是我们必须过滤的。多余的提前passthru掉。
        if( irpsp->MajorFunction != IRP_MJ_CREATE &&
                irpsp->MajorFunction != IRP_MJ_CLOSE &&
                irpsp->MajorFunction != IRP_MJ_READ &&
                irpsp->MajorFunction != IRP_MJ_WRITE &&
                irpsp->MajorFunction != IRP_MJ_CLOSE  &&
                irpsp->MajorFunction != IRP_MJ_CLEANUP &&
                irpsp->MajorFunction != IRP_MJ_SET_INFORMATION &&
                irpsp->MajorFunction != IRP_MJ_DIRECTORY_CONTROL &&
                irpsp->MajorFunction != IRP_MJ_QUERY_INFORMATION)
                return ;

        if(irpsp->MajorFunction == IRP_MJ_CREATE)
        {
                //如果创建失败, 跳过
                if (!NT_SUCCESS(irp->IoStatus.Status))
                {
                        return ;
                }
                //如果创建的是文件夹跳过
                if ( ( irpsp->Parameters.Create.Options & FILE_DIRECTORY_FILE ) != 0 )
                {
                        return;
                }
                //如果是创建文件, 则记录
                if(irp->IoStatus.Information == FILE_CREATED)
                {
                        ObjectNameInformation = (POBJECT_NAME_INFORMATION)chFilePath;
                        if (NT_SUCCESS(IoQueryFileDosDeviceName(irpsp->FileObject, &ObjectNameInformation)))
                        {
                                KdPrint(("aaa"));
                                return;

                        }

                }
        }
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
处理一下重入.
2012-3-8 13:26
0
雪    币: 207
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢您的解答,能给我简单写两句么?
谢谢您!
2012-3-8 15:04
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你在创建CREATE例程里有调用了zwCREATE 就会再次被自己的驱动过滤到

这个就叫重入

我想你重入的方面是不是因为你想打开一个文件记录下你截获的文件操作和文件名
这个可以放在DRIVERENTRY里面做那个记录文件开启  然后一直使用它的句柄或者对象指针 不关闭句柄或者关机UNLOAD时再关闭句柄

WRITE等其他操作也有可能引起重入注意。

版主使用的是MINIFILTER框架 无论是获取文件名还是防止重入比你这个简单多了
你可以考虑下各种方法或者框架
2012-3-16 12:03
0
雪    币: 2314
活跃值: (2205)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
5
http://hi.baidu.com/hu3167343/blog/item/5895fb54d468350f377abe79.html 以前写的处理重入的文章。
还有现在一般都用minifilter框架啦,win8貌似都不支持sfilter了。
2012-3-16 13:02
0
游客
登录 | 注册 方可回帖
返回
//