данные по умолчанию дисковод и каталог, содержащие стертый файл,
должны быть установлены командой CHDIR (или сокращенно - CD) до
запуска программы RESCUE. Подлежащий стиранию файл может быть
файлом любого типа: обычным, скрытым, системным, доступным только
по чтению или расположенным в подкаталоге. Если вы восстанавлива-
ете файл, находящийся в подкаталоге, который тоже был стерт, или,
если вы хотите проконтролировать все дерево каталога, расположен-
- 11-56 -
ное ниже стертого подкаталога, вы должны сначала восстановить
этот подкаталог по имени, используя команду RESCUE; создать зано-
во подкаталог в заданном по умолчанию каталоге (используя команду
CHDIR или CD) и затем вручную восстановить стертый файл (файлы) в
подкаталоге, используя программу RESCUE.
Если имя файла найдено в каталоге (корневом каталоге или
подкаталоге), будет произведена попытка проведения восстановления
файла путем анализа и записи информации в таблицу FAT. Если файл
не был найден, или, если было обнаружено, что он не уделен, на
экране дисплея появится сообщение об этом. Как пояснялось ранее,
путь доступа, проходящий через таблицу FAT для заданного файла,
может быть сложным. Если программа RESCUE не сможет найти путь
размещения файла (может быть он был сложно переплетен с путем
доступа к другому файлу) выполнение программы завершается и ника-
кая информация не записывается на диск. Важным фактором в работе
программы является то, что она не будет записывать любую информа-
цию на диск до тех пор, пока все проблемы, связанные с файлом, не
будут разрешены. Эта программа решает все свои задачи путем пере-
писывания всех секторов каталога и таблицы FAT в память, где и
выполняются все модификации элементов каталога файла и его табли-
цы FAT. Когда все изменения были проведены, программа RESCUE за-
писывает весь каталог и всю таблицу FAT обратно на диск. Если во
время анализа данных и их модифицирования встречаются трудности,
выполнение программы RESCUE завершается и диск остается без изме-
нений.
Как было отмечено ранее, программа RESCUE была так разрабо-
тана, что она может работать с любым форматом диска, который со-
ответствует стандартным соглашениям по форматированию, принятым в
операционной системе MS-DOS. Программа RESCUE использует не вхо-
дящую в документацию по операционной системе MS-DOS функцию 32h
(получить блок параметров диска) для получения необходимой ей ин-
формации, касающейся формата диска. Эта программа также широко
использует функции, содержащиеся в библиотеке поддержки языка Си
фирмы "Майкрософт". Если вы будете перестраивать эту программу
для работы ее на другом языке или с другим компилятором, вам при-
дется найти или самим написать заменяющие значения для этих функ-
ций.
Программа RESCUE намеренно сделана очень простой, и для ее
понимания и для того, чтобы она соответствовала уровню этой кни-
ги. Существует ряд расширений, которые вы возможно, захотите до-
бавить в программу RESCUE, чтобы сделать ее еще более широко ис-
пользуемой и полезной. Возможно, вы захотите позволить
пользователю самому указывать в командной строке по заданию
RESCUE дисковод и каталог, где расположен файл или вы можете за-
хотеть разрешить универсальное задание стертых файлов с примене-
нием символов "*" и "?". Весьма полезным добавлением может ока-
заться средство проверки попыток восстановления пользователем
файлов, имена которых уже существуют (что может быть сделано при
разумном использовании имеющихся стандартных программ).
Другая модификация, которую вы можете захотеть произвести,
заключается в разрешении программе RESCUE работать с жесткими
дисками, которые имеют части, превышающие 32 Мегабайта, что воз-
можно в работе под управлением операционной системы MS-DOS версии
4.0. Разбиения расширенного размера используют 32-битовые номера
секторов вместо 16-битовых номеров секторов, использовавшихся в
разбиениях по 32 Мегабайта и меньше. Для того, чтобы избежать ра-
боты с 32-битовыми элементами таблицы FAT, отношение сектор/клас-
- 11-57 -
тер увеличивается в разбиениях расширенного размера так, что
16-битовые элементы таблицы FAT тоже могут по-прежнему исполь-
зоваться. Однако, максимальный размер таблицы FAT (одной ее ко-
пии) был увеличен с 64 Кбайт (для операционной системы MS-DOS
версии 3.3) до 128 Кбайт (для операционной системы MS-DOS версии
4.0). Прикладные программы операционной системы MS-DOS экраниру-
ются от кластера разбиения повышенного размера и от схемы отобра-
жения секторов, при условии, что используются только стандартные
файловые функции операционной системы MS-DOS или абсолютные ссыл-
ки на кластеры. Но использование абсолютными ссылками на кластеры
прерываний 25h и 26h требует разных соглашений по обращениям меж-
ду частями в 32 Мегабайта или меньше и частями, большими 32 Мега-
байт. В представленных ниже листингах продемонстрированы два сог-
лашения в операционной системе MS-DOS версии 4.0 для прерывания
25h (Абсолютное чтение диска) и прерывания 26h (Абсолютная запись
на диск).
При некоторых изменениях программы RESCUE может быть превра-
щена в очень могучую прикладную программу, которая может работать
с любым типом дискового носителя, независимо от конкретной реали-
зации и версии операционной системы MS-DOS.
Листинг 11-2. Условия вызова операций абсолютного чте-
ния/записи на диск (по прерываниям "int 25h/int 26h") для
разделений диска в 32 Мегабайта или меньше (Все версии опера-
ционной системы MS-DOS)
----------------------------------------------------------------
Вход : AL = Hомер дисковода (0=А, 1=В и т.д.)
CX = Количество секторов для чтения (прерывание
"int 25h") или для записи (прерывание
"int 26h")
DX = Hачальный логический номер сектора
DS:BX = Aдрес передачи
Bозврат: Признак переноса = 0 (успешная передача) или
= 1 (не успешная передача)
AL = Kод ошибки
AH = Tип ошибки
Примечание: B регистре AX возвращается значение 0207h, если
была сделана попытка чтения или записи части раз-
мером больше 32 Мегабайт
Листинг 11-3. Условия вызова операций абсолютного чтения/за-
писи на диск (по прерываниям "int 25h/int 26h") для разделений
диска, больших 32 Мегабайт (только для версии 4.0 операционной
системы MS-DOS)
-----------------------------------------------------------------
Вход : AL = Hомер дисковода (0=А, 1=В и т.д.)
BX = Указатель на список параметров
CX = -1 (указывает на расширенный
(> 32 Мегабайт) формат)
Bозврат: Признак переноса = 0 (успешная передача) или
= 1 (не успешная передача)
AL = Kод ошибки
AH = Tип ошибки
Примечание: POP AX (код ошибки) при выходе. Коды ошибок
- 11-58 -
такие же как указанные выше.
Cтруктура списка параметров:
rba dd ? ; первый сектор (32-битовый с
; началом в 0) для чтения-записи
count dw ? ; количество секторов для
; чтения-записи
buffer dd ? ; буфер данных
Листинг 11-4. Программа контроля RESCUE
_________________________________________________________
/********************************************************
FILE: RESCUE2.C Rescue File Utility Version 2.00
Расширения: Контроль файла в подкаталогах
Контроль стертого подкаталога
Управление любым типом дискового носителя
операционной системы MS-DOS (гибкие диски,
жесткие диски, сменные кассеты)
Компилирование компилятором "Си" "фирмы "Майкрософт":
cl /c /Zp1 /AS /GO /Ze /Ot rescue2.c
Редактирование редактором фирмы "Майкрософт":
Link /Dosseg/MA/LI/CPAR:1/STACK:4096 rescue2,rescue2.exe,
rescue2.map,slibce;
*********************************************************
/* В К Л Ю Ч Е Н Н Ы Е Ф А Й Л Ы */
#include /*для функции printf() и еще многих*/
#include /*для getch() */
#include /*для intdos(),int86(), и так далее*/
#include /*для _fmalloc ()& malloc */
#include /*для memory "mem...()" и str..."*/
#iclude /*для topper() and "есть...()" */
#include /*для getcwd() */
/* О П Р Е Д Е Л Е Н И Е К О Н С Т А Н Т */
#define FALSE 0 /* эти определения предназначены*/
#define TRUE 1 /* для того, чтобы сделать програм-*/
#define AND && /* му более читаемой и понятной*/
#define OR ¦¦
#define EQ ==
#define NE !=
#define LE <=
#define ABS_READ 0x25 /* прерывание чтения диска */
#define ABS_WRITE 0x26 /* прерывание записи на диск */
/* Функции прерываний "int 21h" операционной системы DOS:*/
#define DFUNC_RESETDSK 0x0D /* сброс дисковода */
#define DFUNC_GETDISK 0x19 /* получить текущий дисковод */
#define DFUNC_GETDPB 0x32 /* получить блок дисковых */
/* параметров */
#define DFUNC_GETCD 0x47 /* получить текущий дисковод */
- 11-59 -
/* Биты атрибутов файла операционной системы DOS: */
#define FATR_NONE 0x00 /* соответствует ANY */
#define FATR_READ 0x01 /* только для чтения */
#define FATR_HIDDEN 0x02 /* скрытый */
#define FATR_SYSTEM 0x04 /* файл системы */
#define FATR_VOLUME 0x08 /* метка тома */
#define FATR_SUBDIR 0x10 /* подкаталог */
#define FATR_ARCHIV 0x20 /* архивированный файл */
#define CL_OFF 2 /* первым номером кластера */
/* является число 2*/
#define TENMB 20740L /* максимальное количество */
/* секторов, поддерживаемых */
/* 12-битовой таблице FAT */