Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include "sysp.h"
void main(int argc, char *argv[]);
void show(DFCB far *);
void main(int argc, char *argv[]) {
CVT far *cvt;
DFT far *dft;
unsigned i,j,k;
DFCB far *dfcb, far *file_dfcb;
int handle, flag, disk;
BOOT far *boot_rec;
int status;
char *buf;
char drive[_MAX_DRIVE], dir[_MAX_DIR];
char fname[_MAX_FNAME], ext[_MAX_EXT];
char name[12];
printf("€д®а¬ жЁп ®Ў ®вЄалвле д ©« е DOS\n"
"Copyright Frolov A. (C),1990\n");
printf("€бб«Ґ¤гҐ¬ а бЇ®«®¦ҐЁҐ д ©« '%s'\n", argv[1]);
// ЋвЄалў Ґ¬ д ©«, ¤«п Є®в®а®Ј® Ўг¤Ґ¬ Ї®«гз вм бЇЁб®Є Є« бвҐа®ў
handle = open(argv[1], O_BINARY);
if(handle == 0) {
printf("ЋиЁЎЄ ЇаЁ ®вЄалвЁЁ д ©« !\n");
exit(-1);
}
// ђ §ЎЁў Ґ¬ Їгвм д ©« б®бв ў«пойЁҐ Є®¬Ї®Ґвл:
// - ЎгЄў ¤ЁбЄ ;
// - Є в «®Ј;
// - Ё¬п д ©« ;
// - а биЁаҐЁҐ Ё¬ҐЁ
_splitpath(argv[1], drive, dir, fname, ext);
// Љ®¬ЎЁЁа㥬 бва®Єг Ё§ Ё¬ҐЁ Ё а биЁаҐЁп
strcpy(name,fname);
for(i=0; i<8; i++) {
if(name[i] == 0) break;
}
for(; i<8; i++) name[i] = ' ';
name[8] = 0;
strcat(name, &ext[1]);
// ЏаҐ®Ўа §гҐ¬ бва®Єг Ё¬ҐЁ ў § Ј« ўлҐ ЎгЄўл
strupr(name);
// ‚лзЁб«пҐ¬ ®¬Ґа ¤ЁбЄ®ў®¤
drive[0] = toupper(drive[0]);
disk = drive[0] - 'A';
printf("%s - %s - %s - %s : %s\n",
drive, dir, fname, ext, name);
cvt=get_mcvt(); // Ђ¤аҐб ўҐЄв®а®© в Ў«Ёжл бўп§Ё
dft=get_fdft(cvt); // Ђ¤аҐб з « в Ў«Ёжл д ©«®ў
// ‘Ўа блў Ґ¬ д« Ј Ї®ЁбЄ д ©«
flag = 0;
for(;;) {
if(dft == (DDCB far *)0) break; // Љ®Ґж в Ў«Ёжл д ©«®ў
i=dft->file_count;
for(j=0;j<i;j++) { // –ЁЄ« Ї® д ©«®ўл¬ гЇа ў«пойЁ¬ Ў«®Є ¬
dfcb=(&(dft->dfcb))+j; // Ђ¤аҐб DFCB д ©«
// €йҐ¬ д ©« ў в Ў«ЁжҐ ®вЄалвле д ©«®ў
k = memcmp(name,dfcb->filename,11);
if(k == 0) {
printf("” ©« ©¤Ґ!\n");
printf("\nDFCB д ©« : %Fp\n\n",dfcb);
// ‡ Ї®¬Ё Ґ¬ ¤аҐб в Ў«Ёжл ¤«п ©¤Ґ®Ј® д ©«
file_dfcb = dfcb;
// Џ®Є §лў Ґ¬ ᮤҐа¦Ё¬®Ґ в Ў«Ёжл ¤«п ©¤Ґ®Ј® д ©«
show(file_dfcb);
flag = 1;
break;
}
}
dft=get_ndft(dft);
if(flag == 1) break;
}
if(flag == 0) {
printf("” ©« Ґ ©¤Ґ");
close(handle);
exit(-1);
}
// ‡ Є §лў Ґ¬ ЎгдҐа ¤«п з⥨п BOOT-§ ЇЁбЁ.
// Ђ¤аҐб ЎгдҐа ЇаЁбў Ёў Ґ¬ FAR-гЄ § ⥫о.
boot_rec = malloc(sizeof(*boot_rec));
// —Ёв Ґ¬ § Ја㧮зго § ЇЁбм ў ЎгдҐа
status = getboot((BOOT far*)boot_rec, disk);
// ‚лзЁб«пҐ¬ а §¬Ґа Є« бвҐа ў Ў ©в е
i = boot_rec->bpb.clustsize * boot_rec->bpb.sectsize;
printf("\nђ §¬Ґа Є« бвҐа , Ў ©в®ў : %d",i);
// …б«Ё Їа®Ё§®и« ®иЁЎЄ ( ЇаЁ¬Ґа, ҐЇа ўЁ«м® гЄ § ®
// ®Ў®§ 票Ґ ¤ЁбЄ ), § ўҐаи Ґ¬ а Ў®вг Їа®Ја ¬¬л
if(status) {
printf("\nЋиЁЎЄ ЇаЁ з⥨Ё BOOT-ᥪв®а ");
close(handle);
exit(-1);
}
buf = malloc(i);
printf("\n‘ЇЁб®Є Є« бвҐа®ў д ©« :\n");
// —Ёв Ґ¬ д ©« Ї® Є« бвҐа ¬, ўлў®¤Ё¬ ®¬Ґа
// Ї®б«Ґ¤ҐЈ® Їа®зЁв ®Ј® Є« бвҐа , Є®в®ал©
// ЎҐаҐ¬ Ё§ в Ў«Ёжл д ©«®ў
for(;;) {
read(handle, buf, i);
if(eof(handle)) break;
printf("%d ",file_dfcb->last_clu);
}
close(handle);
free(boot_rec);
free(buf);
exit(0);
}
// ”гЄжЁп ¤«п ®в®Ўа ¦ҐЁп ᮤҐа¦Ё¬®Ј® в Ў«Ёжл д ©«®ў
void show(DFCB far *dfcb) {
int k;
printf("€¬п д ©« : ");
for(k=0;k<11;k++) {
putchar(dfcb->filename[k]);
}
printf("\nЉ®«ЁзҐбвў® file handles: %d\n"
"ђҐ¦Ё¬ ¤®бвгЇ : %d\n"
"Џ®«Ґ reserv1: %04X\n"
"€д®а¬ жЁп ®Ў гбва®©б⢥: %04X\n"
"Ђ¤аҐб ¤а ©ўҐа : %Fp\n"
"Ќ з «мл© Є« бвҐа: %d\n"
"‚६п: %04X\n"
"„ в : %04X\n"
"ђ §¬Ґа д ©« ў Ў ©в е: %ld\n"
"’ҐЄг饥 ᬥ饨Ґ ў д ©«Ґ: %ld\n"
"Џ®«Ґ reserv2: %04X\n"
"Џ®б«Ґ¤Ё© Їа®зЁв л© Є« бвҐа: %d\n"
"‘ҐЈ¬Ґв PSP ў« ¤Ґ«мж д ©« : %04X\n"
"Џ®«Ґ reserv7: %d\n"
"--------------------------------------\n\n",
dfcb->handl_num,
dfcb->access_mode,
dfcb->reserv1,
dfcb->dev_info,
dfcb->driver,
dfcb->first_clu,
dfcb->time,
dfcb->date,
dfcb->fl_size,
dfcb->offset,
dfcb->reserv2,
dfcb->last_clu,
dfcb->ownr_psp,
dfcb->reserv7);
}