|
Размещение флажков критической секции
и критической ошибки
----------------------------------------------------------------
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
----------------------------------------------------------------
Захват векторов прерываний
В какой-либо точке секции своей инициализации TSR может объ-
явить свою собственную ISR int 2Fh, чтобы впоследствии при акти-
вациях программы можно было бы локализовать ее резидентную часть.
Для этого TSR может также потребоваться модификация других входов
IVT. Прерывания int 25h (чтение с диска по абсолютным адресам) и
int 26h (запись на диск по абсолютным адресам) затрудняют измене-
ние стека. Благодаря своей природе, прерывание int 13h (нижний
уровень в/в диска) не может быть прервано. Представьте себе, что
произойдет, если прерывание с кодом int 13h было бы прервано меж-
ду поиском и передачей. Если при отработке этого прерывания слу-
чится еще одна операция в/в, то первая передача, по всей вероят-
ности, нанесет серьезный ущерб структуре диска.
В связи с этим DOS не подразумевает никаких прерываний во
время обслуживания одного из этих запросов. За защиту операцион-
ной системы DOS в подобные моменты ответственность несет програм-
ма TSR. Захват этих векторов позволяет TSR управлять активностью
диска. Эти ISR должны писаться с использованием определенных трю-
ков из-за способа использования флажков процессора. Исходная ISR
- 4-36 -
int 13h возвращает результат в регистре флажков; новая ISR должна
возвращать эти результаты быстрее, чем инструкция int 13h занесет
их в стек. Исходные ISR int 25h и int 26h добавляют, кроме того,
другое искажение, занося флажки в стек инструкцией INT.
|