Программа FMT81TRK
Другой пример - использование нестандартного номера дорожки. Программа FMT81TRK (листинг 5.2) форматирует дорожку (стандартным образом) с номером 81. Обычно считается, что дискеты могут содержать 40 или 80 дорожек, соответственно, с номерами 0...39 или 0...79, однако возможно использование и дорожек с большими номерами. Обычные программы копирования будут копировать только 40 или 80 дорожек, "не заметив" нашей лишней дорожки.
Этим мы и воспользуемся, записав на 81 дорожку контрольную информацию. Для разнообразия в примере используем функции GENERIC IOCTL . Запись этой информации, а также ее чтение и отображение выполняется программой RW82TRK, описанной в следующем разделе.
Листинг 5.2. Файл fmt81trk\fmt81trk.cpp
#include <dos.h> #include <stdio.h> #include <conio.h> #include <malloc.h> #include <errno.h>
typedef struct _EBPB_ { unsigned sectsize; char clustsize; unsigned ressecs; char fatcnt; unsigned rootsize; unsigned totsecs; char media; unsigned fatsize; unsigned seccnt; unsigned headcnt; unsigned hiddensec_low; unsigned hiddensec_hi; unsigned long drvsecs; } EBPB;
typedef struct _TRK_LY_ { unsigned no; unsigned size; } TRK_LY;
typedef struct _DPB_ { char spec; char devtype; unsigned devattr; unsigned numofcyl; char media_type; EBPB bpb; char reserved[6]; unsigned trkcnt; TRK_LY trk[100]; } DPB;
typedef struct _DPB_FORMAT_ { char spec; unsigned head; unsigned track; } DPB_FORMAT;
int main(void) { union REGS reg; struct SREGS segreg; DPB far *dbp; DPB_FORMAT far *dbp_f; int sectors, i;
printf("\nПрограмма уничтожит содержимое" "\n81-й дорожки диска А:." "\nЖелаете продолжить? (Y,N)\n");
i = getch(); if((i != 'y') && (i != 'Y')) return(-1);
// Заказываем память для блока параметров устройства dbp = (DPB far*)farmalloc(sizeof(DPB));
// Заказываем память для блока параметров устройства, // который будет использован для форматирования dbp_f = (DPB_FORMAT far*) farmalloc(sizeof(DPB_FORMAT));
if(dbp == NULL dbp_f == NULL) { printf("\nМало памяти"); return(-1); }
// Получаем текущие параметры диска А: dbp->spec = 0; reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0860; reg.x.dx = FP_OFF(dbp); segreg.ds = FP_SEG(dbp); intdosx(®, ®, &segreg);
if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }
// Заполняем блок парметров для форматирования dbp->spec = 5;
// Считываем из BPB количество секторов на дорожке sectors = dbp->bpb.seccnt;
// Подготавливаем таблицу, описывающую формат дорожки
// Записываем количество секторов на дорожке dbp->trkcnt = sectors;
// Для каждого сектора на дорожке в таблицу // записываем его номер и размер. for(i = 0; i < sectors; i++) { dbp->trk[i].no = i+1; dbp->trk[i].size = 512; }
// Устанавливаем новые параметры для диска А: reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0840; reg.x.dx = FP_OFF(dbp); segreg.ds = FP_SEG(dbp); intdosx(®, ®, &segreg);
if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }
// Готовим блок параметров устройства, // который будет использован при вызове // операции проверки возможности форматирования // дорожки dbp_f->spec = 1; dbp_f->head = 0; dbp_f->track = 81;
reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0842; reg.x.dx = FP_OFF(dbp_f); segreg.ds = FP_SEG(dbp_f); intdosx(®, ®, &segreg);
if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }
// Если указанный формат дорожки поддерживается, // поле специальных функций будет содержать 0. // Проверяем это if(dbp_f->spec != 0) { printf("\nФормат дорожки не поддерживается"); return(-1); }
// Заполняем блок параметров для выполнения // операции форматирования dbp_f->spec = 0; dbp_f->head = 0; dbp_f->track = 81;
// Форматируем дорожку с номером 81, головка 0 reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0842; reg.x.dx = FP_OFF(dbp_f); segreg.ds = FP_SEG(dbp_f); intdosx(®, ®, &segreg);
if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }
// Освобождаем память farfree(dbp); farfree(dbp_f);
return(0); }
Содержание раздела