Скачиваний:
38
Добавлен:
01.05.2014
Размер:
6.26 Кб
Скачать
#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, &reg, &reg, &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, &reg, &reg, &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, &reg, &reg, &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);
}
Соседние файлы в папке DIRLIST