mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
sys: FspPropagateTopFlags
This commit is contained in:
parent
bb897872a1
commit
6f3f57366a
@ -24,6 +24,7 @@ BOOLEAN FspAcquireForReadAhead(
|
|||||||
BOOLEAN Wait);
|
BOOLEAN Wait);
|
||||||
VOID FspReleaseFromReadAhead(
|
VOID FspReleaseFromReadAhead(
|
||||||
PVOID Context);
|
PVOID Context);
|
||||||
|
VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelFlags);
|
||||||
|
|
||||||
#ifdef ALLOC_PRAGMA
|
#ifdef ALLOC_PRAGMA
|
||||||
#pragma alloc_text(PAGE, FspFastIoCheckIfPossible)
|
#pragma alloc_text(PAGE, FspFastIoCheckIfPossible)
|
||||||
@ -37,6 +38,7 @@ VOID FspReleaseFromReadAhead(
|
|||||||
#pragma alloc_text(PAGE, FspReleaseFromLazyWrite)
|
#pragma alloc_text(PAGE, FspReleaseFromLazyWrite)
|
||||||
#pragma alloc_text(PAGE, FspAcquireForReadAhead)
|
#pragma alloc_text(PAGE, FspAcquireForReadAhead)
|
||||||
#pragma alloc_text(PAGE, FspReleaseFromReadAhead)
|
#pragma alloc_text(PAGE, FspReleaseFromReadAhead)
|
||||||
|
#pragma alloc_text(PAGE, FspPropagateTopFlags)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BOOLEAN FspFastIoCheckIfPossible(
|
BOOLEAN FspFastIoCheckIfPossible(
|
||||||
@ -185,3 +187,27 @@ VOID FspReleaseFromReadAhead(
|
|||||||
|
|
||||||
FSP_LEAVE_VOID("Context=%p", Context);
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -130,19 +130,7 @@ extern __declspec(selectany) int fsp_bp = 1;
|
|||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
if (0 != fsp_top_level_irp) \
|
if (0 != fsp_top_level_irp) \
|
||||||
{ \
|
FspPropagateTopFlags(Irp, 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));\
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
IoSetTopLevelIrp(Irp); \
|
IoSetTopLevelIrp(Irp); \
|
||||||
if (!FspDeviceReference(IrpSp->DeviceObject))\
|
if (!FspDeviceReference(IrpSp->DeviceObject))\
|
||||||
{ \
|
{ \
|
||||||
@ -300,6 +288,7 @@ BOOLEAN FspAcquireForReadAhead(
|
|||||||
BOOLEAN Wait);
|
BOOLEAN Wait);
|
||||||
VOID FspReleaseFromReadAhead(
|
VOID FspReleaseFromReadAhead(
|
||||||
PVOID Context);
|
PVOID Context);
|
||||||
|
VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelIrp);
|
||||||
|
|
||||||
/* memory allocation */
|
/* memory allocation */
|
||||||
#define FspAlloc(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_INTERNAL_TAG)
|
#define FspAlloc(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_INTERNAL_TAG)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user