Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <malloc.h>
#include <dos.h>
#include "sysp.h"
void main(void);
void main(void) {
BOOT _far *boot_rec;
int i,j, k, status, fat_sectors;
unsigned total_sectors;
int ffat, root_begin, root_sectors;
char drive;
unsigned _far *fat_buffer;
FITEM _far *root_buffer, _far *rptr;
char cbuf[128];
char _far *clust_buffer;
int cur_clust;
union REGS reg;
struct SREGS segreg;
printf("\n"
"\n—⥨Ґ Є в «®Ј®ў «®ЈЁзҐбЄ®Ј® ¤ЁбЄ "
"\n (C)”а®«®ў Ђ., 1991"
"\n");
// ‡ Є §лў Ґ¬ ЎгдҐа ¤«п з⥨п BOOT-§ ЇЁбЁ.
// Ђ¤аҐб ЎгдҐа ЇаЁбў Ёў Ґ¬ FAR-гЄ § ⥫о.
boot_rec = _fmalloc(sizeof(*boot_rec));
// ‡ Їа иЁў Ґ¬ ¤ЁбЄ, ¤«п Є®в®а®Ј® Ґ®Ўе®¤Ё¬®
// ўлЇ®«Ёвм з⥨Ґ § Ја㧮箩 § ЇЁбЁ.
printf("\n"
"\n‚ўҐ¤ЁвҐ ®Ў®§ 票Ґ ¤ЁбЄ (A, B, ...):");
drive = getche();
// ‚лзЁб«пҐ¬ ®¬Ґа ¤ЁбЄ®ў®¤
drive = toupper(drive) - 'A';
// —Ёв Ґ¬ § Ја㧮зго § ЇЁбм ў ЎгдҐа
status = getboot((BOOT _far*)boot_rec, drive);
// …б«Ё Їа®Ё§®и« ®иЁЎЄ ( ЇаЁ¬Ґа, ҐЇа ўЁ«м® гЄ § ®
// ®Ў®§ 票Ґ ¤ЁбЄ ), § ўҐаи Ґ¬ а Ў®вг Їа®Ја ¬¬л
if(status) {
printf("\nЋиЁЎЄ ЇаЁ з⥨Ё BOOT-ᥪв®а ");
exit(-1);
}
// ЋЇаҐ¤Ґ«пҐ¬ д®а¬ в в Ў«Ёжл FAT
total_sectors = boot_rec->bpb.totsecs;
// …б«Ё ¬л а Ў®в Ґ¬ б а биЁаҐл¬ а §¤Ґ«®¬ ¤ЁбЄ ,
// ®ЎйҐҐ Є®«ЁзҐбвў® ᥪв®а®ў ¤ЁбЄ ЎҐаҐ¬ Ё§
// а биЁаҐ®Ј® PBP
if(total_sectors == 0) total_sectors = boot_rec->bpb.drvsecs;
// ”®а¬ в FAT ®ЇаҐ¤Ґ«пҐ¬ Ёбе®¤п Ё§ ®ЎйҐЈ®
// Є®«ЁзҐб⢠ᥪв®а®ў «®ЈЁзҐбЄ®¬ ¤ЁбЄҐ
if(total_sectors > 20740) {
printf("\nFAT Ё¬ҐҐв 16-ЎЁв®ўл© д®а¬ в");
ffat=16;
}
else {
printf("\nFAT Ё¬ҐҐв 12-ЎЁв®ўл© д®а¬ в");
ffat=12;
}
// ЋЇаҐ¤Ґ«пҐ¬ Є®«ЁзҐбвў® ᥪв®а®ў, § Ё¬ Ґ¬ле FAT
fat_sectors = boot_rec->bpb.fatsize;
// ‡ Є §лў Ґ¬ ЎгдҐа ¤«п FAT
fat_buffer = _fmalloc(fat_sectors * boot_rec->bpb.sectsize);
// ‚лзЁб«пҐ¬ ®¬Ґа ЇҐаў®Ј® ᥪв®а FAT
j = boot_rec->bpb.ressecs;
// —Ёв Ґ¬ FAT ў ЎгдҐа fat_buffer
// ‡ Ї®«пҐ¬ ॣЁбва®ўлҐ бвагЄвгал ¤«п ўл§®ў
// ЇаҐалў Ёп DOS INT 25h
reg.x.ax = drive;
reg.x.bx = FP_OFF(fat_buffer);
segreg.ds = FP_SEG(fat_buffer);
reg.x.cx = fat_sectors;
reg.x.dx = j;
int86x(0x25, ®, ®, &segreg);
// €§ў«ҐЄ Ґ¬ Ё§ б⥪ ®б⠢襥бп в ¬ Ї®б«Ґ
// ўл§®ў ЇаҐалў Ёп б«®ў®
_asm pop ax
// ‚лзЁб«пҐ¬ ®¬Ґа ЇҐаў®Ј® ᥪв®а Є®аҐў®Ј® Є в «®Ј
root_begin = j + fat_sectors * boot_rec->bpb.fatcnt;
// ‚лзЁб«пҐ¬ ¤«Ёг Є®аҐў®Ј® Є в «®Ј
root_sectors = (boot_rec->bpb.rootsize * 32) /
boot_rec->bpb.sectsize;
// ‡ Є §лў Ґ¬ ЎгдҐа ¤«п Є®аҐў®Ј® Є в «®Ј
root_buffer = _fmalloc(root_sectors * boot_rec->bpb.sectsize);
// —Ёв Ґ¬ Є®аҐў®© Є в «®Ј ў ЎгдҐа root_buffer
reg.x.ax = drive;
reg.x.bx = FP_OFF(root_buffer);
segreg.ds = FP_SEG(root_buffer);
reg.x.cx = root_sectors;
reg.x.dx = root_begin;
int86x(0x25, ®, ®, &segreg);
_asm pop ax
// Џ®Є §лў Ґ¬ ᮤҐа¦Ё¬®Ґ Є®аҐў®Ј® Є в «®Ј
printf("\n"
"\n€¬п д ©« Ђвва. „ в ‚аҐ¬п Љ« бвҐа ђ §¬Ґа"
"\n------------ ----- ---------- -------- ------- ------");
for(rptr = root_buffer;;rptr++) {
printf("\n");
// ЏаЁ§ Є Є®ж Є в «®Ј - г«Ґў®© Ў ©в ў з «Ґ
// Ё¬ҐЁ д ©«
if(rptr->name[0] == 0) break;
// ‚лў®¤Ё¬ ᮤҐа¦Ё¬®Ґ ¤ҐбЄаЁЇв®а д ©«
for(i=0; i<8; i++) printf("%c",rptr->name[i]);
printf(".");
for(i=0; i<3; i++) printf("%c",rptr->ext[i]);
printf(" %02X %02d-%02d-%02d %02d:%02d:%02d ",
rptr->attr,
rptr->date.day,
rptr->date.month,
rptr->date.year + 1980,
rptr->time.hour,
rptr->time.min,
rptr->time.sec * 2);
printf(" %-5d %lu",
rptr->cluster_nu,
rptr->size);
}
// Џ®«гз Ґ¬ ЎгдҐа ¤«п звҐЁп Є« бвҐа®ў Є в «®Ј
clust_buffer = _fmalloc(boot_rec->bpb.clustsize
* boot_rec->bpb.sectsize);
printf("\nЌ®¬Ґа ЇҐаў®Ј® Є« бвҐа Є в «®Ј :");
gets(cbuf);
cur_clust = atoi(cbuf);
// ЏҐаҐ¬Ґ п k ЁбЇ®«м§гҐвбп ў Є зҐб⢥ д« Ј .
// ЏаЁ ЇҐаў®¬ Їа®б¬®вॠЄ в «®Ј ҐҐ § 票Ґ а ў® 0,
// § ⥬ нв ЇҐаҐ¬Ґ п гбв ў«Ёў Ґвбп ў 1.
k=0;
for(;;) {
// ‘®еа 塞 ®¬Ґа Є« бвҐа Є в «®Ј
j=cur_clust;
// ‚лзЁб«пҐ¬ ®¬Ґа б«Ґ¤го饣® Є« бвҐа , а бЇаҐ¤Ґ«Ґ®Ј®
// Є в «®Јг
cur_clust = fat(fat_buffer, ffat, cur_clust);
printf("%d ",cur_clust);
// —Ёв Ґ¬ Є« бвҐа ў ЎгдҐа clust_buffer
reg.x.ax = drive;
reg.x.bx = FP_OFF(clust_buffer);
segreg.ds = FP_SEG(clust_buffer);
reg.x.cx = boot_rec->bpb.clustsize;
reg.x.dx = root_begin + root_sectors
+ ((j-2)*boot_rec->bpb.clustsize);
int86x(0x25, ®, ®, &segreg);
_asm pop ax
// Џ®Є §лў Ґ¬ ᮤҐа¦Ё¬®Ґ Є в «®Ј
rptr = (FITEM _far *)clust_buffer;
// ЏҐаўл© ¤ҐбЄаЁЇв®а ў Є в «®ЈҐ гЄ §лў Ґв
// нв®в ¦Ґ Є в «®Ј. ‚ Ї®«Ґ Ё¬ҐЁ ЇҐаў®Ј® ¤ҐбЄаЁЇв®а
// 室Ёвбп бва®Є ". ". ќв®в д Єв ¬®¦® ЁбЇ®«м§®ў вм
// ¤«п Їа®ўҐаЄЁ Є в «®Ј . …б«Ё ўл Ї® ®иЁЎЄҐ гЄ § «Ё
// ®¬Ґа Є« бвҐа , Ґ ЇаЁ ¤«Ґ¦ 饣® Є в «®Јг,
// Їа®Ја ¬¬ § ўҐаиЁв а Ў®вг б б®®ЎйҐЁҐ¬ ®Ў ®иЁЎЄҐ.
if(k == 0) {
k=1;
if(strncmp(rptr->name,". ",8) != 0) {
printf("\nќв® Ґ Є в «®Ј !");
exit(-1);
}
}
printf("\n"
"\n€¬п д ©« Ђвва. „ в ‚аҐ¬п Љ« бвҐа ђ §¬Ґа"
"\n------------ ----- ---------- -------- ------- ------");
for(;;rptr++) {
printf("\n");
// ЏаЁ§ Є Є®ж Є в «®Ј - г«Ґў®© Ў ©в ў з «Ґ
// Ё¬ҐЁ д ©«
if(rptr->name[0] == 0) break;
// ‚лў®¤Ё¬ ᮤҐа¦Ё¬®Ґ ¤ҐбЄаЁЇв®а д ©«
for(i=0; i<8; i++) printf("%c",rptr->name[i]);
printf(".");
for(i=0; i<3; i++) printf("%c",rptr->ext[i]);
printf(" %02X %02d-%02d-%02d %02d:%02d:%02d ",
rptr->attr,
rptr->date.day,
rptr->date.month,
rptr->date.year + 1980,
rptr->time.hour,
rptr->time.min,
rptr->time.sec * 2);
printf(" %-5d %lu",
rptr->cluster_nu,
rptr->size);
}
// …б«Ё нв®в Є« бвҐа - Ї®б«Ґ¤Ё© Ё§ а бЇаҐ¤Ґ«Ґле Є в «®Јг,
// § ўҐаи Ґ¬ а Ў®вг Їа®Ја ¬¬л
if((cur_clust == 0xfff) || (cur_clust == 0xffff)) break;
}
// Ћбў®Ў®¦¤ Ґ¬ ЎгдҐа
_ffree(root_buffer);
_ffree(boot_rec);
_ffree(fat_buffer);
_ffree(clust_buffer);
}