На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 6 / Команда MEDIA CHECK Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Команда MEDIA CHECK

       ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
       є                                                                  є
       є Команда MEDIA CHECK (1)                                          є
       є                                                                  є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         ЪДДДї                   є
       є +00 : 19                   Длина         і X і Блок. драйверы    є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         АДДДЩ                   є
       є +01 : номер           Устройство         ЪДДДї                   є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         і   і Симв. драйверы    є
       є +02 : 01                 Команда         АДДДЩ                   є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД                                 є
       є +03 :                     Статус                                 є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД          ЧТЕНИЕ      ЗАПИСЬ     є
       є                  Зарезервировано                                 є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДДї ДДДДД ЪДДДї ДДДД є
       є +13 :        Описатель  носителя          і X і       і   і      є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДД є
       є +14 :         Состояние носителя          і   і       і X і      є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДД є
       є +15 :           Адрес имени тома          і   і       і X і      є
       є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ ДДДДД АДДДЩ ДДДД є
       є                                                                  є
       є Состояние носителя : (-1) - носитель заменен, 0 - носитель неоп- є
       є ределен, 1 - носитель не изменялся.                              є
       є Имя тома возвращается только,если : (a) DOS версии не ниже 3.00, є
       є (b) установлен атрибут OCRM и (c) возвращаемый статус носителя   є
       є равен (-1).                                                      є
       є                                                                  є
       ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј

Команда MEDIA CHECK (Проверить носитель) всегда выполняется блоковыми драйверами и никогда не используется для драйверов символьных устройств. Эта команда используется MS-DOS для разрешения проблемы, которая может возникнуть при работе с устройствами, использующими сменный носитель информации : носитель (например, гибкий диск) может быть заменен. При замене дискеты или ее эквивалента формат новой дискеты может отличаться от предыдущего, а уж содержимое новой дискеты несомненно будет другим.


При замене дискеты MS-DOS должна настроиться на новую структуру диска : размер сектора, количество секторов и т.п. MS-DOS хранит формат текущего диска в BPB и при смене носителя MS-DOS потребуется копия нового BPB.


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


Для разрешения всех этих вопросов MS-DOS выдает драйверу команду MEDIA CHECK, спрашивая его о том, был ли заменен носитель. Драйвер должен вернуть на этот вопрос один из трех ответов: "Да" (состояние носителя -1), "Нет" (состояние носителя 1) или "Не знаю" (состояние носителя 0).


Важность этого вопроса отражается в том действии, которое MS-DOS предпринимает при получении ответа на него. Если драйвер отвечает "Нет, носитель НЕ БЫЛ заменен", MS-DOS продолжает работать так, как и планировала, не проверяя, изменилось содержимое дискеты или нет. Если драйвер отвечает "Да, носитель БЫЛ изменен", MS-DOS "выбрасывает" все хранящиеся в буферах данные и запрашивает у драйвера параметры нового носителя. Наконец, если драйвер отвечает что он сам не знает - была замена или нет, MS-DOS берет решение на себя. Если есть какие-либо данные, подготовленные для записи на диск, MS-DOS делает предположение о том, что это тот же самый диск. В противном случае она делает предположение о том, что произошла смена диска и продолжает работать так, как если бы драйвер вернул ответ "Носитель БЫЛ изменен".


Для оказания помощи драйверу в решении вопроса о смене носителя MS-DOS передает драйверу текущий Media Descriptor Byte (байт описателя носителя), сокращенно MDB. Этот байт входит в группу параметров, называемую BPB (блок параметров BIOS), которая возвращается MS-DOS командами драйвера INIT и BUILD BPB. Каждому уникальному формату диска должен соответствовать свой описатель, хотя это и не всегда возможно (в разделе, описывающем команду BUILD BPB, этот вопрос обсуждается более подробно).


Описатель носителя хранится в первом байте, находящемся на диске FAT (таблицы размещения файлов). Кроме того, младший байт значения типа диска (см. табл.11.5) представляет собой не что иное, как MDB. Подробнее о FAT и типах дисков Вы можете узнать, прочитав 11 главу.


При решении вопроса о том, была ли замена носителя, драйвер может использовать следующую логику :


1. Если устройство не поддерживает возможность смены носителя (например, если это жесткий диск или RAM-диск), то драйвер должен ответить "Нет, замены носителя не было". В противном случае переход к шагу 2.


2. Фирма Microsoft утверждает, что на замену дискеты требуется не менее двух секунд. Принимая этот факт во внимание, драйвер должен проверить системные часы и, если с момента предыдущего обращения к диску прошло менее двух секунд, вернуть ответ "Нет, замены носителя не было". Конечно, этот метод требует,чтобы драйвер всегда сохранял время обращения к диску. Если прошло более двух секунд, то переход к шагу 3. Очевидно, что если нет возможности считывать системное время, то данный шаг можно опустить.


3. Иногда сам дисковод может иметь возможность информирования драйвера о происшедшей замене носителя. Некоторые дисководы оборудованы электронной схемой, подающей сигнал, если дверца дисковода открывалась с момента последнего обращения к диску. Если драйвер обслуживает именно такой дисковод и последний сообщает, что дверца не открывалась, то драйвер должен ответить "Нет, замены носителя не было". Если дверца была открыта, то переход к шагу 4.


Бывают дисководы, в которых двигатели включаются только при обращении к дискете и выключаются, выдержав некоторый временной интервал. Если такой дисковод позволяет считывать состояние двигателя и двигатель еще работает с момента последнего обращения, то это позволяет сделать вывод о том, что дискета не заменялась и драйвер должен ответить "Нет, замены носителя не было". Однако, встречаются дисководы, двигатели которых включаются в тот момент, когда вставляется дискета, что может сделать результаты данной проверки некорректными.


4. Драйвер должен прочесть с диска описатель носителя. Если этот MDB отличается от переданного драйверу при вызове команды MEDIA CHECK описателя, то драйвер должен ответить "Да, была замена носителя". В противном случае переход к шагу 5.


5. Драйвер должен прочесть с диска идентификатор тома. Если он отличается от того, который хранится драйвером с момента последней команды BUILD BPB, то драйвер должен ответить "Да, была замена носителя". Иначе переход к шагу 6.


6. Драйвер должен ответить "Не знаю, была ли замена носителя".


Может случиться так, что невозможно реализовать некоторые этапы описанного алгоритма. Если по каким-либо причинам Вы не можете определить, произошла ли замена дискеты, то лучшим ответом будет "Не знаю, была ли замена носителя". Конкретный метод определения замены носителя будет зависеть как от особенностей дисковода, так и от квалификации программиста.


Если драйвер работает с MS-DOS версии 3.0 или выше, то команда MEDIA CHECK может вернуть еще некоторую информацию. В том случае, когда драйвер поддерживает команды OPEN/CLOSE/REMOVABLE MEDIA (установлен бит 11 в слове атрибутов драйвера) и команда MEDIA CHECK собирается ответить "Да, была замена носителя" (состояние носителя : -1), тогда драйвер обязан вернуть указатель на имя тома предыдущего диска (см. главу 11 для получения сведений о формате и расположении имени тома). Если драйвер не знает имя тома предыдущего диска (например, если обращение к команде MEDIA CHECK происходит впервые), то драйвер должен вернуть указатель на строку "NO NAME" оканчивающуюся нулевым байтом (т.е. "NO", пробел, "NAME", четыре пробела, ноль).


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz