
Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
Примечание 1: переустановить время и дату последнего изменения файла можно с помощью INT 21\AX=5701h: задаваемые значения принимаются из регистров CX и DX в той же форме.
Примечание 2: если командой ACCDATE (4.01) не заблокировано обслуживание сведений о времени создания файлов, то эти сведения можно аналогичным образом получить с помощью INT 21\AX=5706h и задать с помощью INT 21\AX=5707h. Дополнительно эти функции используют регистр SI для кода времени в 10-миллисекундных единицах.
Примечание 3: если командой ACCDATE (4.01) не заблокировано обслуживание сведений о последней дате доступа к файлам, то эту дату можно получить в DX с помощью INT 21\AX=5704h и задать с помощью INT 21\AX=5705h, причем при вызове надо задавать CX=0000h.
8.02-64 |
INT 21\AX=5800h – стратегия выделения памяти |
|
При вызове: |
|
|
|
AX |
= 5800h |
При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). |
||
Если флаг CF сброшен, то |
||
|
AX |
– код принятой стратегии, причем в этом слове |
|
биты 7 и 6: |
= 00 – использовать обыкновенную память; = 01 – использовать расширенную память;
= 10 – использовать обыкновенную память, только если расширенная недоступна;
биты 1 и 0:
=00 – выделять первый подходящий участок;
=01 – выделять участки оптимального размера;
=10 – выделять последний подходящий участок. биты 15-8 и 5-2 должны быть сброшены в нуль.
Примечание 1: обработчик прерывания INT 21\AX=5801h принимает в регистре BX такой же код стратегии и позволяет его переустановить.
Примечание 2: каждая программа, которая изменяет стратегию выделения памяти,
при завершении исполнения должна восстановить прежнюю стратегию.
Примечание 3: для пользования расширенной памятью задание соответствующей стратегии необходимо, но не достаточно: нужно еще в файле
CONFIG.SYS ввести команду DOS=UMB (4.08).
– 419 –

Глава 8: Вызовы обработчиков прерываний
8.02-65 |
INT 21\AH=59h – расширенные сведения об ошибке |
|
При вызове: |
|
|
|
AH |
= 59h |
|
BX |
= 0000h |
При возврате: содержимое регистров CL, DX, SI, BP и DS утрачивается, |
||
|
BH |
– класс ошибки из таблицы A.06-2 |
|
BL |
– рекомендуемые действия из таблицы A.06-3 |
|
CH |
– место возникновения ошибки из таблицы A.06-4 |
|
AX |
– код завершения из таблицы A.06-1; если AX=0022h, то |
ES:DI – адрес идентификатора (примечание 2 к A.06-1).
Примечание 1: предоставляемые сведения считываются из области текущих данных DOS (A.01-3).
Примечание 2: сведения об ошибке можно записать в область текущих данных DOS с помощью INT 21\AX=5D0Ah; перед вызовом надо указать в DS:DX адрес блока данных (A.07-4), из которого будут взяты
|
|
значения для регистров AX, BX, CX, DX, DI и ES. |
8.02-66 |
INT 21\AH=5Ah – создание и открытие временного файла |
|
При вызове: |
|
|
|
AH |
= 5Ah |
|
CX |
– атрибуты файла согласно таблице A.09-2 |
DS:DX – указатель на строку с путем, заканчивающимся знаком обратной косой черты "\", за которым следуют 13 байтов 00h – это место для автоматически формируемого имени.
При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, то:
AX – номерная ссылка на созданный файл; DS:DX– указатель на строку с путем и именем файла.
Примечание 1: присваиваемое файлу имя уникально, конфликт имен исключается. Примечание 2: корневые каталоги дисков имеют ограниченный объем, и когда этот
объем заполнен, файл в корневом каталоге создать нельзя. Примечание 3: к моменту завершения работы программы, создавшей временный
файл, этот файл должен быть закрыт и удален.
8.02-67 |
INT 21\AH=5Bh – создание и открытие нового файла |
|
При вызове: |
|
|
|
AH |
= 5Bh |
|
CX |
– атрибуты файла согласно таблице A.09-2 |
– 420 –

