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


Программа FMTIOCTL


Приведем пример программы FMTIOCTL (листинг 4.1), иллюстрирующей применение функций общего управления GENERIC IOCTL . Эта программа выполняет стандартное форматирование двадцатой дорожки диска А:.

Листинг 4.1. Файл fmtioctl\fmtioctl.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Программа уничтожит содержимое" "\n20-й дорожки диска А:." "\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;

// Вызываем подфункцию 0Dh для выполнения // операции чтения текущих параметров диска А: reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0860; reg.x.dx = FP_OFF(dbp); segreg.ds = FP_SEG(dbp); intdosx(&reg, &reg, &segreg);

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




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