Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
97
Добавлен:
09.02.2015
Размер:
5 Мб
Скачать
☆

Глава 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 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]