文件监控解决方案

文件监控
大家好!

   在Windows下,怎样实时获取某个文件正被访问?
   如,通过钩子拦截API的方式,但用C++ iostream,C 的Fread,Java IO就无法知道;
   请大侠给出好的解决方案,谢谢!
------解决方案--------------------
引用:
UP,
ReadDirectoryChangesW 只能监控该目录下,文件改变,但不能检测文件被打开、读取操作;


打开后有 FILE_NOTIFY_CHANGE_LAST_ACCESS 消息,如果还要读取消息的话,那你就用 MINIFILTER 文件微过滤驱动好了,可以很好的完成你的需求


/*************************************************************************
    dispatch callback routines.
*************************************************************************/
FLT_PREOP_CALLBACK_STATUS
PreCreate (
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    )
{   
FLT_PREOP_CALLBACK_STATUS FltStatus = FLT_PREOP_SUCCESS_NO_CALLBACK ;

    UNREFERENCED_PARAMETER(CompletionContext);
UNREFERENCED_PARAMETER(FltObjects) ;
UNREFERENCED_PARAMETER(Data) ;

if (Data->IoStatus.Information == IRP_MJ_CREATE)
{
if ( ((Data->Iopb->Parameters.Create.Options>>FILE_FUNCTION_OFFSET) & FILE_FUNCTION_MASK) == FILE_CREATE 
------解决方案--------------------

((Data->Iopb->Parameters.Create.Options>>FILE_FUNCTION_OFFSET) & FILE_FUNCTION_MASK) == FILE_OVERWRITE_IF )
{
if( Ps_MonitorFileOperator(Data, FILE_TYPE_CREATE ) )
{
Data->IoStatus.Status = STATUS_SUCCESS;
Data->IoStatus.Information = 0;
return FLT_PREOP_COMPLETE;
}
}
else if (((Data->Iopb->Parameters.Create.Options>>FILE_FUNCTION_OFFSET) & FILE_FUNCTION_MASK) ==FILE_OPEN_IF)
{
if( Ps_MonitorFileOperator(Data, FILE_TYPE_WRITE ) )
{
Data->Iopb->Parameters.Create.SecurityContext->AccessState->RemainingDesiredAccess &= ~FILE_GENERIC_WRITE;
Data->IoStatus.Status = STATUS_ACCESS_DENIED;
Data->IoStatus.Information = 0;
return FLT_PREOP_COMPLETE;
}
}
else if ( Data->Iopb->OperationFlags == FILE_MOVE_IN )
{
if( Ps_MonitorFileOperator(Data, FILE_TYPE_MOVE ) )
{
Data->IoStatus.Status = STATUS_SUCCESS;
Data->IoStatus.Information = 0;
return FLT_PREOP_COMPLETE;
}
}
else
{
if( Ps_MonitorFileOperator(Data, FILE_TYPE_READ ) )
{
Data->Iopb->Parameters.Create.SecurityContext->AccessState->RemainingDesiredAccess &= ~FILE_GENERIC_READ;

Data->IoStatus.Status = STATUS_SUCCESS;
Data->IoStatus.Information = 0;
return FLT_PREOP_COMPLETE;
}
}
}

    return FltStatus ;//FLT_PREOP_SUCCESS_WITH_CALLBACK;
}