From 6f3f57366acf8586eb88c54dbfdc83abe5c0ed13 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 3 Mar 2016 10:46:49 -0800 Subject: [PATCH] sys: FspPropagateTopFlags --- src/sys/callbacks.c | 26 ++++++++++++++++++++++++++ src/sys/driver.h | 15 ++------------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/sys/callbacks.c b/src/sys/callbacks.c index 1f4e182b..3887da18 100644 --- a/src/sys/callbacks.c +++ b/src/sys/callbacks.c @@ -24,6 +24,7 @@ BOOLEAN FspAcquireForReadAhead( BOOLEAN Wait); VOID FspReleaseFromReadAhead( PVOID Context); +VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelFlags); #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspFastIoCheckIfPossible) @@ -37,6 +38,7 @@ VOID FspReleaseFromReadAhead( #pragma alloc_text(PAGE, FspReleaseFromLazyWrite) #pragma alloc_text(PAGE, FspAcquireForReadAhead) #pragma alloc_text(PAGE, FspReleaseFromReadAhead) +#pragma alloc_text(PAGE, FspPropagateTopFlags) #endif BOOLEAN FspFastIoCheckIfPossible( @@ -185,3 +187,27 @@ VOID FspReleaseFromReadAhead( FSP_LEAVE_VOID("Context=%p", Context); } + +VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelIrp) +{ + /* + * We place FspPropagateTopFlags in this file, because the top flags + * are related to the resources acquired in FspAcquire*. + */ + + PAGED_CODE(); + + if (FSRTL_MAX_TOP_LEVEL_IRP_FLAG >= (UINT_PTR)TopLevelIrp) + FspIrpSetTopFlags(Irp, FspFileNodeAcquireFull); + else if (IO_TYPE_IRP == TopLevelIrp->Type) + { + PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; + PFILE_OBJECT TopLevelFileObject = IoGetCurrentIrpStackLocation(TopLevelIrp)->FileObject; + if (0 != FileObject && 0 != TopLevelFileObject && + FileObject->FsContext == TopLevelFileObject->FsContext && + FspFileNodeIsValid(FileObject->FsContext)) + { + FspIrpSetTopFlags(Irp, FspIrpFlags(TopLevelIrp)); + } + } +} diff --git a/src/sys/driver.h b/src/sys/driver.h index c75daa82..bea8b85d 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -130,19 +130,7 @@ extern __declspec(selectany) int fsp_bp = 1; do \ { \ if (0 != fsp_top_level_irp) \ - { \ - if (FSRTL_MAX_TOP_LEVEL_IRP_FLAG >= (UINT_PTR)fsp_top_level_irp)\ - FspIrpSetTopFlags(Irp, FspFileNodeAcquireFull);\ - else if (IO_TYPE_IRP == fsp_top_level_irp->Type &&\ - 0 != IrpSp->FileObject && FspFileNodeIsValid(IrpSp->FileObject->FsContext))\ - { \ - PIO_STACK_LOCATION fsp_top_level_irpsp =\ - IoGetCurrentIrpStackLocation(fsp_top_level_irp);\ - if (0 != fsp_top_level_irpsp->FileObject &&\ - IrpSp->FileObject->FsContext == fsp_top_level_irpsp->FileObject->FsContext)\ - FspIrpSetTopFlags(Irp, FspIrpFlags(fsp_top_level_irp));\ - } \ - } \ + FspPropagateTopFlags(Irp, fsp_top_level_irp);\ IoSetTopLevelIrp(Irp); \ if (!FspDeviceReference(IrpSp->DeviceObject))\ { \ @@ -300,6 +288,7 @@ BOOLEAN FspAcquireForReadAhead( BOOLEAN Wait); VOID FspReleaseFromReadAhead( PVOID Context); +VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelIrp); /* memory allocation */ #define FspAlloc(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_INTERNAL_TAG)