Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.35 KB | None | 0 0
  1. void run_read(char * string, unsigned int current_cluster, int offset, int length){
  2.  
  3. unsigned int FirstSectorofCluster = getFirstSectorofCluster(current_cluster);
  4. unsigned int fatEntry = getFatEntry(current_cluster);
  5. unsigned int new_file_cluster;
  6.  
  7.  
  8. fseek(fp, FirstSectorofCluster+offset, SEEK_SET);
  9.  
  10. if(length + offset > boot_region.bytes_per_sector){
  11. fread(strlen(string)+string,(boot_region.bytes_per_sector-offset), 1, fp);
  12. printf("%.*s", length, string + offset);
  13. length = length - (boot_region.bytes_per_sector-offset);
  14. }
  15. else{
  16. fread(string, length , 1, fp);
  17. printf("%.*s\n", length, string + offset);
  18. return;
  19. }
  20.  
  21. if(fatEntry != 0x0FFFFFF8 || fatEntry != 0x0FFFFFFF || fatEntry != 0x00000000){
  22. run_read(string, fatEntry,0,length);
  23. }
  24.  
  25. }
  26.  
  27. void read(unsigned int current_cluster, char * fileName, int offset, int length) // wil
  28. {
  29. int i = 0;
  30. int flag = 0;
  31. bool found = false;
  32. char * formatString;
  33. struct FAT32Dir directory = getDirectory(current_cluster, fileName);
  34. unsigned int fatEntry = getFatEntry(current_cluster);
  35. unsigned int FirstSectorofCluster = getFirstSectorofCluster(current_cluster);
  36.  
  37.  
  38. if(offset > directory.FileSize)
  39. {
  40. printf("Error! OFFSET is larger than file size\n");
  41. return;
  42.  
  43. }
  44.  
  45.  
  46.  
  47. if(!strcmp(getFileName((char *)directory.Name), fileName)) // check if file exist
  48. {
  49. if(directory.Attr != 0x10){
  50.  
  51.  
  52. if(length > directory.FileSize || offset+length > directory.FileSize){
  53. length = directory.FileSize - offset;
  54. formatString = (char *)calloc(length+1, sizeof(char));
  55. }
  56.  
  57. //else
  58. {
  59.  
  60. for(i = 0; i < 500; i++){
  61.  
  62. if(openFiles[i].name != NULL && !strcmp(openFiles[i].name, getFileName(directory.Name))){
  63.  
  64. if(openFiles[i].mode == FILE_READ || openFiles[i].mode == FILE_READWRITE){
  65.  
  66. fatEntry = openFiles[i].first_cluster_num;
  67. flag = offset/boot_region.bytes_per_sector;
  68.  
  69. while(flag != 0){
  70. if(fatEntry == 0x00000000 || fatEntry == 0xFFFFFFF8){
  71. return;
  72. }
  73.  
  74. fatEntry = getFatEntry(fatEntry);
  75. flag--;
  76. }
  77. run_read(formatString, fatEntry, (offset%boot_region.bytes_per_sector), length);
  78. found = true;
  79. break;
  80. /*
  81. long int hex = FirstSectorofCluster + (openFiles[i].first_cluster_num - 2) * (boot_region.bytes_per_sector * boot_region.sectors_per_cluster);
  82. unsigned char buffer[5000000];
  83.  
  84. fseek(fp, hex, SEEK_SET);
  85. fread(buffer,sizeof(buffer), 1, fp);
  86. printf("%.*s\n", len, buffer + offs);
  87. */
  88. }
  89. }
  90. }
  91.  
  92. if(found == false)
  93. printf("File [%s] is not in reading mode\n", fileName);
  94. }
  95. }
  96. else
  97. printf("Error! [%s] is a directory.\n", fileName);
  98. }
  99.  
  100. else
  101. printf("Error! [%s] does not exist.\n", fileName);
  102. }
  103.  
  104.  
  105.  
  106. void run_write(unsigned int current_cluster, int offset, int len, char * string){
  107.  
  108. unsigned int FirstSectorofCluster = getFirstSectorofCluster(current_cluster);
  109. unsigned int fatEntry = getFatEntry(current_cluster);
  110. unsigned int new_file_cluster;
  111. int string_offset;
  112.  
  113.  
  114. fseek(fp, FirstSectorofCluster+offset, SEEK_SET);
  115.  
  116. if(len + offset > boot_region.bytes_per_sector){
  117. fwrite(string,boot_region.bytes_per_sector-offset, 1, fp);
  118. string_offset = (boot_region.bytes_per_sector-offset);
  119. len = len - (boot_region.bytes_per_sector-offset);
  120. }
  121. else{
  122. fwrite(string, len , 1, fp);
  123. return;
  124. }
  125.  
  126.  
  127. if(fatEntry != 0x0FFFFFF8 || fatEntry != 0x0FFFFFFF || fatEntry != 0x00000000){
  128. run_write(fatEntry, 0, len, string + string_offset);
  129. }
  130.  
  131. if(fatEntry == 0x0FFFFFF8 || fatEntry == 0x0FFFFFFF ){
  132. new_file_cluster = findEmptyCluster();
  133. linkNewCluster(current_cluster, new_file_cluster);
  134. run_write(new_file_cluster, 0, len, string+string_offset);
  135. }
  136. }
  137.  
  138. void updateDirectory(struct FAT32Dir directory, unsigned int current_cluster){
  139.  
  140. int i = 0;
  141. int next_free_cluster;
  142. struct FAT32Dir temp;
  143. unsigned int fatEntry = getFatEntry(current_cluster);
  144. unsigned int FirstSectorofCluster = getFirstSectorofCluster(current_cluster);
  145.  
  146. fseek(fp, FirstSectorofCluster, SEEK_SET);
  147.  
  148. while(i * sizeof(struct FAT32Dir) < boot_region.bytes_per_sector){
  149.  
  150. fread(&temp, sizeof(struct FAT32Dir), 1, fp);
  151.  
  152. if(!strcmp(getFileName(temp.Name), getFileName(directory.Name) )){
  153. fseek(fp, i*sizeof(struct FAT32Dir)+ FirstSectorofCluster, SEEK_SET);
  154. fwrite(&directory, sizeof(struct FAT32Dir), 1, fp);
  155. }
  156.  
  157. i++;
  158. }
  159.  
  160. if(fatEntry != 0x0FFFFFF8 &&fatEntry != 0x0FFFFFFF)
  161. updateDirectory(directory, fatEntry);
  162.  
  163. }
  164.  
  165. void write(unsigned int current_cluster, char * fileName, int offs, int len, char * string) // wil
  166. {
  167. //char * dup;
  168. int i = 0;
  169. int flag = 0;
  170. unsigned int fatEntry;
  171. char * formatString;
  172. struct FAT32Dir directory = getDirectory(current_cluster, fileName);
  173.  
  174. if(strlen(string) <= len){
  175. formatString = (char *)calloc(len, sizeof(char));
  176. strcpy(formatString, string);
  177. }
  178.  
  179. if(!strcmp(getFileName((char *)directory.Name), fileName))
  180. {
  181. if(directory.Attr != 0x10)
  182. {
  183.  
  184. if(offs > directory.FileSize)
  185. printf("Error! OFFSET is larger than file size\n");
  186.  
  187. else
  188. {
  189.  
  190. bool found = false;
  191.  
  192. for(i = 0; i < 500; i++)
  193. {
  194. if(openFiles[i].name != NULL && !strcmp(openFiles[i].name, getFileName(directory.Name)))
  195. {
  196. if(openFiles[i].mode == FILE_WRITE || openFiles[i].mode == FILE_READWRITE)
  197. {
  198. fatEntry = openFiles[i].first_cluster_num;
  199. flag = offs/boot_region.bytes_per_sector;
  200.  
  201. while(flag != 0){
  202. if(fatEntry == 0x00000000 || fatEntry == 0xFFFFFFF8){
  203. return;
  204. }
  205.  
  206. fatEntry = getFatEntry(fatEntry);
  207. flag --;
  208. }
  209. run_write(fatEntry, (offs%boot_region.bytes_per_sector), len, formatString);
  210.  
  211. if(offs + len > directory.FileSize)
  212. {
  213. directory.FileSize = directory.FileSize + (strlen(string) - directory.FileSize) + offs;
  214. directory.Attr = 0x20;
  215. updateDirectory(directory, current_cluster);
  216.  
  217. }
  218.  
  219. found = true;
  220. break;
  221. }
  222. }
  223.  
  224. if(found == false)
  225. printf("File [%s] is not in writing mode\n", fileName);
  226. }
  227. }
  228. }
  229.  
  230. else
  231. printf("Error! [%s] is a directory.\n", fileName);
  232. }
  233.  
  234. else
  235. printf("Error! [%s] does not exist.\n", fileName);
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement