diff --git a/src/fastio.c b/src/fastio.c index dc83bb20..6df3167a 100644 --- a/src/fastio.c +++ b/src/fastio.c @@ -323,19 +323,43 @@ static NTSTATUS __stdcall fast_io_release_for_mod_write(PFILE_OBJECT FileObject, _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH) static NTSTATUS __stdcall fast_io_acquire_for_ccflush(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject) { - UNUSED(FileObject); + fcb* fcb; + + TRACE("(%p, %p)\n", FileObject, DeviceObject); + UNUSED(DeviceObject); IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); + fcb = FileObject->FsContext; + + if (!fcb) + return STATUS_INVALID_PARAMETER; + + if (!ExAcquireResourceSharedLite(&fcb->Vcb->tree_lock, true)) + return STATUS_CANT_WAIT; + + if (!ExAcquireResourceExclusiveLite(fcb->Header.Resource, true)) { + ExReleaseResourceLite(&fcb->Vcb->tree_lock); + return STATUS_CANT_WAIT; + } + return STATUS_SUCCESS; } _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH) static NTSTATUS __stdcall fast_io_release_for_ccflush(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject) { - UNUSED(FileObject); + fcb* fcb; + + TRACE("(%p, %p)\n", FileObject, DeviceObject); + UNUSED(DeviceObject); + fcb = FileObject->FsContext; + + ExReleaseResourceLite(fcb->Header.Resource); + ExReleaseResourceLite(&fcb->Vcb->tree_lock); + if (IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP) IoSetTopLevelIrp(NULL);