Глава 8: Вызовы обработчиков прерываний
DS:DX – указатель на строку с именем файла. Перед именем может быть указан путь. Строка должна кончаться байтом 00h.
При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, то состояние DS:DX сохранено, и тогда
AX – номерная ссылка на созданный файл.
Примечание 1: обработчик прерывания INT 21\AH=5Bh не создаст файл, если файл с таким же именем в указанном каталоге уже существует.
Примечание 2: корневые каталоги дисков имеют ограниченный объем, и когда этот объем заполнен, файл в корневом каталоге создать нельзя.
Примечание 3: обработчик прерывания INT 21\AH=3Ch делает то же самое на базе тех же спецификаций (кроме AH), но при наличии одноименного файла в каталоге назначения не сообщает об ошибке, а "обрезает" этот файл до нулевой длины. В результате пропадает ссылка на первый кластер файла, и восстановить его оказывается намного сложнее, чем после обычного удаления с помощью INT 21\AH=13h (8.02-13) или INT 21\AH=41h (8.02-37).
8.02-68 INT 21\AX=5D00h – серверное обслуживание вызовов
Обработчик прерывания INT 21\AX=5D00h предоставляет шаблон, по которому можно вызвать любую функцию прерывания INT 21, причем эта функция будет исполняться как отдельный процесс, включая возможности избирательного и многократного исполнения. В частности, при серверном вызове INT 21\AH=3Dh предоставляется возможность задать маску атрибутов (A.07-2) для открываемого файла, а при серверном вызове операций переименования (INT 21\AH=56h) и удаления (INT 21\AH=41h) – возможность переименовывать и удалять группы файлов по маске имени с использованием знаков подстановки (2.01-03).
При вызове:
AX = 5D00h
DS:DX – указатель на блок данных, показанный в таблице A.07-4; там записываются состояния всех регистров, подготовленные для вызова запрашиваемой функции.
При возврате состояние определяется той функцией, вызов которой был запрошен.
Примечание 1: правильность исходных данных при серверном вызове не проверяется. Вызов несуществующей функции из-за неверного значения для регистра AH обычно ведет к зависанию компьютера.
Примечание 2: передаваемые по ссылкам имена надо заранее перевести в каноническую форму с помощью INT 21\AH=60h (8.02-72).
– 421 –

Глава 8: Вызовы обработчиков прерываний
8.02-69 INT 21\AX=5D01h – закрытие всех файлов указанного процесса
Обработчик прерывания INT 21\AX=5D01h записывает из буферов на диск все данные, относящиеся к закрываемым файлам, и обновляет соответствующие записи в каталогах. Если остаются открытыми файлы, доступ к которым осуществляется по сети, то производится обращение к обработчику прерывания INT 2F\AX=1107h.
При вызове:
AX = 5D01h
DS:DX – указатель на блок данных, показанный в таблице A.07-4,
причем там принимаются во внимание только идентификаторы компьютера и процесса (смещения 12h и 14h), а значения для всех регистров игнорируются.
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.
8.02-70 INT 21\AX=5D06h – адрес области SDA
Функции DOS записывают данные об исполняемом процессе, которые бывают нужны тем же или другим функциям DOS, вызываемым позднее из того же процесса. Однако исполняемый процесс может быть прерван другим процессом – вызванной резидентной программой или обработчиком прерывания. Функции DOS, вызываемые этим другим процессом, запишут данные о другом исполняемом процессе, искажая прежние данные, которые относились к прерванному процессу.
Эти искажения воспрепятствуют правильному возобновлению прерванного процесса. Во избежание подобных конфликтов необходимые данные надо копировать в безопасное место и потом восстанавливать. Поэтому область записи данных, необходимых для возобновления прерванного процесса, названа Swappable Data Area (SDA), то есть областью перекачиваемых данных. Элементы структуры данных в области SDA показаны в таблице A.01-3. Обработчик прерывания INT 21\AX=5D06h предоставляет адрес области SDA и сведения о том, какую ее часть в каком случае надо сохранять.
При вызове: |
|
AX |
= 5D06h |
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). |
|
Если флаг CF сброшен, то: |
|
DS:SI – указатель на начало области SDA (A.01-3), |
|
CX |
– размер в байтах всей области SDA, включая сведения о |
|
процессе и стеки DOS. Всю область SDA надо сохранять для |
|
правильного возобновления прерванной функции DOS. |
– 422 –

