Hi
I’m writing an encryption /decryption filter driver .
In my IRP_MJ_READ function, In order to write the decrypted data into file, I roll my own Irp and call IoCallDriver(). But IoCallDriver() returns STATUS_PENDING . Can you please tell me where I went wrong?
My Code is
NTSTATUS WriteFile(IN PDEVICE_OBJECT Deviceobject, IN PFILE_OBJECT FileObject,IN ULONG length,IN LARGE_INTEGER ByteOffset,IN PUCHAR Buffer)
{
PIRP WriteIrp = NULL;
PIO_STACK_LOCATION WriteIrpsp = NULL;
IO_STATUS_BLOCK istatusblock;
KEVENT Syncevent;
NTSTATUS status;
istatusblock.Status = STATUS_SUCCESS;
istatusblock.Information = 0;
KeInitializeEvent(&Syncevent,SynchronizationEvent,FALSE);
WriteIrp = IoAllocateIrp(((PFSFILTER_DEVICE_EXTENSION)Deviceobject->DeviceExtension)->AttachedToDeviceObject->StackSize,FALSE);
if(WriteIrp == NULL)
{
DbgPrint(“Irp not created”);
return STATUS_INSUFFICIENT_RESOURCES;
}
WriteIrp ->UserBuffer = Buffer;
WriteIrp ->Tail.Overlay.Thread = PsGetCurrentThread();
WriteIrp->RequestorMode = KernelMode;
WriteIrp ->UserIosb = &istatusblock;
WriteIrp ->UserEvent = &Syncevent;
WriteIrp ->Flags = IRP_WRITE_OPERATION;
WriteIrpsp =IoGetNextIrpStackLocation(WriteIrp);
WriteIrpsp ->MajorFunction = IRP_MJ_WRITE;
WriteIrpsp ->MinorFunction = 0;
WriteIrpsp ->FileObject = FileObject;
IoSetCompletionRoutine(WriteIrp ,WriteCompletionRoutine,&Syncevent,TRUE,TRUE,TRUE);
WriteIrpsp ->Parameters.Write.Length = length;
WriteIrpsp ->Parameters.Write.ByteOffset = ByteOffset;
status= IoCallDriver(((PFSFILTER_DEVICE_EXTENSION)Deviceobject->DeviceExtension)->AttachedToDeviceObject,WriteIrp);
DbgPrint(“ntstatus 0x%x”,status);
if(STATUS_PENDING == status)
{
DbgPrint(“write file pending”);
IoMarkIrpPending(WriteIrp);
KeWaitForSingleObject(&Syncevent,Executive,KernelMode,FALSE,NULL);
}
return istatusblock.Status;
}
NTSTATUS WriteCompletionRoutine(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp, IN PVOID Context)
{
*Irp->UserIosb = Irp->IoStatus;
KeSetEvent(Irp->UserEvent,0,FALSE);
IoFreeIrp(Irp);
return STATUS_MORE_PROCESSING_REQUIRED;
}