static int test_HPFS(disk_t *disk_car,const struct fat_boot_sector *hpfs_header, partition_t *partition,const int verbose, const int dump_ind) { const char*buffer=(const char*)hpfs_header; if(le16(hpfs_header->marker)==0xAA55) { if(memcmp(buffer+OS2_NAME,"IBM",3)==0) { /* D'apres une analyse de OS2 sur systeme FAT... FAT_NAME1=FAT */ if(verbose||dump_ind) { log_info("\nHPFS maybe at %u/%u/%u\n", offset2cylinder(disk_car,partition->part_offset), offset2head(disk_car,partition->part_offset), offset2sector(disk_car,partition->part_offset)); } if(dump_ind!=0) dump_log(buffer, DEFAULT_SECTOR_SIZE); partition->part_size=(uint64_t)(fat_sectors(hpfs_header)>0?fat_sectors(hpfs_header):le32(hpfs_header->total_sect)) * fat_sector_size(hpfs_header); partition->upart_type=UP_HPFS; return 0; } } /* fin marqueur de fin :)) */ return 1; }
int log_fat2_info(const struct fat_boot_sector*fh1, const struct fat_boot_sector*fh2, const upart_type_t upart_type, const unsigned int sector_size) { switch(upart_type) { case UP_FAT12: log_info("\nFAT12\n"); break; case UP_FAT16: log_info("\nFAT16\n"); break; case UP_FAT32: log_info("\nFAT32\n"); break; default: return 1; } log_info("sector_size %u %u\n", fat_sector_size(fh1),fat_sector_size(fh2)); log_info("cluster_size %u %u\n", fh1->sectors_per_cluster,fh2->sectors_per_cluster); log_info("reserved %u %u\n", le16(fh1->reserved),le16(fh2->reserved)); log_info("fats %u %u\n", fh1->fats,fh2->fats); log_info("dir_entries %u %u\n", get_dir_entries(fh1),get_dir_entries(fh2)); log_info("sectors %u %u\n", fat_sectors(fh1),fat_sectors(fh2)); log_info("media %02X %02X\n", fh1->media,fh2->media); log_info("fat_length %u %u\n", le16(fh1->fat_length),le16(fh2->fat_length)); log_info("secs_track %u %u\n", le16(fh1->secs_track),le16(fh2->secs_track)); log_info("heads %u %u\n", le16(fh1->heads),le16(fh2->heads)); log_info("hidden %u %u\n", (unsigned int)le32(fh1->hidden),(unsigned int)le32(fh2->hidden)); log_info("total_sect %u %u\n", (unsigned int)le32(fh1->total_sect),(unsigned int)le32(fh2->total_sect)); if(upart_type==UP_FAT32) { log_info("fat32_length %u %u\n", (unsigned int)le32(fh1->fat32_length),(unsigned int)le32(fh2->fat32_length)); log_info("flags %04X %04X\n", le16(fh1->flags),le16(fh2->flags)); log_info("version %u.%u %u.%u\n", fh1->version[0], fh1->version[1],fh2->version[0], fh2->version[1]); log_info("root_cluster %u %u\n", (unsigned int)le32(fh1->root_cluster),(unsigned int)le32(fh2->root_cluster)); log_info("info_sector %u %u\n", le16(fh1->info_sector),le16(fh2->info_sector)); log_info("backup_boot %u %u\n", le16(fh1->backup_boot),le16(fh2->backup_boot)); log_info("free_count "); if(fat32_get_free_count((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) log_info("uninitialised "); else log_info("%lu ",fat32_get_free_count((const unsigned char*)fh1,sector_size)); if(fat32_get_free_count((const unsigned char*)fh2,sector_size)==0xFFFFFFFF) log_info("uninitialised"); else log_info("%lu",fat32_get_free_count((const unsigned char*)fh2,sector_size)); log_info("\nnext_free "); if(fat32_get_next_free((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) log_info("uninitialised "); else log_info("%lu ",fat32_get_next_free((const unsigned char*)fh1,sector_size)); if(fat32_get_next_free((const unsigned char*)fh2,sector_size)==0xFFFFFFFF) log_info("uninitialised\n"); else log_info("%lu\n",fat32_get_next_free((const unsigned char*)fh2,sector_size)); } return 0; }
int dump_2fat_info_ncurses(const struct fat_boot_sector*fh1, const struct fat_boot_sector*fh2, const upart_type_t upart_type, const unsigned int sector_size) { switch(upart_type) { case UP_FAT12: wprintw(stdscr,"FAT : 12\n"); break; case UP_FAT16: wprintw(stdscr,"FAT : 16\n"); break; case UP_FAT32: wprintw(stdscr,"FAT : 32\n"); break; default: wprintw(stdscr,"Not a FAT\n"); return 1; } wprintw(stdscr,"cluster_size %u %u\n", fh1->sectors_per_cluster, fh2->sectors_per_cluster); wprintw(stdscr,"reserved %u %u\n", le16(fh1->reserved),le16(fh2->reserved)); if(fat_sectors(fh1)!=0 || fat_sectors(fh2)!=0) wprintw(stdscr,"sectors %u %u\n", fat_sectors(fh1), fat_sectors(fh2)); if(le32(fh1->total_sect)!=0 || le32(fh2->total_sect)!=0) wprintw(stdscr,"total_sect %u %u\n", (unsigned int)le32(fh1->total_sect), (unsigned int)le32(fh2->total_sect)); if(upart_type==UP_FAT32) { wprintw(stdscr,"fat32_length %u %u\n", (unsigned int)le32(fh1->fat32_length), (unsigned int)le32(fh2->fat32_length)); wprintw(stdscr,"root_cluster %u %u\n", (unsigned int)le32(fh1->root_cluster), (unsigned int)le32(fh2->root_cluster)); wprintw(stdscr,"free_count "); if(fat32_get_free_count((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) wprintw(stdscr,"uninitialised "); else wprintw(stdscr,"%lu ",fat32_get_free_count((const unsigned char*)fh1,sector_size)); if(fat32_get_free_count((const unsigned char*)fh2,sector_size)==0xFFFFFFFF) wprintw(stdscr,"uninitialised\n"); else wprintw(stdscr,"%lu\n",fat32_get_free_count((const unsigned char*)fh2,sector_size)); wprintw(stdscr,"next_free "); if(fat32_get_next_free((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) wprintw(stdscr,"uninitialised "); else wprintw(stdscr,"%lu ",fat32_get_next_free((const unsigned char*)fh1,sector_size)); if(fat32_get_next_free((const unsigned char*)fh2,sector_size)==0xFFFFFFFF) wprintw(stdscr,"uninitialised\n"); else wprintw(stdscr,"%lu\n",fat32_get_next_free((const unsigned char*)fh2,sector_size)); } else { wprintw(stdscr,"fat_length %u %u\n", le16(fh1->fat_length), le16(fh2->fat_length)); wprintw(stdscr,"dir_entries %u %u\n", get_dir_entries(fh1), get_dir_entries(fh2)); } return 0; }
static int log_fat_info(const struct fat_boot_sector*fh1, const upart_type_t upart_type, const unsigned int sector_size) { log_info("sector_size %u\n", fat_sector_size(fh1)); log_info("cluster_size %u\n", fh1->sectors_per_cluster); log_info("reserved %u\n", le16(fh1->reserved)); log_info("fats %u\n", fh1->fats); log_info("dir_entries %u\n", get_dir_entries(fh1)); log_info("sectors %u\n", fat_sectors(fh1)); log_info("media %02X\n", fh1->media); log_info("fat_length %u\n", le16(fh1->fat_length)); log_info("secs_track %u\n", le16(fh1->secs_track)); log_info("heads %u\n", le16(fh1->heads)); log_info("hidden %u\n", (unsigned int)le32(fh1->hidden)); log_info("total_sect %u\n", (unsigned int)le32(fh1->total_sect)); if(upart_type==UP_FAT32) { log_info("fat32_length %u\n", (unsigned int)le32(fh1->fat32_length)); log_info("flags %04X\n", le16(fh1->flags)); log_info("version %u.%u\n", fh1->version[0], fh1->version[1]); log_info("root_cluster %u\n", (unsigned int)le32(fh1->root_cluster)); log_info("info_sector %u\n", le16(fh1->info_sector)); log_info("backup_boot %u\n", le16(fh1->backup_boot)); if(fat32_get_free_count((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) log_info("free_count uninitialised\n"); else log_info("free_count %lu\n",fat32_get_free_count((const unsigned char*)fh1,sector_size)); if(fat32_get_next_free((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) log_info("next_free uninitialised\n"); else log_info("next_free %lu\n",fat32_get_next_free((const unsigned char*)fh1,sector_size)); } return 0; }
int fat_init(struct ptable_entry *part, struct fat_part_desc *desc) { char tmpb[512]; block_read_lba(part->start_lba, tmpb); kmemcpy(&desc->bootrecord, tmpb, sizeof(struct bpb)); if (kstrcmp(desc->bootrecord.OEM_ID, "mkdosfs")) return 0; /* error */ desc->root_cyl_start_lba = part->start_lba + desc->bootrecord.reserved_sectors + fat_sectors(&desc->bootrecord); desc->type = fat_version(&desc->bootrecord); desc->fat_start_lba = part->start_lba + desc->bootrecord.reserved_sectors; if (desc->type == 32) { struct fat32_ebpb *eb = (struct fat32_ebpb *)&desc->bootrecord.ebpb[0]; desc->root_cluster = eb->root_cluster; } else { desc->root_cluster = 2; } desc->fat = kmalloc(desc->bootrecord.sectors_pr_FAT * sizeof(long *)); if (desc->fat == NULL) return 1; return 1; }
int dump_fat_info_ncurses(const struct fat_boot_sector*fh1, const upart_type_t upart_type, const unsigned int sector_size) { switch(upart_type) { case UP_FAT12: wprintw(stdscr,"FAT : 12\n"); break; case UP_FAT16: wprintw(stdscr,"FAT : 16\n"); break; case UP_FAT32: wprintw(stdscr,"FAT : 32\n"); break; default: wprintw(stdscr,"Not a FAT\n"); return 0; } wprintw(stdscr,"cluster_size %u\n", fh1->sectors_per_cluster); wprintw(stdscr,"reserved %u\n", le16(fh1->reserved)); if(fat_sectors(fh1)!=0) wprintw(stdscr,"sectors %u\n", fat_sectors(fh1)); if(le32(fh1->total_sect)!=0) wprintw(stdscr,"total_sect %u\n", (unsigned int)le32(fh1->total_sect)); if(upart_type==UP_FAT32) { wprintw(stdscr,"fat32_length %u\n", (unsigned int)le32(fh1->fat32_length)); wprintw(stdscr,"root_cluster %u\n", (unsigned int)le32(fh1->root_cluster)); wprintw(stdscr,"flags %04X\n", le16(fh1->flags)); wprintw(stdscr,"version %u.%u\n", fh1->version[0], fh1->version[1]); wprintw(stdscr,"root_cluster %u\n", (unsigned int)le32(fh1->root_cluster)); wprintw(stdscr,"info_sector %u\n", le16(fh1->info_sector)); wprintw(stdscr,"backup_boot %u\n", le16(fh1->backup_boot)); if(fat32_get_free_count((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) wprintw(stdscr,"free_count uninitialised\n"); else wprintw(stdscr,"free_count %lu\n",fat32_get_free_count((const unsigned char*)fh1,sector_size)); if(fat32_get_next_free((const unsigned char*)fh1,sector_size)==0xFFFFFFFF) wprintw(stdscr,"next_free uninitialised\n"); else wprintw(stdscr,"next_free %lu\n",fat32_get_next_free((const unsigned char*)fh1,sector_size)); } else { wprintw(stdscr,"fat_length %u\n", le16(fh1->fat_length)); wprintw(stdscr,"dir_entries %u\n", get_dir_entries(fh1)); } return 0; }