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


Пример 2



Пример 2

/*==== ПРИМЕР 14.1 ====*/ /*==== Обработка критической ошибки ====*/ #include <dos.h> #include <stdio.h> #define byte unsigned char #define word unsigned int void interrupt new_24(); void interrupt (* old_24)(); /* адрес старого обработчика критической ошибки */ /* информация об ошибке, запомненная в обработчике */ byte save_ah, save_al, class, actions; word save_di, save_bp, save_si, ext_code, locate; /* сообщения */ char *msg1[]= {"ИГНОРИРОВАТЬ","ПОВТОРИТЬ","СНЯТЬ"}; char *msg2[]= {"системная обл.","FAT","каталог","обл.данных"}; char *msg3[]={"защита от записи","неизвестное устройство", "диск не готов","неизвестная команда","ошибка CRC", "неправильная структура запроса","ошибка поиска", "неизвестный тип диска","сектор не найден", "конец бумаги","ошибка записи","ошибка чтения", "общий сбой","наруш.режима разделения", "наруш.блокировки","ошибка смены диска", "FCB недоступен","переполн.буфера разделения" }; union REGS rr; struct SREGS sr; int dos; FILE *f; main() { /* получить версию DOS */ rr.h.ah=0x30; intdos(&rr,&rr); if ((dos=rr.h.al)==3) dos=0; /* перехват вектора */ old_24=getvect(0x24); setvect(0x24,new_24); /* эксперимент 1 */ save_ah=save_al=save_di=save_bp=save_si=0; /* получить адрес DPB (при неготовом диске) */ rr.h.ah=0x32; rr.h.dl=2; intdosx(&rr,&rr,&sr); error_scan(); /* эксперимент 2 */ save_ah=save_al=save_di=save_bp=save_si=0; /* печатать (при неготовом принтере) */ fprintf(stdprn,"aaa"); error_scan(); /* восстановление вектора (необязательно) */ setvect(0x24,old_24); } /*-------------------------------------*/ /*== Распечатка информации об ошибке ==*/ error_scan() { int i; byte k; char *s; if (!(save_ah|save_al|save_di|save_bp|save_si)) printf("Ошибки нет\n"); else { printf("\nОшибка при "); if (save_ah&1) printf("записи, "); else printf("чтении, "); if (save_ah&0x80){ printf("устройство "); s=(char far *)MK_FP(save_bp,save_si)+10; for (i=0; i<8; i++,s++) printf("%c",*s); printf("\n"); } else { printf("диск %c\n",save_al+'A'); printf("Место ошибки - %s\n",msg2[(save_ah>>1)&3]); } for (i=0,k=0x20; k>0x04; k>>=1,i++) if (save_ah&k) printf("Можно %s\n",msg1[i]); else printf("Нельзя %s\n",msg1[i]); printf("Тип ошибки - %s\n",msg3[save_di]); printf("РАСШИРЕННАЯ ИНФОРМАЦИЯ:\n"); printf(" Код ошибки - %04Xh\n",ext_code); printf(" Класс ошибки - %02Xh\n",class); printf(" Действия - %02Xh\n",actions); printf(" Место - %02Xh\n",locate); } printf("Нажмите любую клавишу...\n"); getch(); } /*-------------------------------------*/ /*== Обработчик критических ситуаций ==*/ void interrupt new_24 (bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs) word bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs; { /* сохранение основной информации об ошибке */ save_ah=ax>>8; save_al=ax&0xff; save_di=di; save_bp=bp; save_si=si; /* получение расширенной информации об ошибке */ rr.h.ah=0x59; /* функция 59 */ rr.x.bx=dos; intdos(&rr,&rr); ext_code=rr.x.ax; class=rr.h.bh; actions=rr.h.bl; locate=rr.h.ch; /* действия - отменить запрос */ ax=3; }




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