Додати результат до номера логічного сектора початку області збереження даних

37470
знаков
1
таблица
0
изображений

3. Додати результат до номера логічного сектора початку області збереження даних.

Застосовуючи відповідну послідовність дій у правильному порядку, ви тепер можете перейти від елемента каталогу до елемента таблиці FAT, до номера кластера, до номера логічного сектора. А якщо є такий засіб, кому потрібна операційна система MS-DOS?! Ви і самі можете зчитувати файли сектор за сектором!

Огляд процедур відновлення.

Якщо файл, що знаходиться на диску, був якимсь образом зруйнований чи ушкоджений, існує три основних способи його виправлення.

Перший спосіб полягає у використанні одного з убудованих засобів операційної системи MS-DOS: програми CHKDSK чи програми RECOVER. Ці програми можуть знайти й ізолювати ушкоджені області диска для того, щоб могли відновити чи частина весь зруйнований файл.

Другий спосіб полягає у використанні програми DEBUG, що дозволяє вам робити всі, що завгодно з метою відновлення зруйнованого чи стертого файлу. На жаль, програми DEBUG пропонує не занадто "інтелектуальну" допомогу в досягненні вашої мети, і часто є просто "останньою соломиною". Схожий на цей спосіб полягає в написанні вашої власної програми відновлення, такий, як програма UNDEL Інформація, що наводилася нижче, по декодуванню каталогу диска й таблиці FAT є істотно важливою для написання власних програм відновлення.

Останній і найбільш зручний спосіб полягає у використанні однієї з уже наявних готових програм - утиліт таких, як "Norton-утиліти" чи "Ultra-утиліти". Ці утиліти, подібні шухляді з інструментами, і в них передбачені всі можливості перерахованих вище способів, включаючи декодування таблиць FAT, виправлення ушкоджених файлів і відновлення стертих файлів.

Відновлення стертих файлів.

На щастя, коли файл був стертий при роботі під керуванням операційної системи MS-DOS, тільки частина елемента каталогу цього файлу міняється: перший символ імені міняється на шіснадцяткове значення E5. Це значення використовується, як прапор (ознака). Коли операційна система MS-DOS переглядає сектори каталогу в пошуках вільного місця для розміщення каталогової інформації про новий файл, система знаходить і використовує перший елемент, що починається або із шіснадцяткового значення E5 (елемент каталогу ще не використовувався). Інша інформація в елементі каталогу залишається без змін. Якби усе, що нам потрібно зробити, це змінити значення E5 на значення першого символу імені стертого файлу, процедура відновлення стертих файлів була б дуже легкою. На жаль, операційна система MS-DOS значно більш ефективно працює при стиранні інформації поміщеної у секторах таблиці FAT. Незважаючи на те, що операційна система MS-DOS не торкається інформації, що зберігається в секторах чи даних кластерах, зайнятих файлом, система встановлює в значення 000 всі елементи таблиці FAT, що відповідають цим кластерам. Операційна система MS-DOS робить це тому, що це - єдиний спосіб для системи швидко переглянути диск у пошуках порожнього місця, коли вона хоче розмістити нові файли. Таким чином, наша задача по відновленню стертого файлу ледве більш складна, чим може спочатку показатися. Деякі основні правила по відновленню стертих файлів описуються нижче.

Основні принципи.

Існує багато способів утратити файл. Може бути, ви ніяково використовували команду стирання ERASE чи команду видалення DEL. Чи, може бути, відбувся збій у ваших апаратних чи засобах збій харчування під час сеансу редагування. Після перегляду диска ви знайшли, що файл, що редагується вами, не може бути знайдений.

У загальному випадку файл у дійсності буде стертий (при заміні першого символу імені файлу в елементі каталогу на шіснадцяткове значення E5) тільки тоді, коли він стирається командою ERASE чи DEL чи будь-якою іншою програмою, що виконує ту ж функцію. Якщо ви утрачаєте файл через несправність апаратних чи засобів збою харчування, файл, імовірно, не буде в дійсності стертий. Він просто буде загублений з диска, якщо використовувана вами програма не мала досить часу, щоб закрити файл належним образом. У цьому випадку ви можете використовувати програми операційної системи MS-DOS відновлення диска RECOVER і CHKDSK для відновлення загублених даних.

