static int vhd_journal_disable_vhd(vhd_journal_t *j) { int err; vhd_context_t *vhd; vhd = &j->vhd; err = vhd_get_footer(vhd); if (err) return err; memcpy(&vhd->footer.cookie, VHD_POISON_COOKIE, sizeof(vhd->footer.cookie)); vhd->footer.checksum = vhd_checksum_footer(&vhd->footer); err = vhd_write_footer(vhd, &vhd->footer); if (err) return err; return 0; }
static void vhd_print_footer(vhd_footer_t *f, int hex) { uint64_t c, h, s; uint32_t ff_maj, ff_min, cr_maj, cr_min, cksm; char time_str[26], creator[5], uuid[37], cookie[9]; printf("VHD Footer Summary:\n-------------------\n"); snprintf(cookie, 9, "%s", f->cookie); printf("Cookie : %s\n", cookie); printf("Features : (0x%08x) %s%s\n", f->features, (f->features & HD_TEMPORARY) ? "<TEMP>" : "", (f->features & HD_RESERVED) ? "<RESV>" : ""); ff_maj = f->ff_version >> 16; ff_min = f->ff_version & 0xffff; printf("File format version : Major: %d, Minor: %d\n", ff_maj, ff_min); printf("Data offset : %s\n", conv(hex, f->data_offset)); vhd_time_to_string(f->timestamp, time_str); printf("Timestamp : %s\n", time_str); memcpy(creator, f->crtr_app, 4); creator[4] = '\0'; printf("Creator Application : '%s'\n", creator); cr_maj = f->crtr_ver >> 16; cr_min = f->crtr_ver & 0xffff; printf("Creator version : Major: %d, Minor: %d\n", cr_maj, cr_min); printf("Creator OS : %s\n", ((f->crtr_os == HD_CR_OS_WINDOWS) ? "Windows" : ((f->crtr_os == HD_CR_OS_MACINTOSH) ? "Macintosh" : "Unknown!"))); printf("Original disk size : %s MB ", conv(hex, f->orig_size >> 20)); printf("(%s Bytes)\n", conv(hex, f->orig_size)); printf("Current disk size : %s MB ", conv(hex, f->curr_size >> 20)); printf("(%s Bytes)\n", conv(hex, f->curr_size)); c = f->geometry >> 16; h = (f->geometry & 0x0000FF00) >> 8; s = f->geometry & 0x000000FF; printf("Geometry : Cyl: %s, ", conv(hex, c)); printf("Hds: %s, ", conv(hex, h)); printf("Sctrs: %s\n", conv(hex, s)); printf(" : = %s MB ", conv(hex, (c * h * s) >> 11)); printf("(%s Bytes)\n", conv(hex, c * h * s << 9)); printf("Disk type : %s\n", f->type <= HD_TYPE_MAX ? hd_type_str[f->type] : "Unknown type!\n"); cksm = vhd_checksum_footer(f); printf("Checksum : 0x%x|0x%x (%s)\n", f->checksum, cksm, f->checksum == cksm ? "Good!" : "Bad!"); uuid_unparse(f->uuid, uuid); printf("UUID : %s\n", uuid); printf("Saved state : %s\n", f->saved == 0 ? "No" : "Yes"); printf("Hidden : %d\n", f->hidden); printf("\n"); }