Защищенный режим процессоров Intel


Драйверы, резидентные программы и WINDOWS - часть 2


CX 0000h, если WINDOWS может продолжать инициализацию; CX <> 0, если запуск WINDOWS недопустим.

Функция 1606h вызывается при завершении WINDOWS расширенном или стандартном режиме:

Регистры при вызове прерывания:

AX 1606h DX Флаги: Бит 0 = 0, если выполняется завершение WINDOWS, работавшей в расширенном режиме; Бит 0 = 1, если выполняется завершение DOS-экстендера "Microsoft 286 DOS extender"; Биты 1-15 зарезервированы, их содержимое не определено.

Обработчик функции 1605h может выполнить необходимые действия, связанные с модификацией алгоритма работы резидентной программы или драйвера, а также при помощи соответствующей установки регистра CX может разрешить или запретить запуск WINDOWS.

Обработчик функции 1606h получает управление при завершении работы WINDOWS и может восстановить прежний алгоритм работы критичной к WINDOWS резидентной программы или драйвера.

Приведённая ниже резидентная программа перехватывает прерывание INT 2Fh и отслеживает фунции 1605h и 1606h, вызавая сообщение и ожидая нажатия на любую клавишу при запуске и завершении работы WINDOWS:

Листинг 22. Контроль запуска WINDOWS Файл wintsr.asm ----------------------------------------------------------- .MODEL tiny .CODE .STARTUP jmp begin old_int2Fh_off dw 0 ; Адрес старого обработчика old_int2Fh_seg dw 0 ; прерывания 2Fh ; Сообщение, которое будет выдано на экран ; при запуске WINDOWS msg_win db 'WINDOWS Started. Press any key...$' msg_win_off dw offset msg_win ; Сообщение, которое будет выдано на экран ; при завершении WINDOWS msg_win1 db 'WINDOWS Ended. Press any key...$' msg_winend_off dw offset msg_win1 ; Новый обработчик прерывания 2Fh нужен ; для проверки наличия программы в памяти ; при ее запуске для предохранения ; от повторного запуска new_int2Fh proc far cmp ax,0FF00h jz installed cmp ax,1605h jz winstart cmp ax,1606h jz winend jmp dword ptr cs:old_int2Fh_off winstart: ; запуск WINDOWS push ax push bx push cx push dx push ds mov dx,cs:msg_win_off mov ah,9 push cs pop ds int 21h mov ax,0 int 16h pop ds pop dx pop cx pop bx pop ax jmp dword ptr cs:old_int2Fh_off winend: ; завершение WINDOWS push ax push bx push cx push dx push ds mov dx,cs:msg_winend_off mov ah,9 push cs pop ds int 21h mov ax,0 int 16h pop ds pop dx pop cx pop bx pop ax jmp dword ptr cs:old_int2Fh_off ; Если код функции 0FF00h, то возвращаем ; в регистре AX значение 00FFh.


- Начало -  - Назад -  - Вперед -