Кращим способом визначення, чи був файл дійсно стертий чи він просто загублений є використання програми CHKDSK без параметрів. Якщо файл загублений, програма CHKDSK виводить на екран дисплея повідомлення: "Загублені кластери знайдені". Це повідомлення виводиться на екран якщо програма CHKDSK знаходить розрив у ланцюзі кластерів, описаних у таблиці FAT, наприклад, якщо останній кластер у ланцюзі не вказує на елемент таблиці FAT, у якому міститься маркер кінця файлу (значення від (F) FF8 до (F) FFF. Коли таке случається, ви повинні повторно ввести програму CHKDSK із параметром /F для відновлення всіх загублених кластерів і приміщення даних у файл, створений програмою CHKDSK. Саме в цьому місці початковий момент створення копії усього вихідного диска може виявитися благословенним, тому що якщо ви мали на диску також і інші дійсно стерті файли, команда CHKDSK /F помістить файл, що містить відновлені дані поверх області, що містить стерті файли. Відновлення файлів у всіх випадках повинне проводитися методично й акуратно.

Після того, як стало ясно, що файл був дійсно стертий, вам точно відомі три речі: по-перше, елемент каталогу залишається неушкодженим, за винятком першого символу імені файлу, що був замінений шіснадцятковим значенням E5.

По-друге, ці кластери, сектори в області даних диска, які використовуються з файлом, як і раніше містять дані файлу.

По-третє (що дуже сумно!), кожний з елементів таблиці FAT, що використовувалися для відображення кластерів, зайнятих файлом, містить значення (0) 000.

4. Алгоритм програми

Для відновлення стертого файлу варто виконати перераховані нижче кроки:

1. Вести перегляд елементів каталогу доти, поки ви не знайдете елемент, який би починався із шіснадцяткового значення E5 у байті 00. Подивитеся на інші символи в імені файлу в байтах з 1 по 10, і перевірте, що це дійсно був файл, що ви хочете відновлювати.

2. Подивитеся на номер початкового кластера (байти 26 і 27). Використовуйте номер початкового кластера як покажчик на перший кластер в області даних диска, зайнятого файлом, а також на перший на початку використовуваний елемент таблиці FAT.

3. Подивитися на розмір файлу (байти з 28 по 31, останні чотири байти в елементі каталогу). Знати розмір файлу важливо в тім, випадку, якщо файл займає більш одного кластера в області даних диска, а особливо важливо, якщо частини файлу розкидані по різних частинах диска.

4. Визначивши номер кластера, зайнятого початком файлу, переглянемо вміст цього кластера. Пошукати у кластері символ коду ASCII "Control-Z" (шіснадцяткове значення А1). Якщо ви знаєте, що файл містить текст (у коді ASCII), і, якщо буде виявлений один чи кілька символів "Control-Z", відновлювати файл потрібно в такий спосіб (у противному випадку продовжуйте роботу з кроку 5):

а. Якщо був виявлений один чи кілька символів "Control-Z", ви знаєте, що файл займає тільки один кластер. Починайте відновлювати файл шляхом приміщення будь-якого числа від (F) FF8 до (F) FFF в елемент таблиці FAT, що відповідає цьому кластеру.

б. Зміните шіснадцяткове значення E5 в елементі каталогу на будь-який потрібний вам перший символ імені файлу.

в. Повернувши на підказку операційної системи MS-DOS, використовуйте команду DIR для перевірки того, що файл з'явився в списку файлів диска. Відкрийте файл текстовим чи редактором текстовим процесором для того, щоб переконатися, що його вміст залишився правильним. Усі! Тепер вам потрібно на цьому зупинитися й ігнорувати всі наступні кроки.

5. Якщо кінець файлу не був знайдений, переглянете всі наступні елементи таблиці FAT (послідовно) доти, поки ви не зустрінете елемент, що містить значення 000. Переглянете вміст кластера, що має такий само номер, що й елемент таблиці FAT. Якщо уміст виявиться частиною стертого файлу, запам'ятаєте номер цього кластера і продовжите перегляд інших елементів таблиці FAT і еквівалентних їм кластерів доти, поки ви не рахуєте, що досягли кінця файлу. Обсяг перегляду залежить від декількох моментів, описаних у наступному кроці.

6. Визначите по розмірі файлу, узятому з елемента каталогу, скільки кластерів повинний займати файл. Крім цього, помнете, що, якщо ви відновлюєте текстовий файл у коді ASCII, наявність у кластері символу "Control-Z" (шіснадцяткове значення A1) указує на кінець файлу.

Отже, повертайтеся назад на крок 5 доти, поки ви не досягніть максимального числа кластерів, зайнятих файлом. Відзначайте кожен номер кластера, що містить дані, стосовні, на вашу думку, до стертого файлу. Якщо в якомусь кластері ви зустріли символ "Control-Z", але ще не визначили, скільки кластерів повинне складати шуканий файл, будьте обережні: кластер, у якому з'явився символ "Control-Z", може означати кінець іншого стертого файлу. Переглянете інші наступні елементи каталогу по стертих файлах і відзначте для себе їхні початкові кластери, а також розміри їхніх файлів. Можливо, що два чи більш стертих файли мають переплетені шляхи доступу до послідовностей своїх кластерів.

7. Після того, як ви обґрунтовано вирішите, які кластери, зайняті потрібним файлом, як вони зчеплені, а також будете упевнені в тім, що знайшли кінець файлу, перешикуйте таблицю FAT. Починаючи з першого кластера, перейдіть до еквівалентного елемента таблиці FAT і збережете номер наступного кластера зайнятого файлом. Потім перейдіть на цьому наступний елемент таблиці FAT і збережете номер наступного кластера. Продовжуйте виконувати цю операцію доти, поки не досягнете останнього кластера. Тоді в елемент таблиці FAT ви помістите будь-яке число від (F) FF8 до (F) FFF, щоб відзначити кінець файлу. Далі перейдіть до елемента каталогу, що відноситься до нашого файлу і зміните перший символ із шіснадцяткового значення E5 у те значення в коді ASCII у шіснадцятковому виді), що ви хотіли б бачити як перший символ імені файлу.

