Hello,
I am in bit of a trouble when I am using FltDoCompletionProcessingWhenSafe with IRP_MJ_WRITE. What I am doing is writing a simple logging driver which monitors all read & write activities. I log necessary things in post-operation calback. Because postoperation callback can be called at DPC level, many kernel routines are not available here, so as per the documentation I call FltDoCompletionProcessingWhenSafe for doing things which I can’t do in postoperation callback. But here my driver simply crashes with STATUS_ACCESS_VIOLATION code. Here’s the code,
FLT_POSTOP_CALLBACK_STATUS
LogPostOperationCallback(
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__in PVOID CompletionContext,
__in FLT_POST_OPERATION_FLAGS Flags
)
{
BOOLEAN bRet;
FLT_POSTOP_CALLBACK_STATUS RetPostOperationStatus;
if (FlagOn(Flags, FLTFL_POST_OPERATION_DRAINING))
{
DbgPrint(“Draining bit set.”);
return FLT_POSTOP_FINISHED_PROCESSING;
}
bRet = FLT_IS_IRP_OPERATION(Data);
if (FALSE == bRet)
{
DbgPrint(“NOT IRP based…”);
return FLT_POSTOP_FINISHED_PROCESSING;
}
if (FlagOn(Data->Iopb->IrpFlags, IRP_PAGING_IO))
{
DbgPrint(“Paging IO…”);
return FLT_POSTOP_FINISHED_PROCESSING;
}
bRet = FltDoCompletionProcessingWhenSafe(
Data,
FltObjects,
CompletionContext,
Flags,
SafePostCallback,
&RetPostOperationStatus
);
if (FALSE == bRet && FLT_POSTOP_FINISHED_PROCESSING == RetPostOperationStatus)
{
DbgPrint(“FltDoCompletionProcessingWhenSafe failed.”);
return FLT_POSTOP_FINISHED_PROCESSING;
}
return FLT_POSTOP_FINISHED_PROCESSING;
}
FLT_POSTOP_CALLBACK_STATUS
SafePostCallback(
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__in PVOID CompletionContext,
__in FLT_POST_OPERATION_FLAGS Flags
)
{
DbgPrint(“IN safepostcallback…”);
return FLT_POSTOP_FINISHED_PROCESSING;
}
Does this mean I should not use FltDoCompletionProcessingWhenSafe with IRP_MJ_WRITE? The same code works perfectly fine for IRP_MJ_READ.