From 37f99929f7cfe986058da46da907ca8158550230 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 9 Mar 2016 20:31:19 -0800 Subject: [PATCH] sys: callbacks.c --- src/sys/callbacks.c | 33 +++++++++++++++++++++++++++++---- src/sys/file.c | 2 +- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/sys/callbacks.c b/src/sys/callbacks.c index 6b867342..40853078 100644 --- a/src/sys/callbacks.c +++ b/src/sys/callbacks.c @@ -92,8 +92,10 @@ NTSTATUS FspAcquireForModWrite( FSP_FILE_NODE *FileNode = FileObject->FsContext; + ASSERT((PIRP)FSRTL_MOD_WRITE_TOP_LEVEL_IRP == IoGetTopLevelIrp()); FspFileNodeAcquireExclusive(FileNode, Full); - *ResourceToRelease = 0; + *ResourceToRelease = FileNode->Header.PagingIoResource; + /* ignored by us, but ModWriter expects it; any (non-NULL) resource will do */ FSP_LEAVE("FileObject=%p", FileObject); } @@ -108,6 +110,7 @@ NTSTATUS FspReleaseForModWrite( FSP_FILE_NODE *FileNode = FileObject->FsContext; FspFileNodeRelease(FileNode, Full); + ASSERT((PIRP)FSRTL_MOD_WRITE_TOP_LEVEL_IRP == IoGetTopLevelIrp()); FSP_LEAVE("FileObject=%p", FileObject); } @@ -119,8 +122,13 @@ NTSTATUS FspAcquireForCcFlush( FSP_ENTER(PAGED_CODE()); FSP_FILE_NODE *FileNode = FileObject->FsContext; + PIRP TopLevelIrp = IoGetTopLevelIrp(); + ASSERT(0 == TopLevelIrp || + (PIRP)FSRTL_MAX_TOP_LEVEL_IRP_FLAG < TopLevelIrp); FspFileNodeAcquireExclusive(FileNode, Full); + if (0 == TopLevelIrp) + IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); FSP_LEAVE("FileObject=%p", FileObject); } @@ -132,7 +140,12 @@ NTSTATUS FspReleaseForCcFlush( FSP_ENTER(PAGED_CODE()); FSP_FILE_NODE *FileNode = FileObject->FsContext; + PIRP TopLevelIrp = IoGetTopLevelIrp(); + ASSERT((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP == TopLevelIrp || + (PIRP)FSRTL_MAX_TOP_LEVEL_IRP_FLAG < TopLevelIrp); + if ((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP == TopLevelIrp) + IoSetTopLevelIrp(0); FspFileNodeRelease(FileNode, Full); FSP_LEAVE("FileObject=%p", FileObject); @@ -146,7 +159,10 @@ BOOLEAN FspAcquireForLazyWrite( FSP_FILE_NODE *FileNode = Context; - FspFileNodeAcquireExclusive(FileNode, Full); + ASSERT(0 == IoGetTopLevelIrp()); + Result = FspFileNodeTryAcquireExclusiveF(FileNode, FspFileNodeAcquireFull, Wait); + if (Result) + IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); FSP_LEAVE_BOOL("Context=%p, Wait=%d", Context, Wait); } @@ -158,6 +174,8 @@ VOID FspReleaseFromLazyWrite( FSP_FILE_NODE *FileNode = Context; + ASSERT((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP == IoGetTopLevelIrp()); + IoSetTopLevelIrp(0); FspFileNodeRelease(FileNode, Full); FSP_LEAVE_VOID("Context=%p", Context); @@ -171,7 +189,10 @@ BOOLEAN FspAcquireForReadAhead( FSP_FILE_NODE *FileNode = Context; - FspFileNodeAcquireShared(FileNode, Full); + ASSERT(0 == IoGetTopLevelIrp()); + Result = FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireFull, Wait); + if (Result) + IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); FSP_LEAVE_BOOL("Context=%p, Wait=%d", Context, Wait); } @@ -183,6 +204,8 @@ VOID FspReleaseFromReadAhead( FSP_FILE_NODE *FileNode = Context; + ASSERT((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP == IoGetTopLevelIrp()); + IoSetTopLevelIrp(0); FspFileNodeRelease(FileNode, Full); FSP_LEAVE_VOID("Context=%p", Context); @@ -197,7 +220,9 @@ VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelIrp) PAGED_CODE(); - if (FSRTL_MAX_TOP_LEVEL_IRP_FLAG >= (UINT_PTR)TopLevelIrp) + ASSERT(0 != Irp && 0 != TopLevelIrp); + + if ((PIRP)FSRTL_MAX_TOP_LEVEL_IRP_FLAG >= TopLevelIrp) { DEBUGBREAK_EX(iorecu); diff --git a/src/sys/file.c b/src/sys/file.c index 6ebff8eb..c1efe0ec 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -63,7 +63,7 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); #define FSP_FILE_NODE_GET_FLAGS() \ PIRP Irp = IoGetTopLevelIrp(); \ - BOOLEAN IrpValid = FSRTL_MAX_TOP_LEVEL_IRP_FLAG < (UINT_PTR)Irp &&\ + BOOLEAN IrpValid = (PIRP)FSRTL_MAX_TOP_LEVEL_IRP_FLAG < Irp &&\ IO_TYPE_IRP == Irp->Type;\ if (IrpValid) \ Flags &= ~FspIrpTopFlags(Irp);