8. Отже, усе зроблено. Після повернення на підказку операційної системи MS-DOS, уведіть команду DIR, щоб перевірити, що файл з'явився в каталозі диска. Якщо відновлюваний файл є текстовим файлом, відкрийте файл текстовим чи редактором текстовим процесором, щоб перевірити його вміст. Якщо це файл якогось іншого типу (наприклад, файл, що має розширення імені. ЧИ СОМ. EXE), завантажите файл, як програму для перевірки, чи працює вона правильно.

5. Реалізація програми

Програма написана на мові ASM-86 з використанням команд процесора 286/386. Вона складається з головної програми, яка перевіряє параметр - файл, який потрібно відновити, знаходить цей файл, якщо він є, серед вилучених, та відновлює його.

Програма компілюється Turbo Assembler, зв’язується за допомогою TLINK.

6. Системні вимоги

IBM сумісний комп’ютер із мікропроцесором Intel 80386 або старшим.

Для перегляду результатів - Turbo Debugger або інший відлагоджувач.

7. Інструкція для користувача

Для запуску програми, яка дозволяє відновлювати файли, треба в командному рядку набрати UNDEL.com потім, через проміжок набрати ім'я файлу, який треба відновити на диску a, та натиснути Enter. Програма перевірить, чи є таке ім'я на диску серед вилучених файлів, і якщо є, то відновить його.


8. Висновки

Отже, є розробленою програма, яка виконує відновлювання вилучених файлів. Також був розглянутий алгоритм відновлювання файлів, які були вилучені. По перерахованим вище кроках може показатися, що процедура відновлення файлів є досить прямолінійної. У залежності від наявних у вашому розпорядженні програмних інструментів, у дійсності однак перегляд даних на диску й запис інформації на диск може бути складним заняттям. Відзначимо тут, що кроки 6 і 7 містять застереження про можливість того, що трохи раніше стертих файлів можуть переплестися через складну послідовність розташування їхніх кластерів. Відновлення переплутаних даних зазначеним вище способом може виявитися дуже нудотним і в той же час головоломним заняттям. Але при наявності терпіння (можливо усього лише невеликого!), і, змусити себе бути методичним, ви неодмінно зможете розплутати файли.


9. Використана література

1) “Програмування на мові Асемблера ЕС ЕВМ" З.С. Брич. В.I. Воющ Москва 1989 р. ст.166

2) “Програмування на сучасних мовах програмування. ” Москва 1990р. ст. 206

3) “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.309

4) “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.155

5) “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.178

6) “Макро Асемблер” К.С. Кропiйко О.Д. Богатирова. Київ - “Наука” 1991р.

7) Електронний довідник BOOK.


Додаток Лістинг програми

