void harderr(int (*handler)())
void harderr(int (far *handler)())
void hardresume(int code)
void _hardresume(int code)
void hardretn(int code)
void _hardretn(int code)
Эти функции не определены стандартом ANSI С.
Функции harderr(), _harderr() позволяют заменить обработчик DOS аппаратных ошибок, заданный по умолчанию, собственным обработчиком. При вызове этих функций в качестве параметра им передается адрес функции, которая становится новым обработчиком ошибок. Она будет исполняться всякий раз при возникновении прерывания 0x24.
При использовании функции harderr() функция-обработчик ошибок, на которую указывает параметр handler, должна иметь следующий прототип:
void err_handler(int errnum, int ax, int bp, int si);
Здесь параметр rnum является кодом ошибки DOS, а параметры ах, bp, л содержат значения регистров АХ, BP и SI. Если величина ах не отрицательна, то произошла ошибка диска. В таком случае, используя операцию битовое И с ах и 0xFF, можно получить номер диска, на котором произошла ошибка. При этом диску А соответствует номер 0. Если величина ах отрицательна, то произошла ошибка устройства. Для подробной интерпретации возникшей ошибки необходимо использовать техническое руководство DOS. Регистры bp и si содержат адрес драйвера устройства, в котором произошла ошибка.
При использовании функции _harderr() обработчик ошибок, на который указывает параметр handler, должен быть дальней функцией и иметь следующий прототип:
void far err_handler(unsigned err, unsigned errnum, unsigned far *devptr)
Здесь параметру err передается код, указывающий, в каком устройстве произошел сбой. Если величина err не отрицательна, то произошла ошибка диска. В таком случае, используя операцию битовое И с err и 0xFF, можно получить номер диска, в котором произошла ошибка. Диску А соответствует номер 0. Если величина err отрицательна, то произошла ошибка устройства. Необходимо обратиться к техническому руководству для полной интерпретации возникшей ошибки. Значение errnum является фактическим кодом ошибки устройства, который передается на обработку. Параметр devptr содержит адрес драйвера устройства, в котором произошла ошибка.
Имеется два очень важных правила, которым необходимо следовать при создании своих собственных обработчиков ошибок. Во-первых, обработчик ошибок не должен использовать какие- либо стандартные или UNIX-подобные функции ввода/вывода. В противном случае компьютер подвергается определенной опасности. Во-вторых, можно использовать вызовы DOS только с номерами от 1 до 12.
Выход из обработчика прерываний может осуществляться одним из следующих двух способов. Во-первых, функция hardresume() (как и функция _hardresume()) обусловливает выход в DOS с возвратом значения code. Во-вторых, обработчик может осуществлять возврат в программу с помощью вызова функции hardretn() (или _hardretn()) с возвратом значения параметра code. Функции hardresume() и _hardresume() должны возвращать одно из следующих значений. (Эквиваленты этих макросов определены в dos.h.)
Величина | Макрос | Значение |
---|---|---|
0 | _HARDERR_IGNORE | Игнорировать |
1 | _HARDERR_RETRY | Повторить |
2 | _HARDERR_ABORT | Отменить |
3 | _HARDERR_FAIL | Неудача |
В силу сложного характера функций обработки ошибок их примеры здесь не приводятся.