cn_t write_file_record (cn_t lcn, cn_t vcn, file_record* fd ){ cn_t lcn_written; if(lcn>MFT_VCN){ lcn_written = vcn_to_lcn(lcn,vcn); write_cluster(lcn_written, (u_int8_t*)fd); return lcn_written; } lcn_written = vcn_to_lcn(MFT_VCN, vcn); write_cluster(lcn_written, (u_int8_t*)fd); return lcn_written; }
static int write_header(struct ghostfs *gfs, struct cluster *cluster0) { MD5_CTX md5_ctx; unsigned char md5[16]; int ret; MD5_Init(&md5_ctx); MD5_Update(&md5_ctx, &gfs->hdr, sizeof(gfs->hdr)); MD5_Update(&md5_ctx, cluster0, sizeof(*cluster0)); MD5_Final(md5, &md5_ctx); // write md5 of header+root ret = stegger_write(gfs->stegger, md5, sizeof(md5), 0); if (ret < 0) return ret; // write header ret = stegger_write(gfs->stegger, &gfs->hdr, sizeof(gfs->hdr), 16); if (ret < 0) return ret; // write first cluster ret = write_cluster(gfs, cluster0, 0); if (ret < 0) return ret; return 0; }
int ghostfs_sync(struct ghostfs *gfs) { struct cluster *c; int ret, i; ret = cluster_get(gfs, 0, &c); if (ret < 0) return ret; ret = write_header(gfs, c); if (ret < 0) return ret; if (!gfs->clusters) // nothing more to sync return 0; for (i = 1; i < gfs->hdr.cluster_count; i++) { c = gfs->clusters[i]; if (!c || !cluster_dirty(c)) continue; ret = write_cluster(gfs, c, i); if (ret < 0) return ret; } return 0; }
// create a new filesystem int ghostfs_format(struct stegger *stegger) { struct ghostfs gfs; size_t count; struct cluster cluster; int ret, i; const int HEADER_SIZE = 16 + sizeof(struct ghostfs_header); gfs.stegger = stegger; if (gfs.stegger->capacity < HEADER_SIZE + CLUSTER_SIZE) return -ENOSPC; count = (gfs.stegger->capacity - HEADER_SIZE) / CLUSTER_SIZE; if (count > 0xFFFF) { warnx("fs: %lu clusters available, using only %d", count, 0xFFFF); count = 0xFFFF; } gfs.hdr.cluster_count = count; ret = read_cluster(&gfs, &cluster, 0); if (ret < 0) return ret; cluster.hdr.next = 0; for (i = 0; i < CLUSTER_DATA; i += sizeof(struct dir_entry)) { struct dir_entry *e = (struct dir_entry *)&cluster.data[i]; e->filename[0] = '\0'; } ret = write_header(&gfs, &cluster); if (ret < 0) return ret; for (i = 1; i < count; i++) { ret = read_cluster(&gfs, &cluster, i); if (ret < 0) return ret; cluster.hdr.used = 0; ret = write_cluster(&gfs, &cluster, i); if (ret < 0) return ret; } return 0; }