本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 4865|回复: 5

【求助】微过滤中FltCreateFile失败是为何? [复制链接]

Rank: 1

发表于 2012-12-20 11:59:54 |显示全部楼层
FLT_PREOP_CALLBACK_STATUS
ccxPreCreate(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    )
{
.........................
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);     
也一样失败,会蓝屏。

不知是什么原因?

Rank: 2

发表于 2012-12-20 13:04:59 |显示全部楼层
本帖最后由 catface0511 于 2012-12-20 13:07 编辑

创建中开启文件 可能重入
而且PRECREATE中 某些路径 文件还不存在

建议在POST中试试

STATUS_INVALID_PARAMETER 0xc000000d
这个已经很说明问题了

Rank: 1

发表于 2012-12-20 17:12:06 |显示全部楼层
catface0511 发表于 2012-12-20 13:04
创建中开启文件 可能重入
而且PRECREATE中 某些路径 文件还不存在

原来在sfilter下是用IoCreateFileSpecifyDeviceObjectHint可以打开的。
换到minifilter只好用FltCreateFile了。
因为IoCreateFileSpecifyDeviceObjectHint需要一个DeviceObject不知怎么取到。
有没有更好的办法解决呢?
能说说吗?

Rank: 2

发表于 2012-12-20 21:41:27 |显示全部楼层
只是说可能
我的想法 我已经建议过了

Rank: 1

发表于 2012-12-21 16:14:49 |显示全部楼层
代码没问题的话,用FltCreateFile是无论如何不会重入的,minifilter的接口就是专门对付sfilter中原有的问题 的。

Rank: 1

发表于 2012-12-22 16:28:52 |显示全部楼层
问题解决了。谢谢了
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-5-19 17:42 , Processed in 0.021990 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部