Низкоуровневое програмирование Главная - Реальный режим - Прерывания DOS - INT 2Fh: Мультиплексное прерывание.

INT 2Fh: Мультиплексное прерывание.

Это прерывание спроектированно как интерфейс для резидентных программ. Логика работы следующая:
В регистре AH задаётся номер резидентной программы
В регистре AL задаётся номер вызываемой функции
При этом функция 0 должна быть функцией проверки наличия резидентной программы. Эта функция должно вернуть код статуса в AL. Известны следующие коды статуса:
        AL == 0 - этот номер резидентной программы свободен
        AL == 1 - этот номер резидентной программы зарезервирован
        AL == FFh - этот номер резидентной программы занят (можно обращаться к другим функциям)

Способ добавить свою программу в это прерывание очень прост: надо сохранить старый вектор прерывания, затем записать свой. При вызове прерывание перво-наперво необходимо проверить, что переданный код резидентной программы соответствует вашей программе. Если не соответствует - переходим на старый обработчик прерывания (инструкцией jmp!).
Перед добавлением программы стоит удостоверится что выбранный вами номер резидентной программы ещё не занят и не зарезервирован.
В идеале - необходимо провести перебор по номеру резидентной программы и найти свободный, однако большинство программ имеют жёстко заданный номер.
Кроме того, существует следующее соглашение о номерах:
    00h-3Fh Зарезервированно IBM для функций DOS
    40h-7Fh Зарезервированно Microsoft для функций DOS
    80h-B7h Зарезервированно IBM
    B8h-BFh Зарезервированно для работы с сетью
    C0h-FFh Для прочих приложений
(слово "зарезервированнно" в этом списке никак не соотносится со словом "зарезервированно" в списке возможных возвращаемых значений функции 0)
Если ваш процесс использует сервис DOS, или выполняется с незамаскированными прерываниями, то он должен быть реентерабельным.

Кроме того, прерывание 2F стало мультиплексным только в DOS 3.0, в DOS 2.0 оно служило для сервиса печати, и имело несовместимый с более новой версией интерфейс. Более ранние версии DOS никак не определяли это прерывание.

Оглавление


API Печати для DOS 3.0+


Резидентная часть команды PRINT
В AH передаётся 1
ALподфункция
0Проверит наличие

Выход:
AL == 00h => не установлен, можно устанавливать
AL == 01h => не установлен, нельзя устанавливать
AL == FFh => установлен

Примечание:
Novell DOS версии 7 обнуляет регистр AH
1Добавить файл в очередь печати

Вход:
DS:DX => направляемый пакет
Байт 0 -уровень (всегда 0 для DOS 3.0, 3.1 и 3.2)
Байты 1-2 - адрес (смещение,сегмент) строки ASCIIZ, содержащей полный путь к файлу, направляемого в очередь печати

Выход:
Если установлен флаг CF, то произошла ошибка, и AX содержит код ошибки
2Удалить файл из очереди печати

Вход:
DS:DX - адрес (смещение,сегмент) строки ASCIIZ, содержащей полный путь к файлу, направляемого в очередь печати

Выход:
Если установлен флаг CF, то произошла ошибка, и AX содержит код ошибки
3Очистить очередь печати

Выход:
Если установлен флаг CF, то произошла ошибка, и AX содержит код ошибки
4Приостановить печать и получить статус

Выход:
DX - количество возникших ошибок с последнего вызова этой функции
DS:SI - очередь печати
Если установлен флаг CF, то произошла ошибка, и AX содержит код ошибки

Примечание:
Очередь печати представляет из себя массив строк, каждая из которых имеет длинну 64 байта и содержит полный путь к печатаемому файлу
Первая запись в масииве - файл, который печатается сейчас. Признаком конца массива является пустая запись.
5Продолжить печать

Выход:
Если установлен флаг CF, то произошла ошибка, и AX содержит код ошибки
Эта функция вызывается для возобновления печати после выполнения функции 4
6Узнать состояние принтераDOS 3.3+

Выход:
Если флаг CF установлен:
    В очереди печати есть файлы
    AX - код ошибки
    DS:SI - указатель на заголовок драйвера устройства
Если флаг CF установлен:
    Очередь печати пуста
    AX=0

