Newer
Older
vvd / src / vdisk / vmdk.h
@dd86k dd86k on 9 Nov 2019 1 KB INIT
#include <stdint.h>

enum {
	VDMK_COMPRESSED = 0x10000, // Flag[BIN_FLENGTH]
	VMDK_2G_SPLIT_SIZE = 2047 * 1024 * 1024, // 64K Grain size *512 (2G)
};
enum {
	VMDK_MARKER_EOS	= 0,	// end-of-stream
	VMDK_MARKER_GT	= 1,	// grain table marker
	VMDK_MARKER_GD	= 2,	// grain directory marker
	VMDK_MARKER_FOOTER	= 3,	// footer marker

	VMDK_DISK_DYN	= 1,	// (SELF DEFINED) A.K.A. Sparse
	VMDK_DISK_FIXED	= 2,	// (SELF DEFINED) 
};

typedef struct VMDK_HDR {
	uint32_t magicNumber;
	uint32_t version;
	uint32_t flags;
	uint64_t capacity; // in sectors
	uint64_t grainSize;
	uint64_t descriptorOffset;
	uint64_t descriptorSize;
	uint32_t numGTEsPerGT;
	uint64_t rgdOffset;
	uint64_t gdOffset;
	uint64_t overHead;
	uint8_t  uncleanShutdown;	// "Bool"
	uint8_t  singleEndLineChar;	// usually '\n'
	uint8_t  nonEndLineChar;	// usually ' '
	uint8_t  doubleEndLineChar1;	// usually '\r'
	uint8_t  doubleEndLineChar2;	// usually '\n'
	uint16_t compressAlgorithm;
	uint8_t  pad[433];
} VMDK_HDR; // 512 bytes then 10 KiB of text buffer

typedef struct VMDK_MARKER {
	uint64_t uSector;
	uint32_t cbSize;
	uint32_t uType;
	uint8_t  pad[496];
} VMDK_MARKER;

struct VDISK;

/**
 * Print VMDK information to stdout.
 */
void vmdk_info(struct VDISK *vd);