FCB_LOC EQU 5CH; Положение FCB для удаленного файла в PSP

SWITCH_LOC EQU 81H; Положение командного рядка

CR EQU 13; ASCII возврат каретки

LF EQU 10; ASCII перевод строки

CODE_SEG SEGMENT

ASSUME CS: CODE_SEG,DS: CODE_SEG,ES: CODE_SEG

ORG 100H

ENTRY: JMP FIRST; пропуск данных

I_O_FLAG DW?; Выбор чтения или записи кластеров

START_CLUSTER DW?; Первый кластер удаленного файла

FILE_SIZE DW?; Размер файла в кластерах (1 кластер =1 сектору)

DISK_DRIVE DB 0; Диск для удаленного файла

NOT_FOUND_MSG DB 13,'File not found deleted$'; Messages

WRITTEN_OVER_MSG DB 13,'File already written over$'

DATA DB 1024 DUP (0); Место под directory и FAT

FIRST:; Начало программы

UNDEL PROC NEAR

MOV AL,CS: FCB_LOC; Получить drive specified - 0 если one given

SUB AL,1; Was it a 1 (A:) or 2 (B:)?

JNC DRIVE_KNOWN; Yes, store drive number

MOV AH, 19H; Нет, получить диск по умолчанию

INT 21H

DRIVE_KNOWN:

MOV DISK_DRIVE,AL; Запомнить диск

MOV DX,17; Директории начинаются с 19 сектора

LOOPs: ADD DX,1; Переход к следующему кластеру директории

CMP DX,33; Проверка на последний кластер директории

JB READ_DIR; Если не последний, переход на чтение

MOV AH,9; Иначе выходим с выдачей сообщения,

LEA DX,NOT_FOUND_MSG; о том, что файл не найден

INT 21H

JMP OUT1; Exit

READ_DIR:

AND I_O_FLAG,0; Выбираем чтение

CALL CLUSTER_I_O; Читаем кластер

LEA DI,DATA; Загружаем адрес проверки

MOV AL,0E5H; Символ проверки - первый символ удаленного файла E5H

MOV CX, 200H; Количество символов проверки 512

SEARCH:;

REPNE SCASB; Проверка

JCXZ LOOPs; If no match (Counter=0), get next dir cluster

MOV SI,FCB_LOC+2; Сравнение со 2 символа на совпадение имен файлов

MOV BX,11; Сравнение 11 символов

CMPLOOP: DEC BX; уменьшить количество сравниваемых символов

CMPS byte ptr [DI], [SI] ; Сравнить файлы

JZ CMPLOOP; Если совпадают, переход на следующий чимвол

CMP BX,0; Сравнение закончено, все символы проверены?

JNZ SEARCH; Нет, переход на продолжение поиска

MOV AX,CS: FCB_LOC+1; Да, получить первый символ файла

MOV [DI-12],AX; Заменить символ E5H на первыый символ файла

OR I_O_FLAG,1; Выбрать запись 1 кластера

CALL CLUSTER_I_O; Запись измененной директории

MOV AX, [DI+14] ; Получить начальный сектор в FAT

MOV START_CLUSTER,AX; Запомнить начальный сектор FAT

MOV AX, [DI+16] ; Получить размер файла (младшее слово)

TEST AX,511; MOD (size,512) =0?

JZ EVEN_K; Да, не добавлять 1 кластер после SHR

ADD AX,512; Нет, добавлять другие кластера

EVEN_K: MOV CL,9; Деление на 512 (512=размер кластера)

SHR AX,CL

MOV DX, [DI+18] ; Получить размер файла (старшее слово)

MOV CL,7; Умножение на 128 (2^16/2^9)

SHL DX,CL

ADD AX,DX; Добавить старшее слово до младшего слова

MOV FILE_SIZE,AX; Сохранить размер

MOV DX,1; Прочитать FAT

AND I_O_FLAG,0; Выбор чтения 1 кластера

CALL CLUSTER_I_O

MOV CX,FILE_SIZE; Счетчик количества кластеров

MOV AX,START_CLUSTER; Проверка на то, что первый кластер свободный

DEC AX;

CALL GET_NEXT_ZERO;

CMP DX,START_CLUSTER

JE FILL; Если свободный, переход на заполнение FAT

MOV AH,13H; Нет, файл перезаписуется

MOV DX,FCB_LOC; Удаляется сохраненная запись директории

