|
|
|
|
Запись адреса критической секции (INDOS) и адреса критической ошибки
После того, как TSR завершает выполнение запроса "оставить резидентной" (функция 31h), то для последующей своей активации она ожидает прерывание
захвата. Когда TSR пробуждается, необходимо иметь способ определения, что в данный момент делает программа переднего плана, или кто активен в данный
момент: DOS или BIOS. Так как операционная система DOS не является повторно вводимой, то в целях оказания помощи резидентной подпрограмме в
решении вопроса о безопасности приема запросов BIOS она поддерживает флажки критической секции и критической ошибки.
Для гарантии безопасности продолжения своего выполнения при повторной активации TSR должна проверять состояние обоих флажков: критической ошибки и
критической секции. Адрес флажка критической секции DOS выбирает благодаря недокументированному запросу на вызов функции AH=34h прерывания int 21h. В
версии DOS 3.10 отсутствует функция BIOS для возврата адреса флажка критической ошибки; этот флажок размещается непосредственно перед флажком критической
секции. В версии DOS 3.20 адрес флажка критической ошибки возвращает функция int 21h AX=5D06h в паре ES:BX, а в версиях DOS 3.3 и 4.0 это значение
возвращается в паре DS:SI.
Учитывая способ обработки операционной системой DOS запросов int 21h, внутри ISR нельзя гарантировать надежное получение этих адресов. Самым
надежным способом доступа к этим флажкам является сохранение этих адресов только во время секции инициализации TSR. Следующий фрагмент программы,
приведенный в листинге 4-22, иллюстрирует захват адресов флажков критической секции и критической ошибки.
Листинг 4-22. Размещение флажков критической секции
и критической ошибки
----------------------------------------------------------------
CsectFlg DW 0,0 ; адрес флажка критической секции
CErrflg DW 0,0 ; адрес флажка критической ошибки
GetCritFlags PROC NEAR
mov ah,30h ; ah <== проверка версии DOS
int 21h
cmp al,03h ; версия 3.00?
jnz WrongVersion ; если не 0 -- нет
push ax ; сохранение номера версии
mov ah,34h ; получить адрес флажка крити-
int 21h ; ческой секции
mov CSectFlg,bx ; адрес в ES:BX
mov CSectFlg+2,es ; запомнить адрес
dec bx ; предполагается, что адрес флажка
; критической ошибки предшествует
; адресу флажка критической секции
pop ax ; восстановить номер версии
cmp ah,1h ; версия 3.30?
jnz v3xx ; если не 0 -- нет
mov ax,5d06h ; получение адреса критической
; ошибки
int 21h ; (только DOS 3.3)
v3xx: mov CErrflg,bx ; запоминание адреса критич.ошибки
mov CErrflg + 2,es ; адрес в ES:BX
; DS:SI в версиях 3.3 и 4.0
clc ; индикация успешности и
ret ; возврат
WrongVersion: ; плохая версия
stc ; индикация отказа и
ret ; возврат
GetCritFlags ENDP
----------------------------------------------------------------
|
|
|