Пример #1
0
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);
}
Пример #2
0
__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);
}
Пример #3
0
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);
}