Коды ошибок API Печати для DOS 3.0+
КодЗначение
01Невеврный номер функции
02Файл не найден
03Путь не найден
04Нет доступного HANDLE (слишком много открытых файлов
05Ошибка доступа
06Неверный HANDLE
08Очередь переполнена
09Программа печати занята
0ChПолный путь к файлу слишком длинный
0FhНеверный диск

Строка сообщения об ошибке DOS 3.0+


В AH передаётся 5
Задание собственного обработчика для этого сервиса позволяет переопределить стандартные сообщения об ошибках

Вход:
DOS 3.x
    AL - Расширенный код ошибки
DOS 4.0+
    AL - тип ошибки
         = 1 - расширенный код ошибки
         = 2 - ошибка параметра
    BX - Код ошибки

Выход:
ES:DI - указатель на сообщение об ошибке
AL :
    = 0 - необходимо подставить в сообщение параметры (к примеру, имя диска)
    = 1 - Сообщения можно выводить сразу
Если произошла ошибка, то установлен флаг CF

Примечание:
Если в AL переданн 0 то функция работает как обычная функция проверки наличия резидентной программы, при этом в BX может содержаться мусор,а флаг CF будет сброшен.
При неудачном выполнении функцции могут быть разрушены значения в регистрах AX,ES,DI а так же изменены значения других флагов

Резидентная часть комманды ASSIGN DOS 3.0+


В AH передаётся 6
В некоторых источниках утверждается, что команда ASSIGN имеет номер 2, однако RBIL утверждает, что по номеру 2 располагается PC LAN Program.
ALподфункция
0Проверить наличие

Выход:
AL == 00h => не установлен, можно устанавливать
AL == 01h => не установлен, нельзя устанавливать
AL == FFh => установлен
1Получить состояние

Выход:
ES - сегмент, в котором сохранено состояние сервиса ASSIGN
По адресу ES:103h расположена 26-байтная таблица, в которой записано какой диск соответствует каждой букве диска. К примеру, если по адресу ES:103h записанно 1, то букве диска A: соответствует диск 1, а если по адресу ES:11Ch записанно 83h, то букве даска Z: соответствует диск 83h.

Резидентная часть драйвера DEVICE.SYS


В AH передаётся 08h
ALподфункция
0Проверить наличие

Выход:
AL == 00h => не установлен, можно устанавливать
AL == 01h => не установлен, нельзя устанавливать
AL == FFh => установлен
1Добавить блочное устройство

Вход:
DS:SI - таблица параметров устройства.

Выход:
AX, BX, SI и ES разрушенны.

Примечание:
Эта функция добавляет переданную таблицу в список известных системе блочных устройств.
2Выполнить запрос к драйверу устройства

Вход:
ES:BX - запрос.

Выход:
В стеке оставленно лишнее слово.

Примечание:
DOS 3.2 выполняет эту функцию при AL от 2 до F7h, в DOS 4+ для AL=3 определена другая функция.
3Получить таблицы параметров устройств DOS 4+

Выход:
DS:SI - первая таблица в списке.

Таблица параметров устройств
Версия для DOS 3.30
СмещениеРазмерОписание
00hDWORDУказатель на следующую таблицу (либо 0xFFFFh, если это последняя таблица)
04hBYTEНомер устройства BIOS
05hBYTEНомер устройства DOS (0 = A: ; 1 = B: ; ...)
06h19*BYTEBPB (cм. функцию 53h прерывания 21h)
19hBYTEФлаги :
Бит 6 - если установлен, то используется FAT16, иначе - FAT12
Остальные биты не определены
1AhWORDСчётчик ссылок на диск
1Ch11*BYTEИмя диска или "NO NAME    ", если оно не заданно.
Для несъёмных дисков всегда "NO NAME    "
27hBYTEНоль
28hBYTEТип устройства (см. функцию 44h подфункцию 0Dh прерывания 21h)
29hWORDФлаги:
Бит 0 - если установлен, то это несъёмный диск
Бит 1 - имеется сигнал смены носителя
Бит 2 - текущий BPB залочен
Бит 3 - все сектора на треке имеют одинаковый размер
Бит 4 - Физучиское устройство имеет несколько логических устройств
Бит 5 - current logical drive for shared physical drive (Что бы это означало?)
Бит 6 - Обнаружена смена диска
Бит 7 - Параметры устройства изменились (см. функцию 44h подфункцию 0Dh прерывания 21h)
Бит 8 - Диск был отфрматирован (BPB изменилась)
Бит 9 - флаг доступа (см. функцию 44h подфункцию 0Dh прерывания 21h)
Остальные биты не определенны
2BhWORDКол-во цилиндров
2Dh19*BYTEBPB для носителя с максимальной поддерживаемой ёмкостью
40h3*BYTEНеизвестно
43h9*BYTEНеизвестно (на MS-DOS 3.30 для несъёмных дисков записанно "NO NAME    ", в остальных случаях - нули)
4ChBYTEПоследний считанный байт???
4DhDWORDДля дисков со съёмным носителем:
Время последнего обращения к диску (0xFFFFFFFF если никогда)

Для несъёмных дисков:
Cлово по смещению 4Dh: - тип раздела (1 для расширенного и 0xFFFF для основного)
Слово со смещению 4Fh: - номер цилинлра, на котором начинается раздел

Версия для DOS 4+
СмещениеРазмерОписание
00hDWORDУказатель на следующую таблицу (либо 0xFFFFh, если это последняя таблица)
04hBYTEНомер устройства BIOS
05hBYTEНомер устройства DOS (0 = A: ; 1 = B: ; ...)
06h25*BYTEBPB (cм. функцию 53h прерывания 21h)
1FhBYTEФлаги :
Бит 6 - если установлен, то используется FAT16, иначе - FAT12
Бит 7 - неподдерживаемый диск (если установлен, то любая попытка дуступа приведёт к ошибке "Устройство не готово")
Остальные биты не определены
20hWORDСчётчик ссылок на диск
22hBYTEТип устройства (см. функцию 44h подфункцию 0Dh прерывания 21h)
23hWORDФлаги:
Бит 0 - если установлен, то это несъёмный диск
Бит 1 - имеется сигнал смены носителя
Бит 2 - текущий BPB залочен
Бит 3 - все сектора на треке имеют одинаковый размер
Бит 4 - Физучиское устройство имеет несколько логических устройств
Бит 5 - current logical drive for shared physical drive (Что бы это означало?)
Бит 6 - Обнаружена смена диска
Бит 7 - Параметры устройства изменились (см. функцию 44h подфункцию 0Dh прерывания 21h)
Бит 8 - Диск был отфрматирован (BPB изменилась)
Бит 9 - флаг доступа (см. функцию 44h подфункцию 0Dh прерывания 21h)
Остальные биты не определенны
25hWORDКол-во цилиндров
27h25*BYTEBPB для носителя с максимальной поддерживаемой ёмкостью
40h6*BYTEРезерв
46hBYTEНомер последнего считанного трека
47hDWORDДля дисков со съёмным носителем:
Время последнего обращения к диску (0xFFFFFFFF если никогда)

Для несъёмных дисков:
Cлово по смещению 4Dh: - тип раздела (1 для расширенного и 0xFFFF для основного). Для DOS 5+ всегда 1.
Слово со смещению 4Fh: - номер цилинлра, на котором начинается раздел (в DOS 4.0 для основного рзадела FFFFh)
4Bh11*BYTEИмя диска или "NO NAME    ", если оно не заданно.
56hBYTEНоль
57hDWORDСерийный номер
5Bh8*BYTEФайловая система, обычно "FAT16   " или "FAT12   "
63hBYTEНоль

Версия для COMPAQ DOS 3.31
СмещениеРазмерОписание
00hDWORDУказатель на следующую таблицу (либо 0xFFFFh, если это последняя таблица)
04hBYTEНомер устройства BIOS
05hBYTEНомер устройства DOS (0 = A: ; 1 = B: ; ...)
06h25*BYTEBPB (cм. функцию 53h прерывания 21h)
1Fh6*BYTEРезерв
25hBYTEФлаги :
Бит 5 - предположительно, большой раздел
Бит 6 - если установлен, то используется FAT16, иначе - FAT12
Остальные биты не определены
26hWORDПредположительно, счётчик ссылок на диск
28h11*BYTEИмя диска или "NO NAME    ", если оно не заданно.
Для несъёмных дисков всегда "NO NAME    "
33hBYTEНоль
34hBYTEТип устройства (см. функцию 44h подфункцию 0Dh прерывания 21h)
35hWORDФлаги:
Бит 0 - если установлен, то это несъёмный диск
Бит 1 - имеется сигнал смены носителя
Бит 2 - текущий BPB залочен
Бит 3 - все сектора на треке имеют одинаковый размер
Бит 4 - Физучиское устройство имеет несколько логических устройств
Бит 5 - current logical drive for shared physical drive (Что бы это означало?)
Бит 6 - Обнаружена смена диска
Бит 7 - Параметры устройства изменились (см. функцию 44h подфункцию 0Dh прерывания 21h)
Бит 8 - Диск был отфрматирован (BPB изменилась)
Бит 9 - флаг доступа (см. функцию 44h подфункцию 0Dh прерывания 21h)
Остальные биты не определенны
37hWORDКол-во цилиндров
39h25*BYTEBPB для носителя с максимальной поддерживаемой ёмкостью
52h6*BYTEРезерв
58hBYTEПоследний считанный байт???
59hDWORDДля дисков со съёмным носителем:
Время последнего обращения к диску (0xFFFFFFFF если никогда)

Для несъёмных дисков:
Cлово по смещению 4Dh: - тип раздела (1 для расширенного и 0xFFFF для основного)
Слово со смещению 4Fh: - номер цилинлра, на котором начинается раздел

Резидентная часть комманды SHARE DOS 3.0+


В AH передаётся 10h

Вход:
AX = 1000h

Выход:
AL == 00h => не установлен, можно устанавливать
AL == 01h => не установлен, нельзя устанавливать
AL == FFh => установлен

Примечание:
В DOS 3 при передачи в AL чего-либо отличного от нуля начинается бесконечный цикл. DOS 4, кроме нуля допускает ещё несколько значний, а во всех иных случаях всё так же впадает в цикл.
В DR DOS 5 , DR PalmDOS и Novell DOS 7 эта комнда не всегда корректно передаёт значение дальше по цепочке обработчиков.