⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inode.c

📁 模拟linux的ext3文件系统。采用位图法。用一个文件模拟硬盘。实现创建、删除目录、文件。读、写文件
💻 C
字号:
#include"structure.h"u16 new_inode(){ u16 ret; u8 i,j; u8 a,b; u8 buffer[512]; fseek(FS,INODE_BITMAP,SEEK_SET); fread(buffer,sizeof(u8),512,FS); b=0; for(i=0;i<512;i++){     a=b^buffer[i];     if(a!=0xff)  break; } if(i==512)  ret=0; else{     for(j=0;j<8;j++){              a=pow(2,(7-j));              b=a|buffer[i];              if(b!=buffer[i]) break;     }     buffer[i]=b;     fseek(FS,INODE_BITMAP,SEEK_SET);     fwrite(buffer,sizeof(u8),512,FS);          ret=i*8+j; }     // if(ret)  update_inode_entry(&inode,ret); return ret;}void free_inode(u16 inode){ u8 i,j,temp; u8 buffer[512]; fseek(FS,INODE_BITMAP,SEEK_SET); fread(buffer,sizeof(u8),512,FS); i=inode/8; j=inode%8; temp=pow(2,(7-j)); buffer[i]=temp^buffer[i]; fseek(FS,INODE_BITMAP,SEEK_SET); fwrite(buffer,sizeof(u8),512,FS); fclose(FS); FS=fopen("FS","r+");}u16 test_inode(u16 inode){ u8 i,j,a,b; u8 buffer[512]; fseek(FS,INODE_BITMAP,SEEK_SET); fread(buffer,sizeof(u8),512,FS); i=inode/8; j=inode%8; a=pow(2,(7-j)); b=a|buffer[i]; if(b!=buffer[i])  return 0; return 1;}int update_group_desc(struct ext2_group_desc *group_desc){ u8 buffer[512]={0,}; buffer[16]=group_desc->bg_block_bitmap; buffer[18]=group_desc->bg_inode_bitmap; buffer[20]=group_desc->bg_inode_table; buffer[22]=group_desc->bg_free_blocks_count%0x100; buffer[23]=group_desc->bg_free_blocks_count/0x100; buffer[24]=group_desc->bg_free_inodes_count%0x100; buffer[25]=group_desc->bg_free_inodes_count/0x100; buffer[26]=group_desc->bg_used_dirs_count%0x100; buffer[27]=group_desc->bg_used_dirs_count/0x100; fseek(FS,0,SEEK_SET); fwrite(buffer,sizeof(u8),512,FS); fclose(FS); FS=fopen("FS","r+"); return 1;}int reload_group_desc(struct ext2_group_desc *group_desc){ u8 i; u8 buffer[512]; if(FS==NULL) printf("FS not exits or not format \n"); fseek(FS,0,SEEK_SET); fread(buffer,sizeof(u8),512,FS); for(i=0;i<16;i++)  group_desc->bg_volume_name[i]=buffer[i]; group_desc->bg_block_bitmap=buffer[16]; group_desc->bg_inode_bitmap=buffer[18]; group_desc->bg_inode_table=buffer[20]; group_desc->bg_free_blocks_count=buffer[23]*0x100+buffer[22]; group_desc->bg_free_inodes_count=buffer[25]*0x100+buffer[24]; group_desc->bg_used_dirs_count=buffer[26]; return 1;}int load_inode_entry(struct ext2_inode *inode,u16 num_inode){ u8  i; u8  buffer[512]; u32 addr_inode; addr_inode=INODE_TABLE+num_inode*64; fseek(FS,addr_inode,SEEK_SET); fread(buffer,sizeof(u8),512,FS); inode->i_mode=buffer[1]*0x100+buffer[0]; inode->i_blocks=buffer[3]*0x100+buffer[2]; inode->i_size=buffer[7]*0x1000000+buffer[6]*0x10000+buffer[5]*0x100+buffer[4]; inode->i_atime=buffer[11]*0x1000000+buffer[10]*0x10000+buffer[9]*0x100+buffer[8]; inode->i_ctime=buffer[15]*0x1000000+buffer[14]*0x10000+buffer[13]*0x100+buffer[12]; inode->i_mtime=buffer[19]*0x1000000+buffer[18]*0x10000+buffer[17]*0x100+buffer[16]; inode->i_dtime=buffer[23]*0x1000000+buffer[22]*0x10000+buffer[21]*0x100+buffer[20]; for(i=0;i<8;i++)          inode->i_block[i]=buffer[24+i*2+1]*0x100+buffer[24+i*2]; return 1;}int update_inode_entry(struct ext2_inode *inode,u16 num_inode){ u8 i; u8 buffer[512]; u32 addr_inode; addr_inode=INODE_TABLE+num_inode*64; buffer[0]=inode->i_mode%0x100; buffer[1]=inode->i_mode/0x100; buffer[2]=inode->i_blocks%0x100; buffer[3]=inode->i_blocks/0x100; buffer[4]=inode->i_size%0x100; buffer[5]=(inode->i_size%0x10000)/0x100; buffer[6]=(inode->i_size%0x1000000)/0x10000; buffer[7]=(inode->i_size%0x100000000)/0x1000000; buffer[8]=inode->i_atime%0x100; buffer[9]=(inode->i_atime%0x10000)/0x100; buffer[10]=(inode->i_atime%0x1000000)/0x10000; buffer[11]=(inode->i_atime%0x100000000)/0x1000000; buffer[12]=inode->i_ctime%0x100; buffer[13]=(inode->i_ctime%0x10000)/0x100; buffer[14]=(inode->i_ctime%0x1000000)/0x10000; buffer[15]=(inode->i_ctime%0x100000000)/0x1000000; buffer[16]=inode->i_mtime%0x100; buffer[17]=(inode->i_mtime%0x10000)/0x100; buffer[18]=(inode->i_mtime%0x1000000)/0x10000; buffer[19]=(inode->i_mtime%0x100000000)/0x1000000; buffer[20]=inode->i_dtime%0x100; buffer[21]=(inode->i_dtime%0x10000)/0x100; buffer[22]=(inode->i_dtime%0x1000000)/0x10000; buffer[23]=(inode->i_dtime%0x100000000)/0x1000000; for(i=0;i<8;i++)  {buffer[24+i*2]=inode->i_block[i]%0x100; buffer[24+i*2+1]=inode->i_block[i]/0x100;} fseek(FS,addr_inode,SEEK_SET); fwrite(buffer,sizeof(u8),512,FS); fclose(FS); FS=fopen("FS","r+");  return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -