文件监控解决方案
文件监控
大家好!
在Windows下,怎样实时获取某个文件正被访问?
如,通过钩子拦截API的方式,但用C++ iostream,C 的Fread,Java IO就无法知道;
请大侠给出好的解决方案,谢谢!
------解决方案--------------------
打开后有 FILE_NOTIFY_CHANGE_LAST_ACCESS 消息,如果还要读取消息的话,那你就用 MINIFILTER 文件微过滤驱动好了,可以很好的完成你的需求
大家好!
在Windows下,怎样实时获取某个文件正被访问?
如,通过钩子拦截API的方式,但用C++ iostream,C 的Fread,Java IO就无法知道;
请大侠给出好的解决方案,谢谢!
------解决方案--------------------
打开后有 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;
}