MS-DOS для программиста

Программа CPYIOCTL


Теперь приведем программу CPYIOCTL (листинг 4.2), копирующую содержимое двух первых секторов нулевой дорожки (головка 0) в первые два сектора двадцатой дорожки.

Листинг 4.2. Файл cpyioctl\cpyioctl.cpp

#include <dos.h> #include <stdio.h> #include <conio.h> #include <malloc.h> #include <errno.h>

typedef struct _DPB_WR_ { char spec; unsigned head; unsigned track; unsigned sector; unsigned sectcnt; void _far *buffer; } DPB_WR;

char buf[2000];

int main(void) { union REGS reg; struct SREGS segreg; DPB_WR far *dbp_wr; int sectors, i;

printf("\nПрограмма уничтожит содержимое" "\n20-й дорожки диска А:." "\nЖелаете продолжить? (Y,N)\n");

// Ожидаем ответ и анализируем его i = getch(); if((i != 'y') && (i != 'Y')) return(-1);

// Заказываем память для блока параметров // устройства, который будет // использован для чтения и записи dbp_wr = (DPB_WR far*)farmalloc(sizeof(DPB_WR));

if(dbp_wr == NULL) { printf("\nМало памяти"); return(-1); }

// Заполняем блок параметров для выполнения // операции чтения. // Мы будем читать первые два сектора // на нулевой дорожке, головка 0 dbp_wr->spec = 0; dbp_wr->head = 0; dbp_wr->track = 0; dbp_wr->sector = 0; dbp_wr->sectcnt = 2; dbp_wr->buffer = buf;

// Выполняем операцию чтения дорожки reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0861; reg.x.dx = FP_OFF(dbp_wr); segreg.ds = FP_SEG(dbp_wr); intdosx(&reg, &reg, &segreg);

// Проверяем результат выполнения операции if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }

// Заполняем блок параметров для выполнения // операции записи. // Только что прочитанные два сектора нулевой // дорожки будут записаны на 20-ю дорожку dbp_wr->spec = 0; dbp_wr->head = 0; dbp_wr->track = 20; dbp_wr->sector = 0; dbp_wr->sectcnt = 2; dbp_wr->buffer = buf;

// Выполняем операцию записи reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0841; reg.x.dx = FP_OFF(dbp_wr); segreg.ds = FP_SEG(dbp_wr); intdosx(&reg, &reg, &segreg);

// Проверяем результат выполнения операции if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }

// Освобождаем память farfree(dbp_wr);

return(0); }

Программа пользуется текущими параметрами диска А:, поэтому операции чтения текущих параметров и записи новых параметров не используются.

Обратите внимание на то, что эта и предыдущая программа разрушают содержимое двадцатой дорожки, поэтому для экспериментов с этими программами надо подготовить чистую отформатированную дискету.



Содержание раздела