首页
社区
课程
招聘
[求助]微过滤中FltCreateFile失败是为何?
发表于: 2012-12-20 11:16 7637

[求助]微过滤中FltCreateFile失败是为何?

2012-12-20 11:16
7637
HANDLE hFile=NULL;

path.Buffer=ExAllocatePoolWithTag(NonPagedPool,length+4,CCX_MEM_TAG);
               
path.Length=0;
path.MaximumLength=(USHORT)length+4;
if(path.Buffer==NULL)
{
                status=STATUS_INSUFFICIENT_RESOURCES;
                ret=FLT_PREOP_COMPLETE;
                break;
}

        memset(path.Buffer,0,path.MaximumLength);
        //将路径复制到缓冲区中
        length=ccx_get_path(Data,&path);
hFile=ccxOpenFile(FltObjects->Filter,FltObjects->Instance,&path,Data->Iopb,&status,&myfile,&information);

//--------------------------------------------------------------
//调用打开文件:
HANDLE ccxOpenFile(
IN PFLT_FILTER Filter,
IN PFLT_INSTANCE Instance,
IN PUNICODE_STRING path,
IN PFLT_IO_PARAMETER_BLOCK irpsp,
OUT NTSTATUS *status,
OUT PFILE_OBJECT *file,
OUT PULONG information)
{
HANDLE hFile=NULL;
OBJECT_ATTRIBUTES oi;
IO_STATUS_BLOCK iostatus;

//----------------------------------------------------------------------------------------------------
ULONG desired_access=irpsp->Parameters.Create.SecurityContext->DesiredAccess;  
ULONG disposition=irpsp->Parameters.Create.Options>>24;
ULONG share_access=irpsp->Parameters.Create.ShareAccess;
ULONG file_attri=irpsp->Parameters.Create.FileAttributes;
ULONG create_options=irpsp->Parameters.Create.Options && 0x00ffffff;
ULONG EaLength=irpsp->Parameters.Create.EaLength;
PVOID EaBuffer=irpsp->Parameters.Create.EaBuffer;
ULONG Flags=IO_IGNORE_SHARE_ACCESS_CHECK;
//----------------------------------------------------------------------------------------------------
ASSERT(irpsp->MajorFunction==IRP_MJ_CREATE);
*information=0;
InitializeObjectAttributes(&oi,path,OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,NULL,NULL);

DbgPrint("文件名2:%wZ\n",path); //这里有输出完整的文件名       
*status=FltCreateFile(Filter,Instance,&hFile,desired_access,&oi,&iostatus,
        (PLARGE_INTEGER)0,file_attri,share_access,disposition,create_options,EaBuffer,EaLength,Flags);  
     
if(!NT_SUCCESS(*status))
{
        DbgPrint("打开文件失败:%08X\n",*status);       
        return hFile;
}
//----------------------------------------------------------------------------------------------------      
*information=iostatus.Information;
//从文件句柄获取FileObject以方便后面的操作
*status=ObReferenceObjectByHandle(
        hFile,0,*IoFileObjectType,KernelMode,file,NULL);
if(!NT_SUCCESS(*status))
        //ASSERT(FALSE);
        ZwClose(hFile);
}

return hFile;

}

//-------------------------------------------
问题:
1。这段代码是放在PreCreate中的
用FltCreateFile失败,返回0xC000000D,文件名输出无问题,缓冲区也足够大
2.换成*status=ZwCreateFile(&hFile,desired_access,&oi,&iostatus,(PLARGE_INTEGER)0,file_attri,share_access,
                disposition,create_options,EaBuffer,EaLength);     
也一样失败,会蓝屏。

不知是什么原因?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
各位大侠别光看不回呀。。
好歹也说说你的看法嘛。。
2012-12-20 12:03
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
从返回的错误码看是有无效的参数,是不是哪个参数不对啊?
2012-12-20 19:25
0
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道啊。
原来在sfilter下是用IoCreateFileSpecifyDeviceObjectHint可以打开的。
换到minifilter只好用FltCreateFile了。
因为IoCreateFileSpecifyDeviceObjectHint需要一个DeviceObject不知怎么取到。
有没有更好的办法解决呢?
能说说吗?
2012-12-21 11:25
0
雪    币: 16
活跃值: (527)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你创建文件的参数为什么不自己填,为什么要用系统传来的,看不懂
2020-3-10 16:23
0
游客
登录 | 注册 方可回帖
返回
//