Finished with Diskwrite tool, will expand as needed
This commit is contained in:
parent
fb86a312bd
commit
cf11060afe
|
|
@ -120,7 +120,9 @@ void write_cluster_value(fat_info *info, uint32_t value, uint32_t cluster){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int write_file(char *path, fat_info *info, FILE *file){
|
int read_file(fat_info *info, uint32_t first_cluster, file_t *file, buffer_t *buffer, FILE *disk);
|
||||||
|
|
||||||
|
int create_file(char *path, fat_info *info, FILE *file){
|
||||||
FILE *ifile = fopen(path, "r");
|
FILE *ifile = fopen(path, "r");
|
||||||
if(!ifile){
|
if(!ifile){
|
||||||
printf("Failed to open file: %s\nAborting...\n", path);
|
printf("Failed to open file: %s\nAborting...\n", path);
|
||||||
|
|
@ -140,13 +142,14 @@ int write_file(char *path, fat_info *info, FILE *file){
|
||||||
}
|
}
|
||||||
//create file in root dir
|
//create file in root dir
|
||||||
file_t dirent = {0};
|
file_t dirent = {0};
|
||||||
memcpy(dirent.filename, path, 8);
|
|
||||||
int extoffset = 0;
|
int extoffset = 0;
|
||||||
while(*(path + extoffset) != '.' && *(path + extoffset)){
|
while(*(path + extoffset) != '.' && *(path + extoffset)){
|
||||||
extoffset++;
|
extoffset++;
|
||||||
}
|
}
|
||||||
|
memcpy(dirent.filename, path, 8 > extoffset ? extoffset : 8);
|
||||||
verbose && printf("File extension at %d\n", extoffset);
|
verbose && printf("File extension at %d\n", extoffset);
|
||||||
memcpy(dirent.ext, path + extoffset, 3);
|
verbose && printf("file ext: %s\n", path + extoffset);
|
||||||
|
memmove(dirent.ext, path + extoffset + 1, 3);
|
||||||
dirent.size_bytes = ifsize;
|
dirent.size_bytes = ifsize;
|
||||||
verbose && printf("Writing %u sectors\n", ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1);
|
verbose && printf("Writing %u sectors\n", ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1);
|
||||||
uint32_t last_cluster = 0;
|
uint32_t last_cluster = 0;
|
||||||
|
|
@ -164,12 +167,48 @@ int write_file(char *path, fat_info *info, FILE *file){
|
||||||
verbose && printf("last cluster: %d\n", last_cluster);
|
verbose && printf("last cluster: %d\n", last_cluster);
|
||||||
write_cluster_value(info, FILE_END, last_cluster);
|
write_cluster_value(info, FILE_END, last_cluster);
|
||||||
|
|
||||||
|
buffer_t root_dir_buffer = 0;
|
||||||
|
uint32_t dirent_count = read_file(info, info->bpb.root_dir_cluster, 0, &root_dir_buffer, file)/sizeof(file_t);
|
||||||
|
|
||||||
|
//searching for a free dirent
|
||||||
|
file_t *root_dir = (file_t *)root_dir_buffer;
|
||||||
|
uint32_t free_file_index = 0;
|
||||||
|
while(root_dir[free_file_index].filename[0] && free_file_index < dirent_count){
|
||||||
|
free_file_index++;
|
||||||
|
}
|
||||||
|
if(free_file_index >= dirent_count){
|
||||||
|
//!FIXME
|
||||||
|
verbose && printf("could not find free dirent; this will be fixed in a later version\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
root_dir[free_file_index] = dirent;
|
||||||
|
verbose && printf("Found a free dirent at index %u\n", free_file_index);
|
||||||
|
for(uint32_t i = 0; i < (dirent_count * sizeof(file_t)) / info->bpb.bytes_per_sector /info->bpb.sectors_per_cluster; i++){
|
||||||
|
write_sector(file, (info->bpb.reserved_sectors + (info->bpb.fat_count * info->bpb.sectors_per_fat) + info->file_table[i] * info->bpb.sectors_per_cluster), info->bpb.sectors_per_cluster, (buffer_t)(root_dir + i * info->bpb.sectors_per_cluster * info->bpb.bytes_per_sector));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int read_file(fat_info *info, uint32_t first_cluster, file_t *file, buffer_t buffer){
|
int read_file(fat_info *info, uint32_t first_cluster, file_t *file, buffer_t *buffer, FILE *disk){
|
||||||
|
uint32_t cluster_size_bytes = info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster;
|
||||||
if(file == 0){
|
if(file == 0){
|
||||||
buffer_t buf;
|
verbose && printf("Reading starting from cluster %d\n", first_cluster);
|
||||||
|
buffer_t buf = malloc(1);
|
||||||
|
uint32_t allocated = 0;
|
||||||
|
uint32_t cluster = first_cluster;
|
||||||
|
do {
|
||||||
|
allocated++;
|
||||||
|
buf = realloc(buf, cluster_size_bytes * allocated);
|
||||||
|
verbose && printf("Reallocated to %u, ptr: %p\n", allocated * cluster_size_bytes, buf);
|
||||||
|
read_sector(disk, info->bpb.reserved_sectors + (info->bpb.fat_count * info->bpb.sectors_per_fat) + cluster * info->bpb.sectors_per_cluster, info->bpb.sectors_per_cluster, buf + (allocated * cluster_size_bytes));
|
||||||
|
cluster = info->file_table[cluster];
|
||||||
|
}while(cluster != FILE_END);
|
||||||
|
if(*buffer != 0){
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
verbose && printf("Read %d cluster starting from cluster %d\n", allocated, first_cluster);
|
||||||
|
*buffer = buf;
|
||||||
|
return allocated * cluster_size_bytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -238,7 +277,7 @@ int main(int argc, char **argv){
|
||||||
detect_repair_fs(output_file, &info);
|
detect_repair_fs(output_file, &info);
|
||||||
verbose && printf("Finished. Exiting...\n");
|
verbose && printf("Finished. Exiting...\n");
|
||||||
for(int i = 0; i < filec; i++){
|
for(int i = 0; i < filec; i++){
|
||||||
write_file(files[i], &info, output_file);
|
create_file(files[i], &info, output_file);
|
||||||
}
|
}
|
||||||
fat_write_back(output_file, &info);
|
fat_write_back(output_file, &info);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue