Смена каталога

Тема в разделе "WASM.BEGINNERS", создана пользователем nuan, 17 мар 2009.

  1. nuan

    nuan New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2009
    Сообщения:
    9
    Собственно есть пример кода:

    Как сменить здесь корневой каталог , на другой на дискете?

    Код (Text):
    1. //
    2. #include <stdio.h>
    3. #include <conio.h>
    4. #include <malloc.h>
    5. #include <dos.h>
    6. #include <ctype.h>
    7. #include <bios.h>
    8. typedef struct _EBPB_
    9. {
    10.   unsigned sectsize;
    11.   char clustsize;
    12.   unsigned ressecs;
    13.   char fatcnt;
    14.   unsigned rootsize;
    15.   unsigned totsecs;
    16.   char media;
    17.   unsigned fatsize;
    18.   unsigned seccnt;
    19.   unsigned headcnt;
    20.   unsigned hiddensec_low;
    21.   unsigned hiddensec_hi;
    22.   unsigned long drvsecs;
    23. } EBPB;
    24.  
    25. typedef struct _BOOT_
    26. {
    27.   char jmp[3];
    28.   char oem[8];
    29.   EBPB bpb;
    30.   char drive;
    31.   char reserved;
    32.   char signature;
    33.   unsigned volser_lo;
    34.   unsigned volser_hi;
    35.   char label[11];
    36.   char fat_format[8];
    37.   char boot_code[450];
    38. } BOOT;
    39.  
    40. typedef struct _FTIME_
    41. {
    42.   unsigned sec : 5, min : 6, hour : 5;
    43. } FTIME;
    44.  
    45. typedef struct _FDATE_
    46. {
    47.   unsigned day : 5, month : 4, year : 7;
    48. } FDATE;
    49.  
    50. typedef struct _FITEM_
    51. {
    52.   char name[8];
    53.   char ext[3];
    54.   char attr;
    55.   char reserved[10];
    56.   FTIME time;
    57.   FDATE date;
    58.   unsigned cluster_nu;
    59.   unsigned long size;
    60. } FITEM;
    61.  
    62. int getboot(BOOT far *boot, int drive);
    63.  
    64. union REGS reg;
    65. struct SREGS segreg;
    66.  
    67. struct
    68. {
    69.   unsigned long first_sect;
    70.   unsigned nsect;
    71.   void far* buf;
    72. } cb;
    73.  
    74. int main(void)
    75. {
    76.   int i;
    77.   int  root_begin, root_sectors;
    78.   char drive;
    79.  
    80.   char boot[512];
    81.   BOOT far* boot_rec = (BOOT far*) boot;
    82.  
    83.   FITEM *root_buffer, far *rptr;
    84.  
    85.   printf("\nЧтение корневого каталога "
    86.     "логического диска"
    87.     "\n  (C)Фролов А., 1995\n");
    88.  
    89.   // Запрашиваем диск, для которого необходимо
    90.   // выполнить чтение загрузочной записи.
    91.   printf("\nВведите обозначение диска (A, B, ...):");
    92.   drive = getche();
    93.  
    94.   // Вычисляем номер дисковода
    95.   drive = toupper(drive) - 'A';
    96.  
    97.   // Читаем загрузочную запись в буфер
    98.   int status = getboot((BOOT far*)boot_rec, drive);
    99.  
    100.   // Если произошла ошибка (например, неправильно указано
    101.   // обозначение диска), завершааем работу программы
    102.   if(status)
    103.   {
    104.     printf("\nОшибка при чтении загрузочного сектора");
    105.     return(-1);
    106.   }
    107.  
    108.   // Вычисляем номер первого сектора
    109.   // корневого каталога
    110.   root_begin = boot_rec->bpb.ressecs +
    111.     boot_rec->bpb.fatsize * boot_rec->bpb.fatcnt;
    112.  
    113.   // Вычисляем длину корневого каталога
    114.   root_sectors = (boot_rec->bpb.rootsize * 32) /
    115.     boot_rec->bpb.sectsize;
    116.  
    117.   // Заказываем буфер для корневого каталога
    118.   root_buffer = (FITEM *)
    119.     malloc(root_sectors * boot_rec->bpb.sectsize);
    120.  
    121.   if(root_buffer == NULL)
    122.   {
    123.     printf("\nМало памяти");
    124.     return(-1);
    125.   }
    126.  
    127.   // Читаем корневой каталог в буфер root_buffer
    128.   cb.first_sect = root_begin;
    129.   cb.nsect = root_sectors;
    130.   cb.buf = (void far*)root_buffer;
    131.  
    132.   _BX= FP_OFF(&cb);
    133.   _DS = FP_SEG(&cb);
    134.   _CX  = 0xffff;
    135.   _DX  = 0;
    136.   _AX  = drive;
    137.    
    138.   asm int 25h
    139.   asm pop ax
    140.   asm jc error
    141.  
    142.   // Показываем содержимое корневого каталога
    143.   printf("\n"
    144.     "\nИмя файла    Аттр. Дата        "
    145.     "Время     Кластер  Размер"
    146.     "\n------------ ----- ----------  "
    147.     "--------  ------- ------");
    148.  
    149.   for(rptr = root_buffer;; rptr++)
    150.   {
    151.     printf("\n");
    152.  
    153.     // Признак конца каталога - нулевой байт в начале
    154.     // имени файла или байт 0xF6 (пустой каталог)
    155.     if(rptr->name[0] == 0 ||
    156.        rptr->name[0] == (char)0xF6) break;
    157.  
    158.     // Выводим содержимое дескриптора файла
    159.     for(i=0; i<8; i++)
    160.       printf("%c",rptr->name[i]);
    161.  
    162.     printf(".");
    163.  
    164.     for(i=0; i<3; i++)
    165.       printf("%c",rptr->ext[i]);
    166.  
    167.     printf(" %02X    %02d-%02d-%02d  %02d:%02d:%02d ",
    168.       rptr->attr, rptr->date.day,
    169.       rptr->date.month, rptr->date.year + 1980,
    170.       rptr->time.hour, rptr->time.min,
    171.       rptr->time.sec * 2);
    172.  
    173.     printf(" %-6ld   %lu",
    174.       (long)rptr->cluster_nu, (long)rptr->size);
    175.   }
    176.  
    177.   // Освобождаем память
    178.   free(root_buffer);
    179.   return 0;
    180.  
    181. error:
    182.   printf("\nОшибка при чтении каталога");
    183.   free(root_buffer);
    184.   return(-1);
    185. }
    186.  
    187. /**
    188. * getboot
    189. *
    190. * Прочитать загрузочную запись
    191. *
    192. * int getboot(BOOT far *boot, int drive);
    193. *
    194. *  boot   - указатель на буфер, в который
    195. *           будет прочитана загрузочная запись
    196. *
    197. *  drive  - номер физического НМД
    198. *           (0 - первый НМД, 1 - второй, ...)
    199. **/
    200. int getboot(BOOT far *boot, int drive)
    201. {
    202.   cb.first_sect = 0;
    203.   cb.nsect = 1;
    204.   cb.buf = (void far*)boot;
    205.    
    206.    _BX  = FP_OFF(&cb);
    207.    _DS = FP_SEG(&cb);
    208.    _CX  = 0xffff;
    209.    _DX  = 0;
    210.    _AX  = drive;
    211.  
    212.   asm int 25h
    213.  
    214.   // Извлекаем из стека оставшееся там после
    215.   // вызова прерывания слово
    216.   asm pop ax
    217.   asm jc err
    218.  
    219.   return(0);
    220. err:
    221.   return(1);
    222. }
    223.  
    224.   return(reg.x.cflag);
    225. }
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    nuan
    Корневой каталог имеет фиксированное месторасположение и размер. Все остальные каталоги хранятся как файлы, т.е. в каталоге-родителе записан номер первого кластера и надо по FAT'у строить цепочку кластеров принадлежащих интересующему объекту - файлу/каталогу.
    В коде, что ты показал, нет и намека на разборки с FAT'ом.
     
  3. nuan

    nuan New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2009
    Сообщения:
    9
    Все понял спс.