CodeNet / Платформы / Другие платформы / DOS / Прерывания DOS и BIOS
Функции DOS -
Вход:
- AH = номер мультиплексного процесса
- 01H = резидентная порция команды DOS 'PRINT'
- 02H = резидентная порция команды DOS 'ASSIGN'
- 10H = резидентная порция команды DOS 'SHARE'
- 03H-7fH (зарезервировано)
- 80H-0ffH (доступно для других процессов)
- AL = номер подфункции
- прочие = зависят от подфункций и конкретных мультиплексных процессов
Выход:
- AX = код ошибки, если взведен флаг CF (для процессов DOS)
- AL = статус установки (для процессов DOS)
- 00H = не установлен. можно устанавливать
- 01H = не установлен. Нельзя устанавливать
- ffH = установлен
Этот вектор (0000:00bc) предоставляет средства управления процессами, доступные всей системе из любого приложения.
Каждый процесс должен включить себя в цепочку прерываний с этим кодом, и каждый процесс в цепочке должен проверять AH на свой мультиплексный номер процесса. Если запрос относится к другому процессу, активный процесс должен передать управление по первоначальному адресу прерывания 2fH (по адресу, который был в векторе 0:00bc перед тем, как текущий процесс установил себя).
Версии DOS:
INT 2fH не определено для более ранних версий, чем DOS 3.0 В DOS 3.0, INT 2fH определено ТОЛЬКО для PRINT, и значение AH (которое определяет номер процесса) не определено. В DOS 3.2, этот вектор определен так, как описано выше.
Print Spooler:
- AH=1 (или AH=что угодно для DOS 2.x) это - интерфейс, определяемый для фоновой печати (печатного спулинга) после выполнения команды DOS 'PRINT'.
- AL - номер подфункции (0-5). все подфункции могут возвращать ошибки (см. ниже).
- AL = 0: опросить статус установки процесса
- Выход:
- AL = 00H = не установлен, можно устанавливать
- AL = 01H = не установлен, нельзя устанавливать
- AL = ffH = установлен
- AL = 1: направить файл к спулеру
- DS:DX => направляемый пакет
- смещение 0 =уровень (всегда 0 для DOS 3.0, 3.1 и 3.2)
- смещение 1 =DWORD адрес (смещение,сегмент) строки ASCIIZ, содержащей диск, путь и имя файла, направляемого в очередь печати (глобальные - обобщенные - имена НЕ допускаются)
- AL = 2: снять выбранные файлы
- DS:DX => строка ASCIIZ с именем удаляемого из очереди файла (глобальные символы допускаются в имени)
- AL = 3: Снять все файлы (удалить все файлы из очереди и остановить печать)
- AL = 4: статус. возвращает счетчик ошибок и задерживает очередь для изучения.
используйте подфункцию 5, чтобы освободить очередь.
Возвращает: DS:SI => блок описания файла в очереди. Один или несколько блоков с ASCIIZ-именами файлов. Конец блока отмечается именем, начинающимся с 00H.
DX = счетчик последовательных ошибок, встретившихся при попытке вывода последнего символа.
- AL = 5: конец статуса. Освобождает очередь для продолжения печати.
- AL = 0f8H-0ffH: (резервируется для DOS)
Ошибки спулера:
Если установлен флаг CF, то AX содержит код ошибки:
- AX = 1 - неверный номер функции
- AX = 2 - файл не найден
- AX = 3 - Путь не найден
- AX = 4 - Слишком много файлов (нет доступных описателей)
- AX = 5 - доступ отвергнут
- AX = 6 - неверный описатель (handle)
- AX = 8 - переполнение очереди
- AX = 9 - Занято
- AX = 0Ch - Путь и имя файла превышают 64 символа
- AX = 0Fh - неверный диск
Assign
AH=2 - мультиплексный номер для резидентной порции команды DOS 'ASSIGN'. Определена только подфункция AL=0 (дать статус установки).
Share
AH=10H - мультиплексный номер резидентной порции команды DOS 'SHARE'. Определена только подфункция AL=0 (дать статус установки).
Создание собственного процесса
Руководство DOS Tech Ref разъясняет, что вы можете использовать INT 2fH как вход для установки и доступа к вашему собственному резидентному процессу. Идея состоит в следующем: если вы произвольно используете вектор прерывания для вашего собственного доступа, то вы подвергаетесь определенному риску, особенно в мультизадачной системе. если же вы используете предлагаемую мультиплексную "цепочку", то DOS знает о вас, и ваш вектор не будет перекрыт другим обработчиком. Одна возможная проблема: нет предопределенного способа определить мультиплексный номер вашего процесса (регистр AH). Плохо привязываться к конкретному числу, ибо нет гарантии, что другой процесс не будет использовать этот же номер. Вы должны предусмотреть какую-то логику, гарантирующую вам четкое опознание вашего процесса.
Ваш процесс должен по меньшей мере использовать подфункцию AL=0, чтобы вы могли выяснить, не был ли процесс уже установлен ранее.
Замечание:
Если ваш процесс использует сервис DOS, или выполняется с незамаскированными прерываниями, то он должен быть реентерабельным.