Biosdisk
biosdisk
Функция Дисковые функции BIOS.
Синтаксис #include
int biosdisk(int cmd, int drive, int head, int track, int sector, int nsects, void * buffer);
Файл, содержащий bios.h прототип
Описание biosdisk использует прерывание 0x13 для того,чтобы передать выполнение дисковых операций непосредст- венно системе BIOS.
drive представляет собой число, которое задает используемый дисковод: 0 для 1-го устройства гиб- ких дисков, 1 для 2-го устройства гибких дисков, 3 для 3-го устройства и т.д. Для жестких дисковых устройств значение drive 0x80 задает первый дис- ковод, значение 0x81 - второй дисковод, значение 0x82 - третий и т.д.
Для жестких дисков указывается физическое устрой- ство, а не раздел диска. При необходимости прик- ладная программа должна будет самостоятельно ин- терпретировать таблицу разделов.
cmd обозначает выполняемую операцию. В зависимос- ти от значения cmd остальные аргументы могут тре- боваться или нет.
Далее перечислены возможные значения cmd для компьютеров IBM PC, XT, AT, PS/2 или совместимых с ними.
0 Аппаратный сброс дискового контроллера. Все остальные параметры игнорируются. 1 Возвращает статус последней дисковой операции. Все остальные параметры игнорируются. 2 Считывает в память один или несколько секторов диска. Начальный сектор, подлежащий считыванию, задается аргументами head, track и sector. Чис- ло считываемых секторов задается аргументом nsects. Данные считываются в buffer по 512 бай- тов на сектор. 3 Записывает на диск из памяти один или более дисковых секторов. Начальный сектор задается аргументами head, track и sector. Число сек- торов определяется аргументом nsects. Данные записываются на диск из buffer по 512 байт на сектор. 4 Производит верификацию одного или более секто- ров. Начальный сектор определяется аргументами head, track и sector. Количество секторов зада- ется в nsects. 5 Форматирует дорожку. Дорожка определяется аргументами head и track. buffer является ад- ресным указателем таблицы дескрипторов секто- ров, которые будут записываться на указанной дорожке. Обратитесь к документу "Техническое справочное руководство по IBM PC", в котором подробно описана данная таблица и операция форматирования.
Только для компьютеров типа XT, AT, PS/2 и сов- местимых с ними разрешены следующие значения ар- гумента cmd:
6 Форматирует дорожку и устанавливает флаги пло- хих секторов. 7 Форматирует диск, начиная с заданной дорожки. 8 Возвращает параметры текущего дисковода. Дан- ная информация записывается в buffer в первые четыре байта. 9 Задает характеристики пары устройств. 10 Производит удлиненное считывание, когда чи- тается 512 байтов плюс 4 дополнительных байта на каждый сектор. 11 Выполняет удлиненную запись, когда записывается 512 байтов плюс 4 дополнительных байта на каждый сектор. 12 Выполняет дисковый поиск. 13 Альтернативный сброс диска. 14 Считывает буфер сектора. 15 Записывает буфер сектора. 16 Проверяет готовность заданного диска. 17 Рекалибрует диск. 18 Производит диагностику контроллера RAM. 19 Производит диагностику дисковода. 20 Производит внутреннюю диагностику контроллера.
Примечание. biosdisk работает ниже файловой сис- темы - на произвольных секторах, поэтому может разрушить содержимое файлов и директорий на жест- ком диске.
Возвращаемое biosdisk возвращает байт состояния, состоя- значение щий из следующих битов:
0x00 успешная операция. 0x01 неверная команда. 0x02 адресный маркер не найден. 0x03 попытка записи на диск, защищенный от записи. 0x04 сектор не найден. 0x05 неудачный сброс (для жесткого диска). 0x06 диск изменился после последней операции. 0x07 сбой параметра активности дисковода. 0x08 конфликт при работе DMA. 0x09 попытка обращения к DMA за границей 64К. 0x0A обнаружен дефектный сектор. 0x0B обнаружена дефектная дорожка. 0x0C неподдерживаемая дорожка. 0x10 ошибка CRC/ECC при чтении диска. 0x11 ошибка CRC/ECC при корректировке данных. 0x20 сбой при работе контроллера. 0x40 сбой при операции поиска. 0x80 узел подсоединения не отвечает. 0xAA устройство не готово (только для жесткого диска). 0xBB произошла нераспознаваемая ошибка (только для жесткого диска). 0xCC произошел сбой при записи. 0xE0 ошибка статуса. 0xFF сбой операции распознавания.
Заметим, что код 0x11 не является ошибкой, посколь- ку данные являются корректными. Возвращаемое значе- ние выдается в любом случае, чтобы дать возможность прикладной программе выработать решение.
Переносимость Данная функция поддерживается только на компью- терах IBM PC и совместимых с ними.
Смотрите также
Пример:
#include
#include
int main(void) { #define CMD 2 /* команда чтения сектора */ #define DRIVE 0 /* номер дисковода для A: */ #define HEAD 0 /* номер головки */ #define TRACK 1 /* номер дорожки */ #define SECT 1 /* номер секторов */ #define NSECT 1 /* число секторов */
int result; char buffer[512]; printf("Попытка чтения дисковода A:\n"); result = biosdisk(CMD,DRIVE,HEAD,TRACK,SECT,NSECT,buffer); if(result==0) printf("Успешное чтение диска в дисководе A:"); else printf("Попытка чтения дисковода A: неудача\n"); return 0; }