Добавил:
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;
long total_sectors;
int fat, root_begin, root_sectors;
char drive;
unsigned _far *fat_buffer;
FITEM _far *root_buffer, _far *rptr;
union REGS reg;
struct SREGS segreg;
printf("\n"
"\n—⥨Ґ Є®аҐў®Ј® Є в «®Ј «®ЈЁзҐбЄ®Ј® ¤ЁбЄ "
"\n (C)”а®«®ў Ђ., 1991"
"\n");
// ‡ Є §лў Ґ¬ ЎгдҐа ¤«п з⥨п BOOT-§ ЇЁбЁ.
// Ђ¤аҐб ЎгдҐа ЇаЁбў Ёў Ґ¬ FAR-гЄ § ⥫о.
boot_rec = _fmalloc(sizeof(*boot_rec));
// ‡ Їа иЁў Ґ¬ ¤ЁбЄ, ¤«п Є®в®а®Ј® Ґ®Ўе®¤Ё¬®
// ўлЇ®«Ёвм з⥨Ґ § Ја㧮箩 § ЇЁбЁ.
printf("\n"
"\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-ЎЁв®ўл© д®а¬ в");
fat=16;
}
else {
printf("\nFAT Ё¬ҐҐв 12-ЎЁв®ўл© д®а¬ в");
fat=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);
}
// Ћбў®Ў®¦¤ Ґ¬ ЎгдҐа
_ffree(root_buffer);
_ffree(boot_rec);
_ffree(fat_buffer);
}