Hi,
in my minifilter I’ve to link the dircontrol’s output for a Dir1 to the
dircontrol’s output for a Dir2 (IE the result of this is the sum of two
directory list).
To do so, I’ve used this code :
VOID SendDirectoryControl(
IN OUT PFLT_CALLBACK_DATA Data,
IN PDIR_CNTRL_CNTX DirCntrlCtx
)
{
PFLT_CALLBACK_DATA NewData = NULL;
if(NT_SUCCESS(FltAllocateCallbackData(
DirCntrlCtx->PrefixStruct->DestInstance,
DirCntrlCtx->RedirFileObject,
&NewData)))
{
NewData->Iopb->MajorFunction = Data->Iopb->MajorFunction;
NewData->Iopb->MinorFunction = Data->Iopb->MinorFunction;
NewData->Iopb->OperationFlags = DirCntrlCtx->OperationFlags;
NewData->Iopb->IrpFlags = DirCntrlCtx->IrpFlags;
NewData->Iopb->Parameters.DirectoryControl.QueryDirectory.Length =
Data->Iopb->Parameters.DirectoryControl.QueryDirectory.Length;
NewData->Iopb->Parameters.DirectoryControl.QueryDirectory.FileName =
&DirCntrlCtx->Mask;
NewData->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformatio
nClass =
Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationCl
ass;
NewData->Iopb->Parameters.DirectoryControl.QueryDirectory.FileIndex =
Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileIndex;
NewData->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffe
r =
Data->Iopb->Parameters.DirectoryControl.QueryDirectory.DirectoryBuffer;
NewData->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress =
Data->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress;
FltPerformSynchronousIo(NewData);
if(NT_SUCCESS(NewData->IoStatus.Status))
{
RtlCopyMemory(&Data->IoStatus,&NewData->IoStatus,sizeof(IO_STATUS_BLOCK)
);
FltSetCallbackDataDirty( Data );
}else
{
ObDereferenceObject(DirCntrlCtx->RedirFileObject);
FltClose(DirCntrlCtx->hRedirFile);
}
NewData->Iopb->Parameters.DirectoryControl.QueryDirectory.MdlAddress =
NULL;
FltFreeCallbackData(NewData);
}
}
But after about 2000 iteration, the FltPerformSynchronousIo give a
STATUS_WORKING_SET_QUOTA on the NewData->IoStatus.Status.
I’ve do something bad?
There’re no mem leak and I’ve run the driver with the verifier
activated.
The target machine is a XP SP2.
N.B:: I’ve seen that if I don’t put to NULL the
NewData->…QueryDirectory.MdlAddress when I call FltFreeCallbackData
the FltMgr try to free this field even if it was not populated by
FltAllocateCallbackData. It’s normal?
Thank’s