Программирование на C и C++

Онлайн справочник программиста на C и C++

harderr, hardresume, _hardresume, hardretn, _hardretn

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Неудача

В силу сложного характера функций обработки ошибок их примеры здесь не приводятся.