INT 21H;

MOV AH,9; Выход с ошибкой

LEA DX,WRITTEN_OVER_MSG

INT 21H

JMP OUT1; переход на выход

FILL: MOV AX,DX; Установить старое свободное пространство в FAT на первый найденный

MOV DX,0FFFH; Указать, что это последний кластер (FFFH=End of file)

CMP CX,1; Если последняя запись? (CX=количество кластеров)

JZ LAST; Да, не надо шукать следующую свободную запись

CALL GET_NEXT_ZERO; Вызов с AX=старый 0 кластер. Возвращает DX=новый 0 кластер

LAST: CALL PUT_FAT_ENTRY; Вызов с AX=старый 0 кластер. Возвращает DX=новый 0 кластер в FAT

LOOP FILL; Обработать следующий кластер

MOV DX,1; Запись измененной 1 копии FAT

OR I_O_FLAG,1; Выбор записи кластера

CALL CLUSTER_I_O; Запись кластера

MOV DX,3; Запись измененной 1 копии FAT

CALL CLUSTER_I_O; Запись кластера

OUT1: INT 20H; Выход

UNDEL ENDP

CLUSTER_I_O PROC NEAR; Чтение кластера

; Вход: DX-начальный сектор

PUSH AX; Сохранить используемые регистры в стеке

PUSH BX; INT 25H изменяет все регистры

PUSH CX

PUSH DX

PUSH DI

MOV AL,DISK_DRIVE; Получить номер диска

MOV CX,1; 1 сектор

LEA BX,DATA; Адрес буфера

TEST I_O_FLAG,1; Проверка на чтение/запись

JNZ WRITE; переход на запись

INT 25H; Чтение секторов

JMP POPOUT; выход с процедуры

WRITE: INT 26H; запись секторов

POPOUT: POPF; убрать из стека

POP DI; восстановить регистры

POP DX

POP CX

POP BX

POP AX

RET; Выход

CLUSTER_I_O ENDP

GET_NEXT_ZERO PROC NEAR; Поиск следующей нулевой записи FAT

; Вход: AX-FAT номер записи (кластер)

; Выход: следующий ноль в DX

PUSH AX; Сохранить используемые регистры в стеке

PUSH BX

PUSH CX

CHECK_NEXT:; Поиск

INC AX; AX начало сдедующей записи

MOV BX,AX; Получить 3/2*AX для действительного смещения в FAT

SHL BX,1;

ADD BX,AX

SHR BX,1; BX - значение смещения записи FAT in AX

MOV DX,WORD PTR DATA [BX] ; в DX записеется значение записи FAT

TEST AX,1; Запись четная?

JZ EVEN_ENTRY; Да, использовать младшие 12 bits

MOV CL,4; Нет, использовать старшие 12 bits

SHR DX,CL

EVEN_ENTRY:

AND DX,0FFFH; Получить младшие 12 bits

CMP DX,0; значение FAT =0?

JNE CHECK_NEXT; Нет, переход к следующему кластеру

MOV DX,AX; Поместить значение записи из AX

POPS: POP CX; восстановить регистры

POP BX

POP AX

RET

GET_NEXT_ZERO ENDP

PUT_FAT_ENTRY PROC NEAR; Запись новой FAT записи в FAT

; Получает номер уластера FAT в AX и новую запись в DX

PUSH AX; Сохранить используемые регистры в стеке

PUSH BX

PUSH CX

PUSH DX

MOV BX,AX; Получить смещение в FAT, 3*AX/2

SHL BX,1; Умножить на 2

ADD BX,AX; Добавит AX для получения 3*AX

SHR BX,1; Деление на 2 - BX содержит значение смещения FAT

TEST AX,1; Четный номер?

JZ P_EVEN_ENTRY; Да, использовать младшие 12 bits

MOV CL,4; Нет, использовать старшие 12 bits

SHL DX,CL

P_EVEN_ENTRY:

OR WORD PTR DATA [BX],DX; Записать номер кластера в FAT

POP DX; восстановить регистры

POP CX

POP BX

POP AX

RET

PUT_FAT_ENTRY ENDP

CODE_SEG ENDS

END ENTRY


Информация о работе «Розробити програму-аналог програми Doc Undelete»
Раздел: Информатика, программирование
Количество знаков с пробелами: 37470
Количество таблиц: 1
Количество изображений: 0

0 комментариев


Наверх