Newer
Older
vvd / src / vdisk / fmt / vhdx.c
@dd86k dd86k on 27 Apr 2021 1 KB swap error macro
#include "vdisk/vdisk.h"
#include "utils/bin.h"
#include "utils/platform.h"
#include <assert.h>

int vdisk_vhdx_open(VDISK *vd, uint32_t flags, uint32_t internal) {
	assert(0); //TODO: Continue VHDX

	if ((vd->meta = malloc(VHDX_META_ALLOC)) == NULL)
		return VDISK_ERROR(vd, VVD_ENOMEM);

	//TODO: Check both headers and regions before doing an error

	//
	// Headers
	//

	if (os_fread(vd->fd, &vd->vhdx->hdr, sizeof(VHDX_HDR)))
		return VDISK_ERROR(vd, VVD_EOS);
	if (vd->vhdx->hdr.magic != VHDX_MAGIC)
		return VDISK_ERROR(vd, VVD_EVDMAGIC);

	if (os_fseek(vd->fd, VHDX_HEADER1_LOC, SEEK_SET))
		return VDISK_ERROR(vd, VVD_EOS);
	if (os_fread(vd->fd, &vd->vhdx->v1, sizeof(VHDX_HEADER1)))
		return VDISK_ERROR(vd, VVD_EOS);

	if (os_fseek(vd->fd, VHDX_HEADER2_LOC, SEEK_SET))
		return VDISK_ERROR(vd, VVD_EOS);
	if (os_fread(vd->fd, &vd->vhdx->v1_2, sizeof(VHDX_HEADER1)))
		return VDISK_ERROR(vd, VVD_EOS);

	if (vd->vhdx->v1.magic != VHDX_HDR1_MAGIC || vd->vhdx->v1_2.magic != VHDX_HDR1_MAGIC)
		return VDISK_ERROR(vd, VVD_EVDMAGIC);
	if (vd->vhdx->v1.version != 1 || vd->vhdx->v1_2.version != 1)
		return VDISK_ERROR(vd, VVD_EVDVERSION);

	//
	// Regions
	//

	if (os_fseek(vd->fd, VHDX_REGION1_LOC, SEEK_SET))
		return VDISK_ERROR(vd, VVD_EOS);
	if (os_fread(vd->fd, &vd->vhdx->reg, sizeof(VHDX_REGION_HDR)))
		return VDISK_ERROR(vd, VVD_EOS);
	if (vd->vhdx->reg.magic != VHDX_REGION_MAGIC)
		return VDISK_ERROR(vd, VVD_EVDMAGIC);

	//
	//TODO: Log
	//

	//
	// BAT
	//
	
	// Chunk ratio
	//(8388608 * ) / // 8 KiB * 512
	
	return 0;
}