www.financelike.ru

Таблица 6



Таблица 6

КодОписание
0Нарушение защиты от записи. Была предпринята попытка записи информации на защищенное от записи устройство.
1Неизвестное устройство.
2Устройство не готово.
3Неизвестная команда. Затребованная команда не поддерживается драйвером.
4Ошибка CRC. При выполнении команды обнаружена ошибка циклического кода проверки.
5Неправильная длина запроса. Поле длины в заголовке запроса содержит неверное значение.
6Ошибка при поиске дорожки (дорожка не найдена).
7Неизвестный носитель данных.
8Сектор не найден.
9Нет бумаги в принтере.
0AhОшибка записи.
0BhОшибка чтения.
0ChОбщая ошибка.
0DhЗарезервировано.
0EhЗарезервировано.
0FhНеразрешенная замена диска (только для DOS версии 3.0 и более поздних версий).

Общая схема действий программы прерывания драйвера такова:

  • получив управление от операционной системы, программа прерывания сохраняет содержимое всех регистров процессора и считывает номер команды из заголовка запроса;
  • при необходимости программа считывает дополнительную информацию из области запроса;
  • затребованная команда выполняется (если она поддерживается драйвером);
  • если драйвер считывает какие-либо данные от обслуживаемого физического устройства для передачи их DOS, то сами данные или их адреса программа прерывания записывает в область запроса;
  • программа прерывания устанавливает слово состояния устройства в соответствии с результатами выполнения команды (если драйвер не поддерживает затребованную команду, в слове состояния устройства устанавливаются биты 15 и в биты 0-7 записывается код ошибки 3 - неизвестная команда);
  • восстанавливается содержимое регистров процессора, и управление возвращается операционной системе с помощью команды возврата из дальней процедуры.

Приведем фрагмент исходного текста программы прерывания, который выполняет описанные выше функции: interrupt_proc: push es ;сохраняем регистры push ds push ax push bx push cx push dx push si push di push bp ; Устанавливаем ES:BX на заголовок запроса mov ax,cs:req_seg mov es,ax mov bx,cs:req_off ; Загружаем в регистр AL код команды из заголовка ; запроса и умножаем его на 2 для получения индекса ; в таблице адресов команд mov al,es:[bx]+2 shl al,1 sub ah,ah ;обнуляем AH lea di,functions ;DI содержит смещение таблицы ; команд add di,ax ;добавляем смещение jmp word ptr [di] ;переходим по адресу, взятому ; из таблицы functions LABEL WORD ;это таблица функций dw initialize dw check_media dw make_bpb dw ioctl_in dw input_data dw nondestruct_in dw input_status dw clear_input dw output_data dw output_verify dw output_status dw clear_output dw ioctl_out dw Device_open dw Device_close dw Removable_media ;---выход из драйвера, если функция не поддерживается check_media: make_bpb: ioctl_in: nondestruct_in: input_status: clear_input: output_verify: output_status: clear_output: ioctl_out: Removable_media: ; Если функция не поддерживается драйвером, устанавливаем ; в единицу биты 15 (ошибка), 8 (выполнение команды ; завершено). В биты 0-7 записываем код ошибки 3 - ; неизвестная команда. or es:word ptr [bx]+3,8103h jmp quit ;======================================================= ; Это пример обработчика команды: Device_open: ; . . . . . . . . . . ; Некоторые действия для открытия устройства. ; . . . . . . . . . . jmp quit ;======================================================= ;---выходим, модифицируя байт состояния status в заголовке ; запроса quit: or es:word ptr [bx]+3,100h ;устанавливаем бит 8 ;(выполнение команды ;завершено) pop bp ;восстанавливаем регистры pop di pop si pop dx pop cx pop bx pop ax pop ds pop es ret

В следующем разделе мы подробно рассмотрим все команды, коды которых могут передаваться драйверу через заголовок запроса. Для каждой команды будет приведен формат области запроса.



- Начало - - Назад - - Вперед -