Hey, I try to redirect an IRP using the following code…
But when I pass the IRP down, i get a blue screen of death which basically is a BAD_POOL_CALLER, the error (at least windbg says it) occurs right in the IoSkipCurrentIrpStackLocation line.
I appreciate any help or hint. And here it goes:
/* JUST AN EXCERPT */
SfRedirectIRP(irpSp,Irp,&myRandomName);
// Free myRandomName to avoid Stack Flooding
if(myRandomName.Buffer)
ExFreePool(myRandomName.Buffer);
IoSkipCurrentIrpStackLocation( Irp );
return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->NLExtHeader.AttachedToDeviceObject,
Irp );
/* EXCERPT END */
VOID SfRedirectIRP(PIO_STACK_LOCATION FltObjects, PIRP Data, PUNICODE_STRING TargetName)
{
PUNICODE_STRING filename = &((PFILE_OBJECT)FltObjects->FileObject)->FileName;
/* HERE WE ARE SETTING THE NEW FILENAME INSIDE THE BUFFER */
if(TargetName->MaximumLength < filename->MaximumLength)
{
// Create a new buffer and free existing one.
// Note that allocated buffer will be freed automatically by the system.
PWSTR pBuffer = (PWSTR) ExAllocatePool(NonPagedPool,TargetName->MaximumLength * sizeof(WCHAR)); //new (NonPagedPool)char[TargetName->MaximumLength];
if(pBuffer == NULL)
return;
if(filename->Buffer)
ExFreePool(filename->Buffer);
RtlCopyMemory(pBuffer, TargetName->Buffer, TargetName->Length);
filename->Length = TargetName->Length;
filename->MaximumLength = TargetName->MaximumLength;
filename->Buffer = pBuffer;
}
else
{
// Reuse the existing buffer
RtlCopyMemory(filename->Buffer, TargetName->Buffer, TargetName->Length);
filename->Length = TargetName->Length;
}
Data=Data;
// SET IRP STATUS TO REPARSE
Data->IoStatus.Status = STATUS_REPARSE;
Data->IoStatus.Information = IO_REPARSE;
// REDIRECTION OF THE IRP FINISHED!
}