Глава 8: Вызовы обработчиков прерываний
DX – размер в байтах части области SDA со сведениями о процессе. Эту часть надо сохранять, когда прерванный процесс не является функцией DOS.
Примечание 1: сохранение данных из SDA не требуется, если прерывающий
процесс не пользуется вызываемыми функциями DOS. Примечание 2: INT 21\AX=5D06h – это тоже функция DOS, и ее опасно вызывать,
когда прерывание уже произошло, а данные из области SDA еще не сохранены. Поэтому рекомендуется вызывать INT 21\AX=5D06h заранее, во время инициализации резидентной программы или драйвера, чтобы возвращенными сведениями можно было бы пользоваться потом в любой момент.
8.02-71 |
INT 21\AX=5F08h – скрыть логический диск |
|
При вызове: |
|
|
|
AX |
= 5F08h |
|
DL |
– номер диска (примечание 1 к 8.02-10) |
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.
Примечание 1: обработчик прерывания INT 21\AX=5F08h вносит изменения не в разметку физического диска, а только в структуры таблиц DOS (A.03), проверяя при этом наличие данных, обеспечивающих возможность восстановления доступности диска в дальнейшем. Если диск неправильно зарегистрирован или недействителен, то миссия INT 21\AX=5F08h завершается неудачно.
Примечание 2: обработчик прерывания INT 21\AX=5F07h принимает такие же спецификации вызова (кроме AX), но выполняет обратную операцию: снова делает действительным скрытый логический диск.
8.02-72 INT 21\AH=60h – приведение пути и имени в канонический вид
Действие обработчика прерывания INT 21\AH=60h идентично действию команды TRUENAME, описанному в разделе 3.29. Преобразование спецификаций
пути и имени в канонический вид является условием успешного выполнения многих функций DOS и позволяет заранее выявить ошибки, которые потом могли бы привести к нежелательным последствиям.
При вызове:
AH = 60h
DS:SI – указатель на строку до 64 байт с именем, которому может предшествовать путь. Строка должна кончаться байтом 00h.
– 423 –

Глава 8: Вызовы обработчиков прерываний
ES:DI – указатель на 128-байтовый буфер для размещения результата преобразования.
При успешном завершении флаг CF сброшен, данные в AX утрачены, строка приведена в канонический вид и записана в подготовленный буфер.
При неудаче флаг CF установлен, буфер не изменен, в AX– код завершения:
AX = 0002h – элемент спецификации неправилен или отсутствует; = 0003h – ошибка композиции или неверная буква диска.
Примечание 1: существование предъявленных пути и имени не проверяется. Примечание 2: нельзя применять INT 21\AH=60h по отношению к сетевым путям.
8.02-73 INT 21\AH=62h – сегментный адрес PSP исполняемой программы
DOS использует сегментный адрес PSP в качестве идентификатора того процесса, который исполняется компьютером в данный момент. Смена идентификатора – ключевая операция для осуществления многозадачного режима исполнения программ, она включает считывание текущего адреса PSP из SDA (A.01-3) с помощью INT 21\AH=62h, запоминание его, и запись в SDA нового значения. По завершении миссии процесса управление должно быть передано
назад прерванной программе с восстановлением прежнего значения идентификатора в SDA. В ряде других ситуаций также приходится обращаться к INT 21\AH=62h для выяснения истинного адреса PSP (пример – в разделе 9.07-02).
При вызове: |
|
AH |
= 62h |
При возврате: |
|
BX |
– сегментный адрес PSP исполняемой программы. |
Примечание 1: новое значение сегментного адреса PSP записывается в SDA с помощью INT 21\AH=50h, принимающего это новое значение из регистра BX. Помимо AH=50h и BX, другие исходные данные не требуются.
8.02-74 |
INT 21\AX=6501h – сведения о национальной адаптации |
|
При вызове: |
|
|
|
AX |
= 6501h |
|
BX |
– кодовая страница в шестнадцатеричной форме, или иначе |
|
|
= FFFFh – запрос сведений об установленной кодовой странице |
|
CX |
– размер буфера для блока данных, не менее 29h байт |
|
DX |
– идентификатор страны, или иначе |
|
|
= FFFFh – для страны, под которую DOS адаптирована сейчас |
|
ES:DI – указатель на буфер для блока данных, не менее 29h байт |
– 424 –

