Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
Примечание 1: номер версии, возвращаемый данной функцией, не подменяется данными драйвера SETVER.EXE (в отличие от INT 21\AH=30h).
Примечание 2: эта функция не поддерживается версиями DOS меньше 5.00. Помимо AL=FFh, о версии DOS меньше 5.00 могут свидетельствовать значения в BL менее 05h или в BH более 64h.
8.02-28 INT 21\AH=34h – адрес флага InDOS
Флаг InDOS – это однобайтовый счетчик вложенных вызовов функций DOS:
значение в нем увеличивается на единицу при каждом вызове любой функции прерывания INT 21 и уменьшается на единицу при завершении ее исполнения. Состояния флага InDOS и флага критической ошибки (A.01-3) нужно проверять каждый раз перед вызовом функции DOS из любого резидентного модуля: если хотя бы один из этих флагов имеет ненулевое значение, то такой вызов небезопасен.
Рекомендуется вызвать функцию INT 21\AH=34h при первом исполнении программы, запомнить адрес флага InDOS, и тогда для проверки значения этого флага в дальнейшем уже не потребуется вызывать функцию DOS.
При вызове: |
|
|
|
|
|
|
|
|
AH |
= 34h |
|
|
|
|
|
При возврате: |
|
|
|
|
|
|
|
|
ES:BX – указатель на флаг InDOS |
|
|
|
|||
Примечание 1: флаг критической ошибки |
представляет собой |
байт, |
который |
||||
|
|
расположен перед флагом InDOS (A.01-3). Указатель на флаг |
|||||
|
|
критической |
ошибки |
можно |
получить |
с |
помощью |
|
|
INT 21\AX=5D06h. |
|
|
|
|
|
8.02-29 |
INT 21\AH=35h – получение адреса обработчика прерывания |
|
|||||
При вызове: |
|
|
|
|
|
|
|
|
AH |
= 35h |
|
|
|
|
|
|
AL |
– номер прерывания |
|
|
|
|
|
При возврате: |
|
|
|
|
|
|
|
|
ES:BX – адрес вызова обработчика прерывания. |
|
|
||||
8.02-30 |
INT 21\AH=36h – определение свободного пространства на диске |
||||||
При вызове: |
|
|
|
|
|
|
|
|
AH |
= 36h |
|
|
|
|
|
|
DL |
– номер диска (примечание 1 к 8.02-17) |
|
|
|||
При возврате: |
|
|
|
|
|
|
|
|
|
|
– 399 – |
|
|
|
|
Глава 8: Вызовы обработчиков прерываний
AX |
– число секторов в кластере |
BX |
– число свободных кластеров |
CX |
– число байтов в секторе |
DX |
– полное число кластеров на диске |
Примечание 1: свободное дисковое пространство – это произведение AX•BX•CX Примечание 2: полное дисковое пространство – это произведение AX•CX•DX Примечание 3: "потерянные" кластеры причисляются к занятым.
Примечание 4: при обращении к недействующему или несуществующему диску возвращается значение AX = FFFFh. При обращении к оптическому дисководу CD-ROM возвращаемые данные заведомо не верны.
Примечание 5: обращения к дискам с файловой системой FAT-32 допустимы, но возвращаемые результаты ограничены величиной 2048 Мбайт; для
дисков большего объема получить точные данные можно с помощью INT 21\AX=7303h (8.02-80).
8.02-31 INT 21\AH=39h-3Ah – создание или удаление пустого подкаталога
При вызове:
AH = 39h – создать подкаталог
= 3Ah – удалить пустой подкаталог
DS:DX – указатель на строку с именем адресуемого подкаталога. Строка должна заканчиваться байтом 00h. Перед именем адресуемого подкаталога в строке может быть указан путь. Длина строки – до 64 байт.
При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1) При успешном завершении флаг CF сброшен, AX не сохраняется.
Примечание 1: каталог удалить нельзя, если он корневой, если он не пуст, а также если он отмечен как текущий в таблице CDS (A.03-3).
Примечание 2: в отличие от обычных каталогов, объем корневого каталога ограничен. Если он полон, то подкаталог в нем создать нельзя.
8.02-32 INT 21\AH=3Bh – переназначение "текущего" каталога
Обработчик |
прерывания INT 21\AH=3Bh перезаписывает принимаемый по |
умолчанию путь в таблице CDS (A.03-3). |
|
При вызове: |
|
AH |
= 3Bh |
DS:DX – указатель на строку с именем заданного каталога. Строка должна заканчиваться байтом 00h. Перед именем заданного
– 400 –
Глава 8: Вызовы обработчиков прерываний
каталога в строке может быть указан путь, включая букву диска. Длина строки – до 64 байт.
При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). При успешном завершении флаг CF сброшен, AX не сохраняется.
Примечание 1: если вызов INT 21\AH=3Bh адресован другому диску, то "текущий" диск и "текущий" каталог не изменяются, но заданный каталог станет "текущим", когда станет "текущим" адресуемый диск.
Примечание 2: с помощью функции INT 21\AH=47h (8.02-49) можно выяснить, какой каталог является "текущим" в данный момент.
8.02-33 INT 21\AH=3Dh – выдача номерной ссылки для доступа
Номерная ссылка (handle) – это предоставляемое программе шестнадцатеричное число, ассоциированное с блоком описания в таблице SFT (System File Table, A.01-4). Каждый блок описания в таблице SFT относится к объекту: либо к существующему файлу, либо к выделенной области XMS-памяти, либо к каналу доступа. Обработчик прерывания INT 21\AH=3Dh выясняет, есть ли в таблице SFT блок описания, относящийся к запрошенному объекту. Если есть, то отмечаемое в этом блоке описания число ссылок увеличивается на единицу, байт с номером блока описания вводится в таблицу JFT (Job File Table, A.07-1, смещение 18h) исполняемой программы, и порядковый номер этого байта в таблице JFT становится той самой номерной ссылкой. Если для запрошенного объекта нет блока описания в таблице SFT, то обработчик прерывания INT 21\AH=3Dh его создает, и далее выполняет ту же последовательность операций, кончающуюся выдачей номерной ссылки. Файлы, доступ к которым открыт действующей номерной ссылкой, принято называть открытыми.
При вызове: |
|
AH |
= 3Dh |
AL |
– права доступа из таблицы A.09-4 |
DS:DX – указатель на имя объекта, за которым следует байт 00h
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если при возврате флаг CF сброшен, то
AX – предоставленная номерная ссылка
Примечание 1: чтобы получить номерную ссылку на канал управления драйвером нужно использовать имя, записанное начиная со смещения 0Ah в заголовке драйвера (A.05-1). Пути поиска заголовков резидентных модулей показаны в примечании 2 к A.01-2, в 8.03-12 и во введении к разделу 8.03.
Примечание 2: знаки подстановки в имени объекта не допускаются.
– 401 –
Глава 8: Вызовы обработчиков прерываний
Примечание 3: при открытии файла указатель места доступа устанавливается на начало файла.
Примечание 4: при любой комбинации атрибутов файл получит номерную ссылку и будет открыт для доступа, однако получить номерную ссылку на
каталог прямым вызовом INT 21\AH=3Dh нельзя. |
|
Примечание 5: при вызове INT 21\AH=3Dh посредством |
серверной функции |
INT 21\AX=5D00h (8.02-68) возможно задать в регистре CL маску |
|
атрибутов (A.09-2) для файла, который надо открыть. |
|
Примечание 6: номерные ссылки, наследуемые от родительской программы, |
|
наследуют те же права доступа к объекту. |
Условия наследования |
также задаются байтом прав доступа в регистре AL (A.09-4). Примечание 7: для открытия доступа к файлам на дисках с файловой системой
FAT-32 нужно получать номерные ссылки с помощью
INT 21\AX=6C00h (8.02-78).
8.02-34 INT 21\AH=3Eh – аннулирование номерной ссылки
Обработчик прерывания INT 21\AH=3Eh уменьшает на единицу число ссылок на тот же объект в относящемся к нему блоке описания в таблице SFT (A.01-4) и удаляет номер этого блока описания из таблицы JFT (A.07-1) исполняемой программы. Если объект – файл, и если он был изменен, то данные из буферов записываются на диск, и записи в каталоге диска соответствующим образом корректируются. Если дублирующих номерных ссылок на тот же файл данная программа не имеет, то она утрачивает доступ к этому файлу, для нее он становится "закрыт". Однако операционная система будет считать файл "закрытым" только тогда, когда станет равно нулю число ссылок на него в относящемся к нему блоке описания в таблице SFT: только тогда этот файл можно удалить, и он перестает быть поводом для блокировки в дисководе того сменного диска, на котором он записан. В таблице SFT блок описания с нулевым количеством ссылок на объект тоже считается закрытым (точнее, недействительным).
При вызове: |
|
|
|
|
AH |
= 3Eh |
|
|
|
BX |
– номерная ссылка, которую надо аннулировать |
|
||
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). |
||||
При успешном завершении флаг CF сброшен, данные в AX утрачены |
|
|||
Примечание 1: аннулировать |
номерную ссылку |
можно также |
посредством |
|
|
INT 21\AH=68h |
и INT 21\AH=6Ah; |
все другие |
спецификации |
вызова этих функций (кроме AH) такие же.
– 402 –
Глава 8: Вызовы обработчиков прерываний
Примечание 2: при подготовке программы к завершению исполнения можно
закрыть все открытые ею файлы сразу с помощью
INT 21\AX=5D01h (8.02-69).
Примечание 3: номерные ссылки на участки расширенной памяти, выделенные драйвером EMM386.EXE (5.04-02), следует аннулировать только посредством INT 67\AH=45h (8.03-61).
8.02-35 |
INT 21\AH=3Fh – считывание данных из файла или из канала доступа |
|
При вызове: |
|
|
|
AH |
= 3Fh |
|
BX |
– номерная ссылка на файл или на канал доступа |
|
CX |
– число байтов, которые нужно считать |
|
DS:DX – указатель на место для записи данных |
|
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). |
||
Если флаг CF сброшен, то |
||
|
AX |
– число фактически считанных байтов |
DS:DX – указатель на блок записанных данных
Примечание 1: каждая программа автоматически наследует открытую номерную ссылку 0000h, которая дает возможность считывания данных из канала STDIN, если, конечно, канал готов их предоставить. Но если канал STDIN не перенаправлен, и если в момент вызова его буфер пуст, то запускается процедура заполнения буфера с ожиданием ввода знаков с клавиатуры. Вводимые знаки одновременно отображаются на экране, их число не ограничено тем, которое предустановлено в регистре CX. Ввод прекращается по нажатию клавиши ENTER (CR), и тогда указанное в регистре CX число знаков считывается из буфера канала в адрес DS:DX. Оставшиеся в
буфере знаки доступны для считывания последующими вызовами функции INT 21\AH=3Fh.
Примечание 2: считывание из файла начинается с того места, куда показывает указатель места доступа (8.02-38) в SFT (A.01-4), причем после
успешного считывания положение указателя должным образом корректируется.
Примечание 3: если запрошенное число байтов в CX выводит указатель места доступа за пределы файла, то констатируется успешное завершение, но число считанных байтов в AX будет меньше числа в CX.
8.02-36 INT 21\AH=40h – посылка данных в файл или в канал доступа
При вызове:
AH = 40h
– 403 –
Глава 8: Вызовы обработчиков прерываний
BX |
– номерная ссылка на файл или на канал доступа |
CX |
– число байтов, которые надо послать. |
DS:DX– указатель на буфер с данными, которые надо послать |
|
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). |
|
Если флаг CF сброшен, то |
|
AX– |
– число фактически посланных байтов |
Примечание 1: каждая программа автоматически наследует 4 открытые номерные ссылки для посылки данных: 0001h – в канал STDOUT, 0002h – в
канал STDERR, 0003h – в канал STDAUX (порт COM1), 0004h – в
канал STDPRN (порт LPT1). Канал STDOUT перенаправляемый, но по умолчанию выводит знаки на экран дисплея. Канал STDERR нельзя перенаправить, он всегда выводит знаки на экран дисплея.
Примечание 2: запись в файл начинается с того места, куда показывает указатель места доступа (8.02-38) в SFT (A.01-4), причем после успешной записи положение указателя должным образом корректируется.
Если запись данных в файл выводит указатель места доступа за пределы файла, то длина файла автоматически увеличивается. Однако внесенные изменения не будут записаны на диск, пока номерная ссылка не удалена (8.02-48).
Примечание 3: если задать CX = 0, то пересылки данных не будет, но файл будет
удлинен или укорочен согласно положению указателя места доступа.
Примечание 4: на дисках с файловой системой FAT-32 размер файла может быть увеличен сверх 2 Гбайт, при условии что файл открыт вызовом INT 21\AX=6C00h с установленным флагом расширенного размера.
Примечание 5: если после исполнения число посланных байтов в AX оказывается меньше заданного числа байтов в CX, то наиболее вероятной причиной этого является отсутствие свободного места на диске.
8.02-37 INT 21\AH=41h – удаление закрытого файла
При вызове:
AH = 41h
DS:DX – указатель на строку с именем файла, перед которым может быть указан путь. Строка должна кончаться байтом 00h.
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). При успешном завершении флаг CF сброшен, данные в AX утрачены
Примечание 1: удаляемый файл не стирается, просто соответствующая ему запись
в каталоге делается недействительной путем замены первого знака в имени файла кодом E5h.
– 404 –
Глава 8: Вызовы обработчиков прерываний
Примечание 2: удаление с помощью INT 21\AH=41h не затрагивает те записи в каталоге, которые содержат продолжение длинного имени файла.
Примечание 3: не-закрытые файлы |
тоже можно удалить, но тогда не будут |
аннулированы относящиеся к ним номерные ссылки, и это может |
|
привести к потере данных на диске. Если подлежащий удалению |
|
файл открыт, его |
надо сначала закрыть посредством |
INT 21\AH=3Eh (8.02-34). |
|
Примечание 4: знаки подстановки в имени файла не допускаются, за исключением
вызовов |
INT 21\AH=41h |
через |
серверную |
|
функцию |
INT 21\AX=5D00h; в дополнение к |
тому серверная |
функция |
|||
позволяет указать в регистре CL маску атрибутов |
(A.09-2) для |
||||
удаляемых файлов. |
|
|
|
|
|
Примечание 5: удаление файлов из текущего каталога возможно также посредством вызова INT 21\AH=13h (8.02-13).
8.02-38 INT 21\AH=42h – перемещение указателя места доступа
Место начала считывания или записи данных определяется указателем в SFT (15h в таблице A.01-4), который ведет счет смещения относительно начала файла. Обработчик прерывания INT 21\AH=42h позволяет изменить значение этого указателя и тем самым сместить положение точки доступа к файлу.
При вызове: |
|
|
AH |
= 42h |
|
AL |
– точка отсчета: |
|
|
= 00h |
– начало файла |
|
= 01h |
– текущее положение указателя |
|
= 02h |
– конец файла |
BX – номерная ссылка на файл
CX:DX – 4-байтовое смещение положения относительно точки отсчета При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). При успешном завершении флаг CF сброшен, и тогда
DX:AX – новое положение точки доступа относительно начала файла.
Примечание 1:-при выборе точек отсчета 01h и 02h смещение в CX:DX должно быть числом со знаком, и тогда возможно получить указатель, показывающий на место до начала файла. В таких случаях флаг CF бывает сброшен, но ошибки возникают при попытках доступа.
Примечание 2: если новое значение указателя показывает на место за концом файла, то при первой следующей операции записи длина будет автоматически приведена в соответствие с положением указателя.
Примечание 3: вызов INT 21\AH=42h со значениями AX=4202h и CX=DX=0000h
возвращает в регистрах DX:AX длину файла в байтах.
– 405 –
Глава 8: Вызовы обработчиков прерываний
Примечание 4: для файлов на дисках с файловой системой FAT-32 допускаются значения указателя места доступа, превышающие 2048 Мбайт, но только если файл открыт посредством INT 21\AX=6C00h при установленном флаге расширенного размера.
8.02-39 INT 21\AX=4300h – определение атрибутов файла
При вызове:
AX = 4300h
DS:DX – указатель на имя файла, за которым следует байт 00h
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то
CX – атрибуты файла (A.09-2)
Примечание 1: с помощью INT 21\AX=4301h можно приписать файлу атрибуты, подготовленные в регистре CX. При возврате содержимое AX утрачивается. Все другие спецификации такие же.
8.02-40 INT 21\AX=4400h – сведения о номерной ссылке
Номерная ссылка (handle) – это предоставляемое программе шестнадцатеричное число, ассоциированное с блоком описания в таблице SFT (System File Table, A.01-4). Каждый блок описания в таблице SFT относится к объекту: либо к существующему файлу, либо к выделенной области XMS-памяти, либо к каналу доступа. Обработчик прерывания INT 21\AX=4400h дает возможность выяснить, к какому объекту относится данная ссылка, и узнать некоторые его характеристики.
При вызове: |
|
AX |
= 4400h |
BX |
– номерная ссылка |
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). При успешном завершении флаг CF сброшен, и тогда
DX – слово признаков (примечание 1). Состояние AX не сохраняется.
Примечание 1: если в слове признаков, возвращаемом в регистре DX, бит 7 сброшен, то его надо расшифровывать по таблице A.04-2 как относящееся к файлу, а если бит 7 установлен, то слово надо расшифровывать согласно таблице A.05-2.
Примечание 2: в слове признаков A.05-2, относящемуся к каналу доступа, состояния битов 0 – 7 можно изменять с помощью INT 21\AX=4401h. Слово признаков надо подготовить в регистре
– 406 –
Глава 8: Вызовы обработчиков прерываний
DX, биты 8 – 15 должны быть сброшены в нуль, в AX записано число 4401h, все другие спецификации вызова такие же.
8.02-41 INT 21\AX=4402h-4403h – управление драйверами
Основная идея управления вводом-выводом (IOCTL) состоит в том, что DOS предоставляет драйверам место для размещения управляющих данных, а программам дает возможность доступа к этим данным. Миссию обеспечения такого доступа исполняют обработчики прерываний INT 21\AX=4402h-4403h. Если конкретный драйвер поддерживает программное управление вводом-выводом, то его управляющие данные адресуются номерной ссылкой, которая выдается на имя этого драйвера обработчиком прерывания INT 21\AH=3Dh или INT 21\AX=6C00h. Узнать о том, поддерживает ли драйвер такое управление, можно по состоянию битов 6 и 7 в слове признаков драйвера (A.05-2).
При вызове: |
|
|
AX |
– функция: |
|
|
= 4402h |
– считывание управляющих данных |
|
= 4403h |
– запись управляющих данных |
BX |
– номерная ссылка, полученная на имя драйвера. |
|
CX |
– число байтов, которые надо считать или записать |
|
DS:DX – указатель на буфер с данными или для получения данных При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то
AX – число пересланных байтов
Примечание 1: формат управляющих данных специфичен для каждого драйвера. В частности, таблица A.15-4 показывает примеры форматов команд для драйверов стандартных дисководов CD/DVD-ROM.
Примечание 2: управляющие данные для дисковых драйверов, которые нельзя адресовать номерной ссылкой, могут быть считаны с помощью
INT 21\AX=4404h и записаны с помощью INT 21\AX=4405h. Эти функции используют такие же спецификации вызова, за исключением регистров AX и BX: состояние BH игнорируется, а BL адресует драйвера по номерам дисков (примечание 1 к 8.02-17).
8.02-42 INT 21\AX=4406h-4407h – готовность доступа по номерной ссылке
При вызове:
AX – функция:
=4406h – проверка готовности к считыванию данных
=4407h – проверка готовности к записи данных
BX – номерная ссылка (8.02-33)
– 407 –
Глава 8: Вызовы обработчиков прерываний
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то регистр AL показывает результат:
AL = FFh – означает готовность
= 00h – неготовность к выполнению запрошенной операции.
Примечание 1: если указатель места доступа к файлу установлен на конец файла не операциями считывания или записи, а посредством INT 21\AH=42h (8.02-38), то INT 21\AX=4406h может ошибочно констатировать готовность к считыванию, возвращая AL=FFh.
Примечание 2: обработчик прерывания INT 21\AX=4407h не проверяет, вставлена ли в дисковод дискета и имеется ли на ней свободное место.
8.02-43 |
INT 21\AX=4408h – проверка возможности смены диска |
||
При вызове: |
|
|
|
|
AX |
= 4408h |
|
|
BL |
– номер диска (примечание 1 к 8.02-17) |
|
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). |
|||
Если флаг CF сброшен, то |
|
||
|
AX |
= 0000h |
означает, что данный диск – сменный, |
|
|
= 0001h |
– что диск несменяемый. |
8.02-44 |
INT 21\AX=4409h – атрибуты драйвера логического диска |
||
По атрибутам драйвера можно выяснить, является ли диск реальным или фиктивным, локальным или сетевым, доступен ли диск посредством функций BIOS или нет. Расшифровка слова атрибутов дана в таблице A.05-2.
При вызове: |
|
AX |
= 4409h |
BL |
– номер диска (примечание 1 к 8.02-17) |
При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то
DX – слово атрибутов (A.05-2). Состояние AX не сохраняется.
Примечание 1: биты в DX отображают способности драйвера, но не обязательно соответствуют свойствам диска, номер которого запрошен в BL. Например, установленный бит 11 (поддержка сменных дисков) означает лишь, что среди обслуживаемых данным драйвером накопителей могут быть накопители на сменных дисках. Но отсюда не следует, что запрошенный диск обязательно является сменным.
– 408 –
