|
"Ловушка" критических ошибок и break из ISR
----------------------------------------------------------------
IVT SEGMENT AT 00h ; отметить абсолютный адрес
ORG 23h*4 ; мы не заботимся относительно
; 0 - 22h
IVT23 DW 0,0 ; входы ссылок для int 23h и
IVT24 DW 0,0 ; int 24h
IVT ENDS
_text SEGMENT BYTE PUBLIC 'code'
OldInt23 DW 0,0 ; здесь мы будем сохранять адре-
OldInt24 DW 0,0 ; са критической ошибки и преры-
; вания
ASSUME ds:_text
BKGNewErrHndlr PROC NEAR
pushr ; сохранение всех изменяе-
; мых регистров
cld ; вывод флажка направления в из-
; вестное состояние для movsw и
; stosw
mov ax,cs ; es указывает на сегмент, содер-
mov es,ax ; жащий OldInt23
xor ax,ax ; ds указывает
mov ds,ax ; на IVT
ASSUME ds:IVT,es:_text ; сообщить MASM, что ожидание
mov si,OFFSET IVT23 ; установить копию IVT
mov di,OFFSET OldInt23 ; входы с movsw
mov cx,4 ; каждый вход 2 слова
cli ; В А Ж Н О !!!
rep movsw ;;; копирование текущих входов
;;; ivt
mov es,ax ;;; es теперь указывает на IVT
ASSUME es:IVT ;;; сообщить MASM об изменении
mov ax,OFFSET NewInt23 ;;; ввод новых значений
stosw ;;; в IVT
mov ax,cs
stosw
mov ax,OFFSET NewInt24
stosw
mov ax,cs
stosw
sti
popr
ASSUME ds:_text
ret
BKGNewErrHndlr ENDP
NewInt23 PROC FAR ; новый обработчик break
iret ; игнорирование break
NewInt23 ENDP
NewInt24 PROC NEAR ; новый обработчик критической
; ошибки
iret ; вероятно будут выполнены ка-
; кие-либо действия относительно
; ошибки (может быть отказ вызова)
NewInt24 ENDP
_text ENDS
----------------------------------------------------------------
- 4-43 -
Обращение к глобальным переменным
Как минимум, Ваша TSR, устанавливая личную DTA и становясь
текущей программой, будет записывать текущие DTA и PSP. Адрес DTA
и адрес текущего PSP записывается в глобальные переменные DOS. |
системы управления базой данных |
|
|
К
переменным можно обращаться непосредственно, но их размещение мо-
жет изменяться в зависимости от версии DOS. Для получения и уста-
новки адреса DTA и адреса текущего PSP имеются служебные функции
BIOS. |
panda 2007 |
|
|
В этом месте последовательности повторной активации необхо-
димо определить, безопасно ли делать запросы к BIOS и защитить
себя от break и критических ошибок. Использование для этих целей
служебных функций BIOS позволяет не заботиться о положении этих
переменных в конкретной версии DOS.
Листинг 4-29. |
архиватор win rar |
|
|
перевод с английского на русский, бухгалтерия, symantec, программы архиваторы, win архиваторы, .
архиватор winrar
|
В этой точке Ваша TSR теперь становится текущей
программой. Так как критические ошибки и критические break могут
завершить текущую программу, необходимо быть уверенным в том, что
Вы получили шанс вернуться обратно и нашли способ как это сде-
лать. Установка своих собственных драйверов критической ошибки и
break позволяет TSR быть аккуратной в таких случаях и обходиться
с ними безопасным способом.
В связи с отсутствием способа определения из программы ISR
текущей программы переднего плана, установка драйверов критичес-
кой ошибки и break является искусным приемом программирования.
Если для манипуляции входом IVT используется int 21, то существу-
ет определенный риск получения ошибки break . Самым безопасным
способом является способ манипуляции входами IVT непосредственно.
Заметим, что необходимо запретить break , пока производится изме-
нение входов таблицы. Хотя это и не кажется очевидным, другие
программы могут прервать Вашу программу в середине выполнения из-
менений, и могут модифицировать входы IVT, с которыми Вы работае-
те. Как выполнить эту задачу, показывает листинг 4-28.
Действия, которые будут выполняться во вновь установленных
драйверах break и критической ошибки, зависят от TSR. Они могут
быть проигнорированы, но, обычно, программа при возникновении
критической ошибки должна выполнить какие-либо действия. Если TSR
может иметь дело со сбойными запросами int 21h (практически, не-
обходимо проверять результаты выполнения каждого запроса и быть
готовым иметь дело с ошибками), то простейшим способом обработки
является отказ от вызова. В то же время имеются другие способы
обработки. Например, если произошел сбой диска в связи с тем, что
была открыта дверца накопителя, то необходимо напечатать сообще-
ние и повторить операцию.
- 4-42 -
Листинг 4-28.
|
|
|