Глава 8: Вызовы обработчиков прерываний
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). При успешном завершении флаг CF сброшен, и тогда
ES:DI – указатель на буфер, заполненный блоком данных (A.02-4) CX – размер записанного в буфер блока данных.
Примечание 1: вызовы INT 21\AX=6502h, 6504h, 6505h, 6506h используют те же исходные данные (кроме AX), но в буфере ES:DI возвращают только один 4-байтовый указатель, записываемый начиная со смещения 01h:
INT 21\AX=6502h возвращает указатель на таблицу соответствия заглавных букв, в первом слове которой записан ее размер, а далее следуют 128 заглавных эквивалентов для знаков с номерами от 80h до FFh.
INT 21\AX=6504h возвращает указатель на таблицу соответствий, которая имеет такую же структуру, но применяется только по отношению к именам файлов.
INT 21\AX=6505h возвращает указатель на таблицу ограничений для имен файлов (A.02-5).
INT 21\AX=6506h возвращает указатель на таблицу, в первом слове которой записан ее размер, а далее следуют 256 байтов, задающих порядок сортировки для знаков с номерами от 00h до FFh.
Примечание 2: сведения, касающиеся других стран и других кодовых страниц, которые не установлены в данный момент, не выдаются, если не установлена резидентная программа NLSFUNC.EXE (5.02-03).
Примечание 3: параметры адаптации можно записать заново посредством INT 21\AX=7002h, принимающего в DS:SI указатель на таблицу A.02-4 с новыми данными, а в CX – длину этой таблицы, обычно 0026h байт. При успешном завершении флаг CF сброшен, а в CX – количество записанных байт. При неудачном завершении флаг CF установлен, AX = 7000h означает, что функция не поддерживается, а другие значения кода завершения соответствуют таблице A.06-1.
8.02-75 |
INT 21\AX=6521h – перевод национальных букв в заглавные |
|
При вызове: |
|
|
|
AX |
= 6521h |
|
CX |
– длина преобразуемой строки |
|
DS:DX – указатель на строку, которую надо преобразовать |
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). При успешном завершении флаг CF сброшен, строка преобразована.
– 425 –

Глава 8: Вызовы обработчиков прерываний
Примечание 1: INT 21\AX=6522h делает то же самое, но игнорирует число в CX и требует, чтобы конец строки был отмечен байтом 00h.
Примечание 2: для перевода одного знака используют INT 21\AX=6520h. Код знака принимается и возвращается в DL, данные в CX и DS игнорируются.
8.02-76 INT 21\AH=67h – изменение размера таблицы номерных ссылок
По умолчанию программа может пользоваться одновременно не более чем двадцатью номерными ссылками: это число определяется длиной таблицы JFT (смещение 18h в таблице A.07-1). Обработчик прерывания INT 21\AH=67h создает таблицу JFT произвольной длины за пределами префикса сегмента программы (PSP), снимая тем самым ограничение на количество номерных ссылок, вызываемое стандартным размещением таблицы JFT.
При вызове: |
|
AH |
= 67h |
BX |
– предельное количество используемых номерных ссылок |
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.
Примечание 1: если таблица JFT располагается в PSP, и задаваемое число в BX не превосходит 20, то никакие действия не предпринимаются.
Примечание 2: если таблица JFT уже выведена за пределы PSP, содержит не более 20 номерных ссылок, и задаваемое в BX значение также не превышает 20, тогда таблица JFT копируется обратно в PSP.
Примечание 3: если имеющиеся в таблице JFT номерные ссылки не вмещаются в тот уменьшенный размер, который задан в регистре BX, то миссия кончается неудачно с AX=0004h (открыто слишком много файлов).
Примечание 4: число открываемых файлов ограничено не только таблицей JFT, но также и таблицей SFT (A.01-4), длина которой определяется командой FILES (4.12) в конфигурационном файле CONFIG.SYS.
Примечание 5: при любом размере и расположении таблицы JFT производные (дочерние) процессы наследуют не более 20 номерных ссылок.
8.02-77 INT 21\AX=6900h – считывание метки тома и типа FAT
Вызов INT 21\AX=6900h возвращает такую же таблицу A.04-1, какую возвращает INT 21\AX=440Dh\CX=4866h, но только не производит обращения к обработчику критической ошибки в случае неудачи считывания данных с носителя. Все возможные ошибки будут отражены кодом завершения в регистре AX.
– 426 –

