www.pudn.com > vdksrc.zip > vdkclose.c


/*
	vdkclose.c

	Virtual Disk close functions
	Copyright (C) 2003 Ken Kato
*/

#include "vdkbase.h"
#include "vdkutil.h"
#include "vdkfile.h"
#include "vdkaccess.h"

#include "cowdisk.h"
#include "vmdisk.h"

//
//	local functions
//
static VOID	VdkFreeCowdParam(
	PVDK_COWD_PARAM	CowdParam);

static VOID	VdkFreeVmdkParam(
	PVDK_VMDK_PARAM	VmdkParam);

//
//	declare pageable functions
//
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, VdkCloseDisk)
#pragma alloc_text(PAGE, VdkFreeCowdParam)
#pragma alloc_text(PAGE, VdkFreeVmdkParam)
#endif	// ALLOC_PRAGMA

//
// Close all files and release resources
//
VOID VdkCloseDisk(
	PVDK_DISK_INFO	DiskInfo)
{
	ULONG idx;

	if (DiskInfo) {
		if (DiskInfo->Files) {
			for (idx = 0; idx < DiskInfo->FilesTotal; idx++) {

				VDKTRACE(VDKCLOSE | VDKINFO, ("[VDK] Cleaning up File #%u\n", idx));

				if (DiskInfo->Files[idx].FileHandle) {
					VdkCloseFile(DiskInfo->Files[idx].FileHandle);
				}

				if (DiskInfo->Files[idx].FileType == VDK_FILETYPE_COWD) {
					VdkFreeCowdParam(DiskInfo->Files[idx].prm.cowd);
				}
				else if (DiskInfo->Files[idx].FileType == VDK_FILETYPE_VMDK) {
					VdkFreeVmdkParam(DiskInfo->Files[idx].prm.vmdk);
				}
			}

			VDKTRACE(VDKCLOSE | VDKINFO, ("[VDK] Freeing DiskInfo->Files\n"));

			VdkFreeMem(DiskInfo->Files);
		}

		if (DiskInfo->NameBuffer) {

			VDKTRACE(VDKCLOSE | VDKINFO, ("[VDK] Freeing FileNames buffer\n"));

			VdkFreeMem(DiskInfo->NameBuffer);
		}

		VdkZeroMem(DiskInfo, sizeof(VDK_DISK_INFO));
	}
}

//
//	Release COWD parameter
//
VOID VdkFreeCowdParam(
	PVDK_COWD_PARAM CowdParam)
{
	if (CowdParam) {

		VDKTRACE(VDKCLOSE | VDKINFO, ("[VDK] Freeing COWD param.\n"));

		if (CowdParam->PrimaryMap) {
			VdkFreeMem(CowdParam->PrimaryMap);
		}

		if (CowdParam->SecondaryMap) {
			VdkFreeMem(CowdParam->SecondaryMap);
		}

		if (CowdParam->Sector0) {
			VdkFreeMem(CowdParam->Sector0);
		}

		VdkFreeMem(CowdParam);
	}
}

//
//	Release VMDK parameter
//
VOID VdkFreeVmdkParam(
	PVDK_VMDK_PARAM VmdkParam)
{
	if (VmdkParam) {

		VDKTRACE(VDKCLOSE | VDKINFO, ("[VDK] Freeing VMDK param.\n"));

		if (VmdkParam->PrimaryDirectory) {
			VdkFreeMem(VmdkParam->PrimaryDirectory);
		}

		if (VmdkParam->BackupDirectory) {
			VdkFreeMem(VmdkParam->BackupDirectory);
		}

		if (VmdkParam->GrainTable) {
			VdkFreeMem(VmdkParam->GrainTable);
		}

		VdkFreeMem(VmdkParam);
	}
}