Подф. 0eh: Выяснить, назначил ли драйвер устройства несколько логических устройств одному физическому устройству
Вход BL = ID диска (0 = текущий, 1=A, и т.д.)
Выход AX = код ошибки, если CF установлен
AL = 0 если ровно одна буква диска назначена устройству BL
AL = (1 = A, 2 = B и т.д.) если назначено несколько логических устройств, AL содержит ID текущего назначенного диска
Подф. 0fh: Сообщить драйверу блочного устройства ID устройства для обработки. Когда с физическим устройством ассоциируется несколько логических, DOS выдает сообщение "Insert diskette for drive X:...". Эта функция позволяет вам сообщать DOS, что диск с указанным ID уже установлен, тем самым обходя сообщение.
Вход BL= ID диска (0 = текущий, 1=A, и т.д.)
Выход AX= код ошибки, если CF установлен
AL = 0 если ровно один ID назначен устройству BL
AL = (1=A, 2=B и т.д.) ID выбранного устройства, которое будет использоваться в последующих операциях вода/вывода.
Замечание: Эта функция должна вызываться перед любой операцией вода/вывода на логическом устройстве. Иначе DOS может выдать сообщение.
Функция 45h: Дублировать дескриптор файла (DUP)
Вход AH = 45h
BX = существующий дескриптор файла
Выход AX = новый дескриптор файла, дублирующий оригинал
АХ = код ошибки, если CF установлен
Описание: Функция создает дополнительный дескриптор файла, ссылающийся на тот же поток вода/вывода, что и существующий дескриптор. Любое продвижение указателя чтения/записи для одного дескриптора действует на его дубликат, включая любые операции чтения, записи или перемещения указателя посредством функции 42h LSEEK. Новый дескриптор наследует ограничения Режима Открытия оригинала. Эта функция используется с одной главной целью: вы можете закрыть дескриптор, заставляя DOS записать файловые буферы. Такой способ DUP/CLOSE быстрее, чем закрытие и повторное открытие файла.
Функция 46h: Переназначить дескриптор (FORCDUP)
Вход AH = 46h
BX = целевой дескриптор файла (уже должен существовать)
CX = исходный дескриптор файла (уже должен уже существовать)
Выход AX = код ошибки, если CF установлен
Описание: Заставляет дескриптор файла (handle) ссылаться на другой файл или устройство. Дескриптор в CX (источник) закрывается, если он открыт, а затем становится дубликатом дескриптора в BX (назначения). Иными словами, дескрипторы в CX и BX будут ссылаться на один и тот же физический файл или устройство. Используется для переназначения стандартного устройства ввода/вывода. Пример: Откроем файл "C:\STDOUT.TXT" через функцию 3dh Open File и получим дескриптор (например, 05). Установим BX=05, CX=01 и вызовем эту функцию. (Замечание: дескриптор 01 - это предопределенный дескриптор "стандартного выходного устройства"). Теперь можно вызвать функцию 3eh Close File и закрыть handle 05. Можно обращаться к файлу STDOUT.TXT через дескриптор 01. Стало быть, дисковый файл "C:\STDOUT.TXT" будет отныне получать весь вывод, создаваемый всеми процессами (текущим и порожденными), через любую функцию символьного ввода/вывода DOS, так же, как и любой вывод в дескриптор файла 01 через функцию DOS 40h. Когда вы выходите в COMMAND.COM, предопределенные дескрипторы устанавливаются на обычные устройства (например, дескриптор 01 устанавливается на "CON").
Функция 47h: Дать текущий каталог DOS
Вход AH = 47h
DS:SI = адрес буфера для указания пути (64 байта)
DL = номер диска (0 = текущий, 1 = A, и т. д.)
Выход AX = код ошибки, если CF установлен
Описание: В пользовательский буфер по адресу DS:SI помещается в форме ASCIIZ путь текущего каталога для диска, указанного в DL. Путь возвращается в формате: "путь\каталог",0. Впереди не подставляется буквенное обозначение диска, а сзади не подставляется символ "\". Например, если текущим является корневой каталог, эта функция вернет вам пустую строку (DS:[SI] = 0).
Функция 48h: Распределить память (дать размер памяти)
Вход AX = 48h
BX = размер запрашиваемой памяти в параграфах
Выход AX = сегментный адрес распределенного блока (если нет ошибок). При ошибке: AX = код ошибки, если установлен CF
BX = размер доступной памяти в параграфах (если памяти не хватает)
Описание: Распределяет блок памяти размером в BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, взводится флаг переноса CF, а в AX возвращается код ошибки; BX при этом содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный фрагмент, обычно перед вызовом устанавливают BX=0ffffh. Функция завершится с ошибкой, возвратив размер максимального доступного блока памяти в BX.
Замечание: Когда процесс получает управление через функцию 4bh EXEC, вся доступная память уже распределена ему.
Функция 49h: Освободить распределенный блок памяти
Вход AH = 49h
ES = сегментный адрес (параграф) освобождаемого блока памяти
Выход AX = код ошибки, если CF установлен
Описание: Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, вы должны освобождать лишь те блоки памяти, которые вы получили через функцию 48h Распределить Память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует вам освобождать память чужих процессов.
Функция 4ah: Сжать или расширить блок памяти
Вход AH = 4ah
ES = сегмент распределенного блока памяти
BX = желаемый размер блока в 16-байтовых параграфах
Выход AX = код ошибки, если CF установлен
BX = наибольший доступный блок памяти (если расширение неудачно)
Описание: Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4bh EXEC уже распределила блок памяти, начинающийся с PSP и содержащий всю доступную память. Чтобы освободить память для запуска порождаемых процессов, необходимо сначала сжать блок памяти, начинающийся с PSP.
Замечание: Функция 31h (KEEP) и int 27h (TSR) сжимают блок по адресу PSP.
Функция 4bh: Выполнить или загрузить программу (EXEC)
Вход AH = 4bh
DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу
ES:BX = адрес EPB (EXEC Parameter Block - блока параметров EXEC)
AL = 0 Загрузить и выполнить
AL = 3 Загрузить программный оверлей
Выход AX = код ошибки, если CF установлен
Описание: Функция предоставляет средства одной программе (процессу-родителю) вызвать другую программу (порожденный процесс), которая по завершению возвратит управление процессу родителю. Адрес DS:DX указывает на строку ASCIIZ в форме: "d:\путь\имя_файла",0. Если диск или путь опущены, они подразумеваются по умолчанию. ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL. AL=0 EXEC: Так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4ah до вызова EXEC (AL=0). Обычная последовательность:
1. Вызовите функцию 4ah с ES=сегменту PSP и BX=минимальному объему памяти, требуемой вашей программе (в параграфах).
2. Подготовьте строку ASCIIZ со спецификацией вызываемого программного файла и установите DS:DX на первый символ этой строки.
3. Подготовьте Блок Параметров EXEC со всеми необходимыми полями.
4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS - это единственная точка для ссылок после того, как EXEC вернет управление от порожденного процесса).
5. Выдайте вызов EXEC с AL=0.
6. Восстановите локальные значения SS и SP.
7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC.
8. Восстановите DS, ES и локальную DTA, если это необходимо.
9. Проверьте код выхода через функцию 4dh WAIT (если надо).
Все открытые файлы дублируются, так что порожденный процесс может обрабатывать данные как через дескрипторы файлов, так и через стандартный ввод/вывод. Режимы доступа дескрипторов дублируются, но любые активные блокировки файлов не будут относиться к порожденному процессу (см. функцию 5ch). После возврата из порожденного процесса, в векторах int 22h Terminate, int 23h CtrlBreak и int 24h Critical Error восстанавливаются их исходные значения. AL=3 LOAD: Эта подфункция используется для загрузки "оверлея". DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на "LOAD"-версию Блока Параметров EXEC. Главная особенность этой подфункции заключается в том, что она считывает Заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ типа.EXE.
Замечания: Эта функция использует программу-загрузчик из COMMAND.COM, который транзитен в DOS 2.x (и, возможно, уже перекрыт программой). В этом случае возникнет ошибка, если DOS не найдет файл COMMAND.COM. Перед вызовом этой функции следует обеспечить корректную строку COMSPEC= в окружении. Вместо разбора собственных FCB (как требуется для EPB), вы можете загрузить и выполнить вторичную копию файла COMMAND.COM, используя опцию /C. Например, чтобы выполнить программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ: "\command.com",0 и установите EPB+2 на сегмент и смещение следующей строки команд: 0eh,"/c format a:/s/4",0dh. Такой вторичный интерпретатор команд использует очень мало памяти (около 4K). Вы можете поискать в Окружении DOS строку COMSPEC=, чтобы установить точное местоположение файла COMMAND.COM.
Функция 4ch: Завершить программу (EXIT)
Вход AH = 4ch
AL = код возврата
Описание: Возвращает управление от порожденного процесса его родителю, устанавливая код возврата, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершаемой программы. В векторах Ctrl-Break и Critical Error восстанавливаются старые значения, сохраненные в родительском PSP.
Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода возврата самой последней программы.
Функция 4dh: Дать код возврата программы (WAIT)
Вход AH = 4dh
Выход AL = код возврата последнего завершившегося процесса
AH = 0 - нормальное завершение
АН = 1 - завершение через Ctrl-Break int 23h
АН = 2 - завершение по критической ошибке устройства int 24h
АН = 3 - завершение через функцию 31h KEEP
Описание: Возвращает код возврата последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.
Функция 4eh: Найти 1-й совпадающий файл
Вход AH = 4fh
DS:DX = адрес строки ASCIIZ с именем файла (допускаются ? и *)
CX = атрибут файла для сравнения
Выход AX = код ошибки, если CF установлен, DTA заполнена данными
(если не было ошибки)
Описание: DS:DX указывает на строку ASCIIZ в форме: "d:\путь\имя_файла",0. Если диск и/или путь опущены, они подразумеваются по умолчанию. Символы замены * и ? допускаются в имени файла и расширении. DOS находит имя первого файла в каталоге, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA, как показано ниже:
DTA | |||
Смещение | Длина | Содержимое | Примечания |
+0 | 15h | Резерв | Используется в последующих вызовах 4fh Find Next |
+15h | Атрибут | Атрибут искомого файла | |
+16h | Время | Время создания/модификации в формате filetime | |
+18h | Дата | Дата создания/модификации в формате filedate | |
+1ah | Младший, старший | Размер файла в байтах в формате DWORD | |
+1eh | 0dh | Имя файла | 13-байтовое ASCIIZ имя: "filename.ext",0 |
+2ch | Требуемый размер буфера |
Замечания: Атрибут файла обычно используется во "включающем" поиске. Если вас интересуют как файлы, так и каталоги, установите бит атрибута 4 (т.е. attr = 10h). См. Атрибут файла для полной информации. Типичная последовательность, используемая для поиска всех подходящих файлов: используйте вызов 1ah, чтобы установить DTA на локальный буфер (или используйте текущую DTA в PSP по смещению 80h); установите CX=атрибут, DS:DX => ASCIIZ диск, путь, обобщенное имя; вызовите функцию 4eh (Найти 1-й); если флаг CF указывает ошибку, вы закончили (нет совпадений); установите DS:DX => DTA (или на данные, которые вы скопировали из DTA после вызова функции 4eh); повторять поиск последующих файлов с использованием функции 4fh (Найти следующий), пока установленный флаг переноса (CF) не покажет, что совпадений больше нет.
Функция 4fh: Найти следующий совпадающий файл
Вход AH = 4fh
DS:DX = адрес данных, возвращенных предыдущей функцией 4eh Найти 1-й файл
Выход AX = код ошибки, если CF установлен DTA заполнена данными
Описание: DS:DX указывает на буфер размером 2bh байтов с информацией, возвращенной функцией 4eh <<Найти 1-й файл>> (либо DTA, либо буфер, скопированный из DTA). Используйте эту функцию после вызова 4eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. функцию 4eh о структуре файловой информации в буфере, заполняемом DOS).
Функция 54h: Дать переключатель верификации DOS
Вход AH = 54h
Выход AL = 0, если верификация выключена (OFF)
AL = 1 если верификация включена (ON)
Описание: Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2eh позволяет установить/изменить режим верификации.
Функция 56h: Переименовать/переместить файл
Вход AH = 56h
DS:DX = адрес старого ASCIIZ имени (путь/имя существующего файла)
ES:DI = адрес нового ASCIIZ имени (новые путь/имя)
Выход AX = код ошибки, если CF установлен
Описание: DS:DX и ES:DI указывают на строки ASCIIZ: "d:\путь\имя_файла",0. Старое имя DS:DX должно соответствовать существующему файлу и не может содержать символов замены. Диск и путь необязательны (если опущены, они принимаются по умолчанию). Новое имя ES:DI должно описывать НЕ существующий файл. Если указан диск, он должен быть тем же, что и в старом имени. Если диск или путь опущены, принимаются текущие значения. Если старое и новое имя содержат разные пути (явно или принятые по умолчанию), то элемент каталога для файла ПЕРЕМЕЩАЕТСЯ в каталог, указанный в новом имени.
Замечание: Если ID диска в старом имени отличается от текущего диска DOS, не забывайте указывать такой же ID диска в новом имени.