Newer
Older
vvd / src / vdisk / vhd.c
@dd86k dd86k on 9 Nov 2019 1 KB INIT
#include <stdio.h>
#include <inttypes.h> // PRIxxx
#include "../vdisk.h"
#include "../fs/mbr.h"
#include "../utils.h"

void vhd_info(VDISK *vd) { // big-endian
	char sizec[BIN_FLENGTH], sizeo[BIN_FLENGTH], uuid[GUID_TEXT_SIZE];
	char *type, *os;

	switch (vd->vhd.type) {
	case VHD_DISK_FIXED:	type = "fixed"; break;
	case VHD_DISK_DYN:	type = "dynamic"; break;
	case VHD_DISK_DIFF:	type = "differencing"; break;
	default:
		type = vd->vhd.type <= 6 ? "reserved (deprecated)" : "unknown";
	}

	switch (vd->vhd.creator_os) {
	case VHD_OS_WIN:	os = "Windows"; break;
	case VHD_OS_MAC:	os = "macOS"; break;
	default:	os = "unknown"; break;
	}

	uuid_tostr(uuid, &vd->vhd.uuid);
	fbins(vd->vhd.size_current, sizec);
	fbins(vd->vhd.size_original, sizeo);
	printf(
		"Conectix/Microsoft VHD vdisk v%u.%u, %s %s/%s, %.4s v%u.%u on %s\n"
		"Cylinders: %u, Heads: %u, Sectors: %u\n"
		"CRC32: %08X, UUID: %s\n"
		,
		vd->vhd.major, vd->vhd.minor, type, sizec, sizeo,
		vd->vhd.creator_app, vd->vhd.creator_major, vd->vhd.creator_minor, os,
		vd->vhd.cylinders, vd->vhd.heads, vd->vhd.sectors,
		vd->vhd.checksum,
		uuid
	);
	if (vd->vhd.type != VHD_DISK_FIXED) {
		char paruuid[GUID_TEXT_SIZE];
		uuid_tostr(paruuid, &vd->vhddyn.parent_uuid);
		printf(
			"Dynamic header v%u.%u, data: %" PRIu64 ", table: %" PRIu64 "\n"
			"Blocksize: %u, checksum: %08X\n"
			"Parent UUID: %s, Parent timestamp: %u\n"
			"%u BAT Entries, %u maximum BAT entries\n"
			,
			vd->vhddyn.minor, vd->vhddyn.major,
			vd->vhddyn.data_offset, vd->vhddyn.table_offset,
			vd->vhddyn.blocksize, vd->vhddyn.checksum,
			paruuid, vd->vhddyn.parent_timestamp,
			vd->u32nblocks, vd->vhddyn.max_entries
		);
	}
	if (vd->vhd.savedState)
		puts("+ Saved state");
}