Глава 8: Вызовы обработчиков прерываний
При вызове: |
|
AX |
= 6900h |
BH |
= 00h |
BL |
– номер диска (примечание 1 к 8.02-17) |
DS:DX – указатель на 26-байтовый буфер для блока данных
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то данные в AH утрачены, и
DS:DX – указатель на буфер с блоком данных (A.04-1).
Примечание 1: возвращаемый блок данных, начиная со смещения 02h, копируется из байтов 27h – 3Dh расширенной таблицы BPB (A.03-4).
Примечание 2: возвращаемое значение 0005h кода завершения означает, что расширенная таблица BPB для данного диска отсутствует.
Примечание 3: с помощью INT 21\AX=6900h нельзя запрашивать данные о дисках, доступ к которым осуществляется по сети (код завершения 0001h).
Примечание 4: обработчик прерывания INT 21\AX=6901h выполняет обратную операцию: он принимает в DS:DX указатель на блок данных A.04-1 и записывает эти данные в расширенную таблицу BPB. Все другие спецификации вызова (кроме AX) такие же.
8.02-78 INT 21\AX=6C00h – открытие файла для доступа
Номерная ссылка для доступа к объекту может быть получена посредством любой из двух функций: INT 21\AH=3Dh (8.02-33) и INT 21\AX=6C00h, однако
последняя предоставляет расширенные возможности задать свойства номерной ссылки и предписываемые действия.
При вызове: |
|
AX |
= 6C00h |
BH |
– флаги: |
|
бит 4 – разрешить размер сверх 2 Гбайт (для FAT-32) |
|
бит 5 – сообщать об ошибке, не вызывая INT 24h |
|
бит 6 – исполнять запись сразу, без буферирования |
BL |
– условия доступа согласно таблице A.09-4 |
CX |
– атрибуты файла (A.09-2), если его предстоит создать |
DH |
= 00h |
DL |
– предписываемое действие: |
|
= 01h – открыть существующий файл, а если такой файл не |
|
существует, то сообщить об ошибке; |
|
= 10h – открыть новый файл, а если одноименный файл уже |
|
существует, то сообщить об ошибке; |
|
= 11h – открыть файл; если такого файла нет, то создать его; |
– 427 –

Глава 8: Вызовы обработчиков прерываний
= 12h – открыть новый файл, а если одноименный файл уже существует, то удалить его и создать заново.
DS:SI – указатель на строку с именем файла, которому может предшествовать путь. Знаки подстановки в имени файла не допускаются. Строка должна кончаться байтом 00h.
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF при завершении сброшен, то:
AX |
– номерная ссылка на открытый файл |
|
CX |
– результат действия: |
|
|
= 0001h |
– открыт существующий файл |
|
= 0002h |
– открыт файл, который не существовал и был создан |
|
= 0003h |
– открыт файл, созданный взамен удаленного файла |
Примечание 1: предписываемое действие DL = 11h не поддерживается на дисках, доступ к которым осуществляется по сети.
Примечание 2: после выполнения операций с дисками, доступ к которым осуществляется по сети, статус в регистре CX не возвращается.
Примечание 3: если файл создается заново, то задаваемые в регистре BX состояния флагов заносятся в таблицу SFT (A.01-4).
Примечание 4: указатель места доступа устанавливается на начало файла. Примечание 5: наличие атрибутов H (скрытый) и S (системный) не является
препятствием для открытия существующего файла.
8.02-79 INT 21\AX=7302h – копирование блока параметров диска (DPB)
Обработчик прерывания INT 21\AX=7302h копирует в предоставленный буфер расширенный блок параметров (DPB, A.03-1) запрошенного диска, имеющего файловую систему FAT-12, FAT-16 или FAT-32.
При вызове: |
|
AX |
= 7302h |
DL |
– номер запрашиваемого диска (примечание 1 к 8.02-17) |
CX |
– длина предоставляемого буфера, не менее 3Dh байт |
ES:DI – указатель на предоставляемый буфер для данных
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то таблица DPB скопирована (примечание 2)
Примечание 1: в отличие от подобных функций INT 21\AH=1Fh и INT 21\AH=32h (8.02-24), функция INT 21\AH=7302h недоступна в предыдущих версиях DOS и нуждается в том, чтобы система BIOS компьютера поддерживала расширенный набор функций прерывания INT 13 (8.01-55).
– 428 –