Assembler - язык неограниченных возможностей


Символьные устройства - часть 5


    45h: установить число повторных попыток

    65h: определить число повторных попыток

    4Ah: выбрать кодовую страницу

    6Ah: определить активную кодовую страницу

    4Ch: начало подготовки кодовой страницы

    4Dh: конец подготовки кодовой страницы

    6Bh: получить список готовых кодовых страниц

    5Fh: установить информацию о дисплее

    7Fh: получить информацию о дисплее

+0Fh: 4 байта — не используется

+13h: 4 байта — адрес структуры данных IOCTL — соответствует структуре, передающейся в DS:DX для INT 21h, АХ = 440Ch

19h: Поддержка функций IOCTL (если установлены биты 6 и 7 атрибута)

    +0Dh: байт — категория устройства

    +0Eh: код подфункции

    Если эта комбинация подфункции и категории устройства не поддерживается драйвером — надо вернуть ошибку 03h в слове состояния.

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

Еще одно отличие этого примера — в нем показано, как совместить в одной программе обычный исполнимый файл типа ЕХЕ и драйвер устройства. Если такую программу запустить обычным образом, она будет выполняться, начиная со своей точки входа (метка start в нашем примере), а если ее загрузить из CONFIG.SYS, DOS будет считать драйвером участок программы, начинающийся со смещения 0:

; rot13.asm ; Драйвер символьного устройства, выводящий посылаемые ему символы на экран ; после выполнения над ними преобразования ROT13 ; (каждая буква английского алфавита смещается на 13 позиций). ; Реализованы только функции записи в устройство ; ; Пример использования: ; сору encrypted.txt $rot13 ; загрузка - из CONFIG.SYS ; DEVICE=c:\rot13.exe, ; если rot13.exe находится в директории С:\ ; .model small ; модель для ЕХЕ-файла .code .186 ; для pusha/popa org 0 ; код драйвера начинается с CS:0000 dd -1 ; адрес следующего драйвера dw 0A800h ; атрибуты нашего устройства dw offset strategy ; адрес процедуры стратегии dw offset interrupt ; адрес процедуры прерывания db "$ROT13",20h,20h ; имя устройства, дополненное ; пробелами до восьми символов




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