#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include "sysp.h"

void main(void);

void main(void)
{

	 CVT far *cvt;
	 DFT far *dft;
	 unsigned i,j,k;
	 DFCB far *dfcb;
	 FILE *list;

	 printf("Информация об открытых файлах DOS\n"
			  "Copyright Frolov A. (C),1990\n");

	 // Открываем файл для вывода информации о файлах

	 list=fopen("!dfcb.lst","w+");

	 fprintf(list,"Информация об открытых файлах DOS\n"
			  "Copyright Frolov A. (C),1990\n\n");

	 cvt=get_mcvt();     // Адрес векторной таблицы связи
	 dft=get_fdft(cvt);  // Адрес начала таблицы файлов

	 for(;;) {
		if(dft == (DDCB far *)0) break;  // Конец таблицы файлов

		i=dft->file_count;
		fprintf(list,"Таблица файлов DFT: %Fp, в ней %d файлов\n"
						 "===========================================\n",
						 dft,i);

		for(j=0;j<i;j++) {   // Цикл по файловым управляющим блокам

			dfcb=(&(dft->dfcb))+j; // Адрес DFCB файла

			fprintf(list,"\nDFCB файла: %Fp\n\n",dfcb);

			fprintf(list,"Имя файла: ");
			for(k=0;k<11;k++) {
				fputc(dfcb->filename[k],list);
			}

			fprintf(list,"\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);

		}
		dft=get_ndft(dft);
	 }
	 fclose(list);
	 exit(0);
}
