2 hahanikan hahanikan 于 2014.10.16 16:29 提问

关于微驱动(Mini Filter Driver)里面 如何用文件名来判断禁止访问指定文件

本人刚刚开始学习过滤驱动,自己想做一个微过滤驱动来实现特定文件名的访问限制。
比如: README.txt 这个文件名的文件 不可以创建,打开,编辑和删除。

我在IRP_MJ_SET_INFORMATION 的 预处理里实现的属性的禁止修改。
但是在用IRP_MJ_READ , IRP_MJ_WRITE, IRP_MJ_CREATE 里却 不能实现。。。
不知道是不是因为在缓存中读取所以文件名字不一致导致的。 如果是的话应该怎么解决。

if(  NT_SUCCESS(  FltGetFileNameInformation(  Data,  FLT_FILE_NAME_NORMALIZED  |
        FLT_FILE_NAME_QUERY_DEFAULT, &nameInfo ) ) )
    {
        if( NT_SUCCESS( FltParseFileNameInformation( nameInfo ) ) )
        {
            WCHAR pTempBuf[ 512 ] = { 0 };
            WCHAR *pNonPageBuf = NULL, *pTemp = pTempBuf;
            if( nameInfo->Name.MaximumLength > 512 )
            {
                pNonPageBuf  =  ExAllocatePool(  NonPagedPool,nameInfo->Name.MaximumLength );
                pTemp = pNonPageBuf;
            }
            RtlCopyMemory( pTemp, nameInfo->Name.Buffer, nameInfo->Name.MaximumLength );
            DbgPrint("[MiniFilter][IRP_MJ_READ]%wZ\n", &nameInfo->Name);
            _wcsupr( pTemp );
            if( NULL != wcsstr( pTemp, L"READ.TXT" ) )    //  
            {
                //DbgPrint(  "\r\nIn  NPPreWrite(),  FilePath{%wZ}  is  forbided.", &nameInfo->Name );
                if( NULL != pNonPageBuf )
                    ExFreePool( pNonPageBuf );
                FltReleaseFileNameInformation( nameInfo );
            //  Data->IoStatus.Status = STATUS_ACCESS_DENIED;
            //  Data->IoStatus.Information = 0;
                DbgPrint("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
                return FLT_PREOP_DISALLOW_FASTIO;
            }
            if( NULL != pNonPageBuf )
                ExFreePool( pNonPageBuf );
        }
        FltReleaseFileNameInformation( nameInfo );
    }
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;

2个回答

Huntercao
Huntercao   Rxr 2015.01.08 11:59

我在IRP_MJ_SET_INFORMATION 的 预处理里实现的属性的禁止修改。
但是在用IRP_MJ_READ , IRP_MJ_WRITE, IRP_MJ_CREATE 里却 不能实现
你已经在IRP_MJ_SET_INFORMATION 里面实现了,为什么还要在其他IRP下实现呢?不同的IRP类型处理不同的事情。
比如,你不能在IRP_MJ_READ中去修改文件属性,但是你可以在 IRP_MJ_READ中看到你锁定的文件被读取数据的时候,让该IRP_MJ_READ读取失败来禁止用户读取该文件的数据。

hahanikan
hahanikan 现在已经解决了。 谢谢你 。 我当时想问的是属性的禁止修改已经通过IRP_MJ_SET_INFORMATION来实现了,但是读和打开需要Create和read来实现,所以当时在cancel掉IRP也一样能打开和读,所以才提问的。
2 年多之前 回复
xiaobai_2511
xiaobai_2511   2017.04.25 17:01

请问你这是在NT驱动里 还是wdm驱动 我在NT驱动 中用minifliter 回调函数没有起作用

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!