VOID FFSFreeMcbTree( PFFS_MCB McbTree) { if (!McbTree) return; if (McbTree->Child) { FFSFreeMcbTree(McbTree->Child); } if (McbTree->Next) { PFFS_MCB Current; PFFS_MCB Next; Current = McbTree->Next; while (Current) { Next = Current->Next; if (Current->Child) { FFSFreeMcbTree(Current->Child); } FFSFreeMcb(Current); Current = Next; } } FFSFreeMcb(McbTree); }
__drv_mustHoldCriticalRegion VOID FFSFreeMcbTree( PFFS_MCB McbTree) { PAGED_CODE(); if (!McbTree) return; if (McbTree->Child) { FFSFreeMcbTree(McbTree->Child); } if (McbTree->Next) { PFFS_MCB Current; PFFS_MCB Next; Current = McbTree->Next; while (Current) { Next = Current->Next; if (Current->Child) { FFSFreeMcbTree(Current->Child); } FFSFreeMcb(Current); Current = Next; } } FFSFreeMcb(McbTree); }
VOID FFSFreeVcb( IN PFFS_VCB Vcb) { ASSERT(Vcb != NULL); ASSERT((Vcb->Identifier.Type == FFSVCB) && (Vcb->Identifier.Size == sizeof(FFS_VCB))); FsRtlNotifyUninitializeSync(&Vcb->NotifySync); if (Vcb->StreamObj) { if (IsFlagOn(Vcb->StreamObj->Flags, FO_FILE_MODIFIED)) { IO_STATUS_BLOCK IoStatus; CcFlushCache(&(Vcb->SectionObject), NULL, 0, &IoStatus); ClearFlag(Vcb->StreamObj->Flags, FO_FILE_MODIFIED); } if (Vcb->StreamObj->PrivateCacheMap) FFSSyncUninitializeCacheMap(Vcb->StreamObj); ObDereferenceObject(Vcb->StreamObj); Vcb->StreamObj = NULL; } #if DBG if (FsRtlNumberOfRunsInLargeMcb(&(Vcb->DirtyMcbs)) != 0) { LONGLONG DirtyVba; LONGLONG DirtyLba; LONGLONG DirtyLength; int i; for (i = 0; FsRtlGetNextLargeMcbEntry (&(Vcb->DirtyMcbs), i, &DirtyVba, &DirtyLba, &DirtyLength); i++) { FFSPrint((DBG_INFO, "DirtyVba = %I64xh\n", DirtyVba)); FFSPrint((DBG_INFO, "DirtyLba = %I64xh\n", DirtyLba)); FFSPrint((DBG_INFO, "DirtyLen = %I64xh\n\n", DirtyLength)); } FFSBreakPoint(); } #endif FsRtlUninitializeLargeMcb(&(Vcb->DirtyMcbs)); FFSFreeMcbTree(Vcb->McbTree); if (Vcb->ffs_super_block) { ExFreePool(Vcb->ffs_super_block); Vcb->ffs_super_block = NULL; } ExDeleteResourceLite(&Vcb->McbResource); ExDeleteResourceLite(&Vcb->PagingIoResource); ExDeleteResourceLite(&Vcb->MainResource); IoDeleteDevice(Vcb->DeviceObject); }