Advertisement
anhkiet2507

All_FAT16

Jan 4th, 2023
1,356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <memory.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. struct BOOT {  //for FAT16
  8.     char jmp[3];
  9.     char OEM[8];
  10.     int bytes_per_sector;
  11.     char sectors_per_cluster;
  12.     int reserved;
  13.     char FAT_cnt;
  14.     int ROOT_size;
  15.     int total_sectors;
  16.     char media;
  17.     int FAT_size;
  18.     int sectors_per_track;
  19.     int head_cnt;
  20.     long hidden_sectors;
  21.     long total_sectors_long;
  22.     char unknown[3];
  23.     long serial;
  24.     char volume[11];
  25.     char FAT_type[8];
  26.     char loader[448];
  27.     char mark[2];
  28. };
  29.  
  30. struct ROOT {
  31.     char name[8];
  32.     char ext[3];
  33.     char attr;
  34.     char reserved[10];
  35.     char time[2];
  36.     char date[2];
  37.     int first_cluster;
  38.     long size;
  39. };
  40.  
  41. void main()
  42. {
  43.  
  44.     int drive = 3; //A=0, B=1, C=2, D=3 ...
  45.  
  46.     //Reading boot sector from disk D
  47.     BOOT boot;
  48.  
  49.     int res = absread(drive, 1, 0, &boot);
  50.     if(res != 0){
  51.         printf("Cannot read boot sector\n");
  52.         return;
  53.     }
  54.     printf("Reading disk parameters\n");
  55.     printf("-------------------------\n");
  56.     printf("Sector size: %d\n", boot.bytes_per_sector);
  57.     printf("FAT type:");
  58.     int i;
  59.     for(i = 0; i < 8; i++)
  60.         printf("%c", boot.FAT_type[i]);
  61.  
  62.     //Reading FAT16 table from disk D
  63.     unsigned int *fat = (unsigned int *)malloc (boot.FAT_size * boot.bytes_per_sector);
  64.     if (fat == NULL) {
  65.         printf("Not enough memory\n");
  66.         return;
  67.     }
  68.     printf("\n\n");
  69.     printf("Reading FAT16 parameters\n");
  70.     printf("-------------------------\n");
  71.     printf("FAT size: %d \n", boot.FAT_size);
  72.     printf("Reserved: %d \n", boot.reserved);
  73.  
  74.     res = absread(drive, boot.FAT_size, boot.reserved, fat);
  75.     if(res != 0){
  76.         printf("Cannot read FAT\n");
  77.         return;
  78.     }
  79.     //printing first 15 FAT cells
  80.     printf("Content of first 15 FAT cells:");
  81.     for (i = 0; i < 15; i++)
  82.         printf("%u ", fat[i]);
  83.  
  84.     //Counting number of free clusters from first 100 clusters
  85.     int free_count = 0;
  86.     for (i = 2; i < 100; i++){ //first 2 clusters are not used
  87.         if(fat[i] == 0) free_count++;
  88.     }
  89.     printf("\n");
  90.     printf("Number of free clusters from first 100 clusters:");
  91.     printf("%d\n", free_count);
  92.  
  93.     //Printing clusters of a file from cluster n
  94.     unsigned int n = 5;
  95.     unsigned int cur = n;
  96.     printf("Clusters of a file from %u: ",n);
  97.     while(cur < 0xFFF8){
  98.         printf("->%u", cur);
  99.         cur = fat[cur];
  100.     }
  101.  
  102.     //Reading ROOT from disk D
  103.     printf("\n\n");
  104.     printf("Reading ROOT information:\n");
  105.     printf("------------------------\n");
  106.  
  107.     int num_byte = boot.ROOT_size * 32;//sizeof(ROOT)
  108.  
  109.     ROOT *root = (ROOT *)malloc(num_byte);
  110.     if(root == NULL) return;
  111.  
  112.     int num_sector = num_byte / boot.bytes_per_sector;
  113.     int root_begin = boot.reserved + boot.FAT_size * boot.FAT_cnt;
  114.  
  115.     res = absread(drive, num_sector, root_begin, (void *)root);
  116.     if(res != 0){
  117.         printf("\n Cannot read ROOT\n");
  118.         return;
  119.     }
  120.  
  121.  
  122.     //Printing first 3 items of root
  123.     printf("3 first items of root:\n");
  124.     for(i = 0; i < 3; i++){
  125.         if(root[i].name[0] == ' ') continue;
  126.         for(int j = 0; j < 8 && root[i].name[j] != ' '; j++)
  127.             printf("%c", root[i].name[j]);
  128.         printf("\t");
  129.         printf("%d \t %ld\n", root[i].first_cluster, root[i].size);
  130.     }
  131.  
  132.     //Find a file with name given in char filename[]
  133.     printf("\n");
  134.     printf("Clusters belong to file readme:");
  135.     int k;
  136.     char str[9];
  137.     int first_cluster = -1;
  138.     for(i = 0; i < boot.ROOT_size; i++){
  139.         //Copy root[i].name to str to make null-terminated string
  140.         for(k = 0; k < 8 && root[i].name[k] != ' '; k++)
  141.             str[k] = root[i].name[k];
  142.         str[k] = 0;
  143.         //Comparing
  144.         char filename[8];
  145.         printf("\n Enter a file name:");
  146.         scanf("%s",filename);
  147.  
  148.         if(strcmp(str, filename) == 0){
  149.             first_cluster = root[i].first_cluster;
  150.             break;
  151.         }
  152.     }
  153.  
  154.     //Printing clusters belonging to the file
  155.     if(first_cluster >= 0){
  156.         cur = first_cluster;
  157.         while(cur < 0xFFF8){
  158.             printf("%u ", cur);
  159.             cur = fat[cur];
  160.         }
  161.     }
  162.  
  163.     free(root);
  164.     free(fat);
  165.  
  166.     getchar();
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement