// ext2 minidriver // based on osdev wiki article: http://wiki.osdev.org/Ext2 #include #include #include "fs.h" #include "ext2.h" typedef struct ext2_superblock_struct { uint32_t inodes_count; uint32_t blocks_count; uint32_t blocks_reserved_count; uint32_t inodes_unalloc_count; uint32_t blocks_unalloc_count; uint32_t superblock_number; uint32_t block_size; uint32_t fragment_size; uint32_t blocks_per_group; uint32_t fragments_per_group; uint32_t inodes_per_group; uint8_t skip[12]; // maybe we will look at these fields later... uint16_t ext2_sig; // 0xef5 uint16_t fs_state; uint16_t error_handle; uint16_t version_minor; uint8_t skip2[8]; // maybe we will look at these fields later... uint32_t os_id; uint32_t version_major; uint16_t uid_reserved; uint16_t gid_reserved; }ext2_superblock; typedef struct ext2_superblock_ext_struct { uint32_t first_inode; uint16_t size_inode; uint16_t blockgroup; uint32_t features_opt; uint32_t features_req; uint32_t features_write; uint32_t blkid[4]; char vol_name[16]; char last_path[64]; uint32_t compression; uint8_t prealloc_files; uint8_t prealloc_dirs; uint8_t unused[2]; uint32_t journalid[4]; uint32_t journal_inode; uint32_t journal_device; uint32_t orpan_head; }ext2_superblock_ext; typedef struct ext2_blockgroup_desc_struct { uint32_t addr_block_bitmap; uint32_t addr_inode_bitmap;; uint32_t addr_inode_table; uint16_t unalloc_blocks_count; uint16_t unalloc_inodes_count; uint16_t dir_count; uint8_t unused[14]; }ext2_blockgroup_desc; typedef struct ext2_dir_struct { uint32_t inode; uint16_t size; uint8_t name_length_low; uint8_t name_length_high; // name follows }ext2_dir; typedef struct ext2_inode_struct { uint16_t permissions; uint16_t user_id; uint32_t size_low; uint32_t skip[4]; uint16_t group_id; uint16_t hardlink_count; uint32_t disk_sectors; uint32_t flags; uint32_t os_specific; uint32_t direct_pointer[12]; uint32_t indirect1; uint32_t indirect2; uint32_t indirect3; uint32_t gen_num; uint32_t later1; // will be implemented later by the fooldriver uint32_t size_high; uint32_t frag; uint32_t os_spec2[3]; }ext2_inode; void ram_read(char *in,char *out,int size, int count) { for(int i=0;i0)panic(FOOLOS_MODULE_NAME,"inode with high.size unsupported, i am sorry."); while(pos> 1) + ((sum & 1) << 15); sum+=(int)*ptr; sum&=0xffff; count++; ptr++; block_counter++; pos++; if(block_counter>=block_size) { block++; if(block<12) { ptr=ext2_get_blockstart(ram,block_size,inode.direct_pointer[block]); } else if(block-12