Harderr
harderr
Функция Устанавливает подпрограмму обработки ошибок электронного оборудования.
Синтаксис #include
void harderr(*handler)());
Файл, содержащий dos.h прототип
Описание Функция harderr устанавливает подпрограмму обра- ботки сбоев электронного оборудования для текущей программы. Данная подпрограмма вызывается к рабо- те, как только возникнет прерывание 0x24. (см. документ "Справочное руководство программиста для DOS").
При появлении данного прерывыания происходит вы- зов функции handler. Функция должна быть вызвана со следующими аргументами:
handler(int errval, int ax, int bp, int si);
Переменная errval - код ошибки, устанавливаемый DOS в регистре DI. ax, bp и si - значения, кото- рые MS-DOS помещает соответственно в регистры AX,BP,SI.
- параметр ax обозначает, произошла ли ошибка диска или какого-либо другого устройства. Если ax не отрицательно, произошла дисковая ошибка, в противном случае, это ошибка другого устройства. Для дисковой ошибки значение ax, сложенное логи- чески (операцией AND) с 0x00FF, даст номер диско- вода, в котором произошел сбой (1=A; 2=B; и т.д.).
- bp и si вместе указывают на заголовок драйвера устройства, в котором произошел сбой. bp содержит адрес сегмента, а si смещение.
Названная выше функция не вызывается непосредст- венно. Функция harderr устанавливает подпрограмму обработки прерываний DOS, которая вызывает функ- цию. Для получения информации из заголовка драй- вера можно использовать функции peek и peekb.
Программа - обработчик прерываний может использо- вать системные вызовы DOS от 1 до 0xC, все ос- тальные вызовы портят DOS. В частности, не могут быть использованы ни любые стандартные подпрог- раммы ввода/вывода CИ, ни любые подпрограммы вво- да/вывода эмуляции UNIX.
Программа обработки прерывания должна возвращать 0, если необходимо игнорировать ошибку, 1, если нужно повторить операцию и 2 для завершения прог- раммы.
Возвращаемое Нет. значение
Переносимость Функция уникальна для DOS.
Смотрите также
Пример:
#include
#include
#include
#define IGNORE 0 #define RETRY 1 #define ABORT 2
/* определим сообщения об ошибке для дисковода */ static char *err_msg[] = {"диск защищен от записи", "неизвестное устройство", "дисковод не готов", "неизвестная команда", "ошибка данных (CRC)", "ошибка поиска", "неизвестный тип носителя", "ненайден сектор", "в принтере нет бумаги", "сбой при записи", "ошибка при чтении", "неустранимая ошибка", "зарезервирован", "зарезервирован", "неверная смена диска" };
error_win(char *msg) { int retval; cputs(msg); /* запрос у пользователя дальнейших действий */ while(1) { retval = getch(); if(retval == 'a' retval == 'A') { retval = ABORT; break; } if(retval == 'r' retval == 'R') { retval = RETRY; break; } if(retval == 'i' retval == 'I') { retval = IGNORE; break; } } return(retval); } /* прагма warn -par исключае выдачу предупреждений о том, что в подпрограмме не используются параметры errval,bp и si */
#pragma warn -par
int handler(int errval, int ax, int bp, int si) { static char msg[80]; unsigned di; int drive; int errno; di = _DI; /* если это не ошибка диска, то проблемы возникли у другого устр-ва */ if(ax