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


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


Это признак ; того, что программа уже загружена в память installed: mov ax,00FFh iret new_int2Fh endp ;============================== ; Точка входа в программу ; В этом месте начинается выполнение программы begin proc ; Проверяем, не загружена ли уже программа ; в память mov ax,0FF00h int 2Fh cmp ax,00FFh jne first_start mov dx,offset msg_load1 mov ah,9 int 21h .EXIT ; Первоначальный запуск программы first_start: ; Запоминаем адрес старого обработчика прерывания 2Fh mov ax,352Fh int 21h mov cs:old_int2Fh_off,bx mov cs:old_int2Fh_seg,es push cs pop ds ; Выводим сообщение mov dx,offset msg_load mov ah,9 int 21h mov dx,OFFSET new_int2Fh mov ax,252Fh int 21h ; Завершаем программу и оставляем резидентно ; в памяти часть программы, содержащую новые ; обработчики прерываний mov dx,OFFSET begin int 27h begin endp msg_load db 'Резидентная программа WINTSR загружена$' msg_load1 db 'Резидентная программа WINTSR уже загружена$' end

Следующая резидентная программа работает аналогично, но она запрещает запуск WINDOWS. Попробуйте, запустив предварительно программу NOWINTSR, запустить WINDOWS и посмотрите, что из этого получится.

Листинг 23. Запрет запуска WINDOWS Файл nowintsr.asm ----------------------------------------------------------- .MODEL tiny .CODE .STARTUP jmp begin old_int2Fh_off dw 0 ; Адрес старого обработчика old_int2Fh_seg dw 0 ; прерывания 2Fh ; Сообщение, которое выдаётся при запуске WINDOWS msg_win db 'NOWINTSR несовместима с WINDOWS. Нажмите любую клавишу...$' msg_win_off dw offset msg_win ; Сообщение, которое выдаётся при завершении WINDOWS msg_win1 db 10,13,'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: 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 mov cx,0ffh jmp dword ptr cs:old_int2Fh_off winend: 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.


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