Системное программное обеспечение персональных ЭВМ


Пример 14 - часть 2


в FCB старого имени */ make_fcb(new,&lib.fsize); /* формир. в FCB нового имени */ rr.h.ah=0x17; /* функция RenameFCB */ sr.ds=FP_SEG(&lib); /* адрес FCB */ rr.x.dx=FP_OFF(&lib); intdosx(&rr,&rr,&sr); if (rr.h.al) return(0); return(1); } /*==== удаление файла ====*/ int del_f() { make_fcb(libname,&lib); rr.h.ah=0x13; /* функция DeleteFCB */ sr.ds=FP_SEG(&lib); /* адрес FCB */ rr.x.dx=FP_OFF(&lib); intdosx(&rr,&rr,&sr); if (rr.h.al) return(0); return(1); } /*==== получение информации о файле ====*/ lib_info(struct file_info *a) { close_lib(); rr.h.ah=0x23; /* функция FileSizFCB */ sr.ds=FP_SEG(&lib); /* адрес FCB */ rr.x.dx=FP_OFF(&lib); lib.recsize=1; intdosx(&rr,&rr,&sr); a->size=lib.randrec; /* дату и время можно выбрать из открытого FCB */ open_lib(); a->date=lib.date; a->time=lib.time; a->attr=0xff; /* атрибут взять неоткуда */ }

Нельзя оставить без иллюстраций очень интересные функции 0x45, 0x46, используемые обычно для переназначения системных потоков ввода-вывода. В нашем примере 10.8 для файла стандартного вывода sysout (это постоянно открытый файл, его дескриптор 1) создается альтернативный дескриптор, служащий для сохранения ссылки на системный файл CON. Затем происходит переназначение дескриптора sysout_main на пользовательский файл. С этого момента все данные, направляемые в sysout, будут попадать в пользовательский файл. (Для вывода мы пользуемся функцией DOS 0x40, но тот же эффект получится при использовании функции Си printf и т.п.). Вывод же, направляемый по альтернативному дескриптору, полученному ранее для sysout, попадает на экран. В конце программы мы восстанавливаем прежнее назначение sysout по альтернативному дескриптору, но если бы мы этого не сделали, оно бы восстановилось само при завершении программы.




- Начало -  - Назад -  - Вперед -