На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Запись адреса критической секции (INDOS) и адреса критической ошибки Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Запись адреса критической секции (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
         ----------------------------------------------------------------

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz