|
Розробити програму-аналог програми Doc Undelete
Розробити програму-аналог програми Doc Undelete
23 Міністерство освіти та науки України Кіровоградський Державний Технічний університет Кафедра програмного забезпечення Курсова робота з дисципліни “Програмування на мові ASM-86” на тему: Розробити програму-аналог програми ДОС UNDELETE Зміст - 1. Вступ
- 2. Постановка задачі
- 3. Обґрунтування вибору методів розв'язку задачі
- 4. Алгоритм програми
- 5. Реалізація програми
- 6. Системні вимоги
- 7. Інструкція для користувача
- 8. Висновки
- 9. Використана література
- Додаток
1. ВступТепер комп'ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп'ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп'ютери одержали широке розповсюдження, комп'ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.На сьогоднішній день можливість вирішення багатьох задач на комп`ютерах визначається необхідністю інформаційної швидкості та ефективності характерних обчислювальних засобів, тому розширення сфери використання комп`ютерної техніки в останній час обумовлено в першу чергу ростом продуктивності.В операційних системах є таке поняття, як вилучення файлів з диска. Але така операція може бути небезпечною, бо користувач може помилково вилучити файл, який ще потрібен. Тому необхідність програм, які б могли хоча б у деяких випадках відновляти вилучені файли, дуже велика.2. Постановка задачіРозробити програму-аналог програми ДОС UNDELETE на мові програмування ASM-86.3. Обґрунтування вибору методів розв'язку задачіОтже, необхідно написати програму-аналог програми UNDELETE. При виборі алгоритму програми я використала інформацію з електронного довідника BOOK.Сектора каталогу.Сектора каталогу містять інформацію про каталог для усіх файлів у кореневому каталозі диска. Інформація для файлів, що містяться в підкаталогах, зберігається у файлі підкаталогу, елемент для який поміщений у його батьківський каталог (кореневий чи інший підкаталог). Коли ви видаєте команду DIR, інформацію одержують із секторів каталогу, якщо зчитується кореневий каталог, чи одержують із файлу підкаталогу, що описує поточний підкаталог. Оскільки один сектор звичайно займає 512 байтів у довжину, ми можемо легко обчислити, що кожен елемент каталогу має довжину 32 байта. Загальна кількість елементів у кореневому каталозі залежить від того, скільки секторів каталогу задано. Наприклад, однобічні гнучкі диски усього мають 64 елемента в кореневому каталозі, у те час, як двосторонні 40-трекові диски мають 112 таких елементів, а двосторонні 80-трекові 5,25-дюймові диски мають 224 елемента в кореневому каталозі.Для більшості твердих дисків загальна кількість елементів у каталозі залежить від того, як був відформатований диск. Кожен варіант розбивки твердого диска має максимальна кількість елементів кореневого каталогу, що відповідає регістрам частин розбивки. Загальна кількість елементів кореневого каталогу визначає максимальна кількість імен файлів, що може бути поміщене в кореневий каталог. Це обмеження, однак, не поширюється на підкаталоги. Оскільки елементи підкаталогу, що відповідають розміщеним у підкаталогах файлам, самі поміщені у файл опису підкаталогу, не існує обмежень на кількість файлів, поміщених у підкаталог; файл опису підкаталогу може збільшуватися в міру потреби.Інформація, що міститься в елементі каталогу підрозділяється на шість компонентів, чотири з яких напряму відносяться до відновлення стертих файлів.Чотирма частинами елемента каталогу, з якими ми будемо мати справу, є: ім'я й тип файлу, атрибут (атрибути), початковий кластер і розмір файлу.Ім'я файлу, тип файлу й стан файлу.Ім'я й тип файлу складаються з 11 байтів, у яких представлене ім'я файлу, якому відповідає елемент каталогу. Кожен байт містить символ АSСІІ.В операційній системі MS-DOS версії 2.0 і вище ім'я файлу в елементі каталогу завжди відноситься до файлу, що зберігається в кореневому каталозі. Оскільки імена підкаталогів вважаються операційною системою MS-DOS файлами, вони також мають свої елементи в секторах каталогу. Ім'я підкаталогу, однак, містить інформацію в елементі каталогу, що злегка відрізняється від звичайних файлів. Нижче в розділах цієї глави ми обговоримо ці розходження.Відзначимо також, що під керуванням операційної системи MS-DOS версії 2.0 і вище, максимальне число чи файлів елементів каталогу, що гнучкий диск може вмістити (64, 112 і 224), відповідає скільки обсягу кореневого каталогу. Оскільки усі файли, розміщені в підкаталозі, мають каталогові елементи в самому підкаталозі "файл", не існує обмежень на кількість файлів, який можна розмістити на диску в межах місця, передбаченого конкретним типом чи диска формату.При стиранні файлу з диском відбуваються дві речі. Першим елементом, що торкається до відновлювання, є перший символ імені файлу в елементі каталогу. Перший байт в елементі каталогу може або вказувати стан файлу, або представляти перший символ ASCII в імені файлу. Якщо елемент каталогу не був використаний з моменту останнього форматування диска, перший байт завжди встановлений у значення "00". У такий спосіб операційній системі MS-DOS потрібно тільки вважати перший байт елемента каталогу для визначення, чи може він використовуватися. При створенні файлу перший байт міняється й перетворюється в перший символ імені файлу. Коли пізніше файл стирається, перший байт міняється в шіснадцяткове значення "E5". Інша інформація в елементі каталогу, що відноситься до стертого файлу, залишається колишньої. Коли ви переглядаєте сектори диска в пошуках інформації про елемент каталогу стертого файлу, то значення є для вас першим ключем до розгадки потрібного елемента каталогу.Другим ключем, звичайно, є представлення іншої частини імені файлу і її набір у форматі ASCII. Але перший символ шістнадцяткового значення "E5" говорить про те, що елемент каталогу являє собою стертий файл. Цей байт встановлений у таке значення для того, щоб операційна система MS-DOS знала, що елемент каталогу звільнився й у нього може бути внесена інформація про новий файл, якщо цей елемент буде потрібно системі.Розроблювачі операційної системи MS-DOS передбачили такий спосіб видалення файлів. Завдяки цьому, ми тепер можемо (у більшості випадків) відновити тільки що стертий файл.Атрибут.Байт атрибута містить інформацію про атрибути розміщення файлу. Атрибути вказують, як операційна система MS-DOS поводиться з файлом. Кожен біт цього байта визначає якийсь конкретний атрибут і приймає значення "1", коли цей атрибут призначається файлу. Відзначимо, що файлу може бути призначено кілька атрибутів. Наприклад, якщо файлу призначені атрибути "тільки для читання" (значення 01) і "схований" ("тільки для читання" (значення 02), що результат у байті атрибута буде являти собою суму обох значень атрибутів, тобто значення 03. Інформація, що міститься в байті атрибута може бути, а може не бути корисною для відновлення файлу. Наприклад, малоймовірно, щоб ми стали намагатися відновлювати файл, атрибутом якого було значення "тільки для читання", якщо тільки ми не намагаємося відновити весь зруйнований диск. Звичайно, ми не піклуємося про атрибути файлу. Але, якщо, однак, ми відновлюємо файл з атрибутом "схований", ми захочемо змінити цей атрибут, тому що в противному випадку ми не зможемо побачити цього файлу при видачі команди DIR, а, отже, не зможемо переконатися в тім, що файл був відновлений. Інша причина, по якій ми можемо захотіти звертатися до байта атрибута файлу, полягає в бажанні відновлення імені підкаталогу.Початковий кластер.Початковий кластер являє собою 2-байтовий, 16-цифровий двійковий номер, що визначає першу секцію диска, зайняту файлом. Ця секція диска називається кластером. Незважаючи на те, що фізично зформатованний диск розглядається з погляду треків і секторів, операційна система MS-DOS у дійсності розглядає диск із погляду кластерів секторів, а не окремих цілих секторів. Початковий кластер являє собою вихідний "покажчик" на перший сектор даних файлу, а також на наступні покажчики в секторах таблиці FAT. Вважавши цей початковий покажчик в елементі каталогу, операційна система MS-DOS продовжує зчитувати інші покажчики. На сектори даних файлів у секторі таблиці FAT. Нижче ми будемо говорити про сектори таблиці FAT, але зараз відзначимо, що звертання до початкового кластера є одним із найбільш важливих перших кроків у відновленні стертих чи зруйнованих файлів.Розмір файлу.Розмір файлу представлений 4-байтовим двійковим числом, перший байт якого являє собою молодшу частину розміру файлу. Четвертий байт є старшою частиною розміру файлу, і ми використовуємо це значення для визначення крапкою довжини файлу, і тим самим для визначення кількості секторів, що займав стертий чи файл передбачається, що він займав.Тепер, після того, як були визначені важливі частини елемента каталогу, ми переходимо до розгляду секторів таблиці FAT.Інформація в цих секторах представляє додаткові ключі для розгадки того, як стертий чи зруйнований файл може бути відновлений.Сектора таблиці розміщення файлу (FAT).Сектори, що містять таблицю FAT, використовуються операційною системою MS-DOS для визначення місця розташування на диску кожної частини кожного файлу. На відміну від деяких операційних систем, що завжди розташовують файли послідовно і використовують сектора безупинно, операційна система MS-DOS може розміщати файли й частини одного файлу довільним образом. Система, що завжди розташовує файл послідовно, більш просто може відслідковувати місце розташування файлів, а, отже, може звертатися до файлів більш швидко. Для відновлення файлу, розташованого безупинно, нам потрібно знати тільки адреси його початку й кінця.Усі дані в цьому проміжку є даними файлу.Незважаючи на сказане, безупинне розміщення файлів менш ефективно, коли, наприклад, файл, розташований між іншими файлами, віддаляється і його місце повинне зайняти більший по розмірі. І, якщо файлу, що звільнився після видалення, місця недостатньо для розміщення нового файлу, для цього нового файлу повинне виділятися достатній безупинний простір після останнього з уже розміщених на диску файлів. Якщо на диску вже немає достатнього місця для приміщення файлу, диск вважається повним. Це може викликати реальні труднощі при використанні гнучких дисків із порівняно малою ємністю пам'яті, тому що велика кількість вільної пам'яті витрачається впусту. Операційна система MS-DOS і подібні з нею мікрокомп'ютерні операційні системи, що розташовуються на твердому диску, були так розроблені, що дозволяють використання довільного розміщення, а також послідовного чи безупинного розміщення. Інформація в секторах таблиці FAT дозволяє операційній системі MS-DOS виконувати це.Коли диск перший раз форматується операційною системою MS-DOS і кілька файлів копіюються на цей диск, інформація, поміщена в секторах таблиці FAT, використовується операційною системою MS-DOS для визначення адреси кожної частини файлу. Звертання до файлів іде через таблицю FAT в одиницях "кластер". Файл завжди займає, принаймні, один кластер, а, якщо він досить великий, займає кілька кластерів. Кластер у дійсності є частиною розподілу і складається з одного сектора даних на однобічних гнучких дисках і двох секторів даних на двосторонніх гнучких дисках. Деякі тверді диски використовують кластера, кожний з який складається з восьми секторів. Уся область збереження даних на диску (за винятком області для даних по початковому завантаженню таблиці FAT.Декодування елементів таблиці FAT.Значення в елементі 0 таблиці FAT завжди вказує на формат диска. Елемент 1 завжди встановлений у значення (F) FFF, щоб виступати в ролі чи перешкоди заповнювача між елементом 0 і елементом 2. Усі наступні елементи таблиці FAT використовуються для відображення диска. Кожний з цих елементів містить один із чотирьох типів інформації:наступний номер кластера у файлі;маркер кінця файлу;невикористаний кластер;кластер, позначений, як зарезервований, чи зіпсований.У таблиці 1 перераховані значення, що можуть бути присутнім в елементах таблиці FAT.Усі елементи таблиці FAT містять або 3 - або 4-числові, шістнадцяткові номера. Це значить, що елемент таблиці FAT містить або 12-бітове, або 16-бітове значення. Усі диски, що містять 4085 чи менше кластерів (більшість гнучких дисків і інших змінних носіїв) використовують 12-бітові елементи таблиці FAT, у той час, як диски, що мають більш 4085 кластерів (більшість твердих дисків і деякі змінні диски) використовують 16-бітові елементи таблиці FAT.Таблиця 1Значення елементів таблиці FAT, що керують розміщенням файлів|
Шістнадцяткове значення елемента | Значення таблиці FAT | | (0) 000 | Кластер не використовується і доступний для розміщення нового файлу | | З (F) FF0 до (F) FF6 | Зарезервований кластер (недоступний для звичайного збереження файлів) | | (F) FF7 | Кластер позначений, як зіпсований, операційною системою MS - DOS і не використовується збереження файлів | | З (F) FF8 до (F) FFF | Останній кластер, зайнятий файлом | | (X) XXX | Будь-яку інше значення вказує номер кластера в ланцюги, що визначає порядок розміщення файлу | | |
Чому існує два різних формати таблиці FAT? До того, як була введена підтримка твердих дисків під керуванням операційної системи MS-DOS (версія 2.0 операційної системи MS-DOS), розроблювачі операційної системи MS-DOS намагалися мінімізувати розмір пам'яті, необхідний для розміщення таблиці FAT. Оскільки максимальний розмір кластерів для гнучких дисків менше числа 4085 (2847 кластерів на 1,44 3,5-дюймових дисках), дисковий простір буде витрачатися дарма, якщо будуть використовуватися 16-бітові елементи таблиці FAT, а максимальна кількість кластерів, що може бути відображене при 8-бітових елементах буде дорівнювати 255, що не відповідає вимогам використання пам'яті. Тому для того, щоб декодувати значення елементів таблиці FAT, спочатку потрібно визначити загальна кількість кластерів на диску. Обробка 12-бітових елементів таблиці FAT. Схема операційної системи MS-DOS розміщення чисел, що мають 1,5 байта в довжину, в елементах таблиці FAT на гнучких дисках може показатися дивної. Але треба знати, що операційна система MS-DOS була спроектована з метою швидкого декодування цих байтів. Спосіб, яким операційна система MS-DOS зберігає інформацію в таблиці FAT, полягає в зашифровці елементів таблиці FAT парами, у яких два 1,5-байтовых елементи об'єднані в невелику 3-байтову пару. Якщо ми хочемо визначити номер кластера в елементі 2 таблиці FAT, ми також повинні подивитися на елемент 3 таблиці FAT. Якщо ми хочемо подивитися на номер кластера в елементі 3 таблиці FAT, ми повинні повернутися назад і подивитися на елемент 2 таблиці FAT. Елементи 4 і 5 таблиці FAT будуть теж здвоєні, як і елементи 6 і 7, 8 і 9 і так далі. Якщо з номера кластера витягається тільки три цифри, чому ж друга по старшинству цифра номера першого кластера переставляється на місце молодшої цифри другого кластера? Схема перестановок працює швидше, коли машина сама декодує байти і витягає інформацію. Цифри з'являються вже в переставленому виді тільки тоді, коли користувач читає таблицю FAT через DEBUG. Для декодування інформації у 12-бітових елементах таблиці FAT на чи папері усередині програми потрібно користатися представленою нижче послідовністю дій: 1. Помножити номер елемента таблиці FAT чи кластера на 1,5 байтів (спочатку множте число на 3, а потім поділяєте результат на 2). 2. Використовуйте результат як зсув у таблицю FAT, що вказує на елемент, що відбиває тільки що використовувався кластер. Цей елемент містить номер наступного кластера, займаного тим же файлом. 3. Завантажите слово (2-байтове число), розташоване з цим зсувом, у регістр 4. Тепер у регістрі знаходяться чотири шістнадцяткові цифри. Оскільки нам потрібно тільки три цифри для тризначного елемента таблиці FAT, варто визначити, чи є номер елемента таблиці FAT парним чи непарним числом. 5. Якщо номер елемента представлений парним числом, у регістрі варто зберігати три молодші цифри шляхом виконання операції логічного додавання "И" із зсувом 0FFF. Якщо номер елемента представлений непарним числом, варто зберегти три старші цифри шляхом зрушення регістра вправо на чотири біти командою SHR. 6. Якщо результуючі три цифри являють собою число від FF8 до FFF, це значить, що ви досягли кінця файлу. У противному випадку ці три цифри являють собою номер наступного кластера, зайнятого тим же файлом. Обробка 16-бітових елементів таблиці FAT. Робота з номерами кластерів і елементами таблиці FAT на дисках, що використовують 126-бітові елементи таблиці FAT, значно полегшується в порівнянні з роботою, у якій використовуються 12-бітові елементи таблиці FAT, тому що всі елементи таблиці FAT тут вирівняні на границю слова, тобто, кожен елемент таблиці FAT може чи зчитуватися записуватися, як ціле повне слово. При цьому не потрібно піклуватися про сусідні елементи таблиці FAT. Для декодування інформації у 12-бітових елементах таблиці FAT на чи папері усередині програми потрібно користатися представленою нижче послідовністю дій: 1. Одержати початковий кластер файлу з елемента каталогу 2. Помножити використовуваний номер кластера на 2 (байти; 1 слово). 3. Використовуйте результат як зсув у таблицю FAT, що вказує на елемент, що відбиває тільки що що використовувався кластер. Цей елемент містить номер наступного кластера, займаного тим же файлом. 4. Завантажите слово (2-байтове число), розташоване з цим зсувом, у регістр 5. Якщо результуючі чотири цифри являють собою число від FFF8 до FFFF, це значить, що ви досягли кінця файлу. У противному випадку ці чотири цифри являють собою номер наступного кластера, зайнятого тим же файлом. Перетворення кластерів у логічні сектори. Якщо ви пишете програму, що буде звертатися до області збереження даних на диску, ви знайдете, що такі засоби операційної системи MS-DOS, як переривання "int 25h" (Абсолютне зчитування з диска) і переривання "int 26h" (Абсолютний запис на диск), а також програма-отладчик DEBUG, вимагають, щоб ви вказували номери логічних секторів. Незважаючи на те, що на ілюстраціях структур диска вказується перший сектор диска, як сторона 0, доріжка 0, сектор 1, перший сектор у дійсності дорівнює логічному сектору 0. Усі наступні логічні сектори являють собою послідовні зсуви від 0. Таким чином, логічний сектор 1 буде представлятися, як сторона 0, до ріжка 0, сектор 2, а логічний сектор 2 буде представлятися, як сторона 0, доріжка 0, сектор 3. Оскільки кожен елемент таблиці FAT, відповідно до результатів, отриманим після виконання зазначених вище п'яти дій, завжди створює номер кластера, перераховані нижче дії покажуть вам, як потрібно перетворювати номер кластера в номер логічного сектора: 1. Відняти 2 із номера кластера. 2. Помножити отриманий результат на кількість векторів, використовуваних у кластері, у такий спосіб: а. Для всіх однобічних форматів гнучких чи дисків для двостороннього 80-трекового, 5,25-дюймового формату диска підвищеної щільності запису зробити множення на 1. б. Для всіх двосторонніх 40-трекових, 5,25-дюймових форматів дисків підвищеної щільності запису зробити множення на 2. в. Для двосторонніх 8-дюймових гнучких дисків підвищеної щільності запису зробити множення на 4. м. Для твердих дисків варто використовувати одне з 4 вищенаведених чи значень інше число, що залежить від формату диска. 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 р. ст.1662) “Програмування на сучасних мовах програмування. ” Москва 1990р. ст. 2063) “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.3094) “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.1555) “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.1786) “Макро Асемблер” К.С. Кропiйко О.Д. Богатирова. Київ - “Наука” 1991р.7) Електронний довідник BOOK. ДодатокЛістинг програмиFCB_LOC EQU 5CH; Положение FCB для удаленного файла в PSPSWITCH_LOC EQU 81H; Положение командного рядкаCR EQU 13; ASCII возврат кареткиLF EQU 10; ASCII перевод строкиCODE_SEG SEGMENTASSUME CS: CODE_SEG,DS: CODE_SEG,ES: CODE_SEGORG 100HENTRY: 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$'; MessagesWRITTEN_OVER_MSG DB 13,'File already written over$'DATA DB 1024 DUP (0); Место под directory и FATFIRST:; Начало программыUNDEL PROC NEARMOV AL,CS: FCB_LOC; Получить drive specified - 0 если one givenSUB AL,1; Was it a 1 (A:) or 2 (B:)?JNC DRIVE_KNOWN; Yes, store drive numberMOV AH, 19H; Нет, получить диск по умолчаниюINT 21HDRIVE_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 21HJMP OUT1; ExitREAD_DIR:AND I_O_FLAG,0; Выбираем чтениеCALL CLUSTER_I_O; Читаем кластерLEA DI,DATA; Загружаем адрес проверкиMOV AL,0E5H; Символ проверки - первый символ удаленного файла E5HMOV CX, 200H; Количество символов проверки 512SEARCH:;REPNE SCASB; ПроверкаJCXZ LOOPs; If no match (Counter=0), get next dir clusterMOV 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] ; Получить начальный сектор в FATMOV START_CLUSTER,AX; Запомнить начальный сектор FATMOV AX, [DI+16] ; Получить размер файла (младшее слово)TEST AX,511; MOD (size,512) =0?JZ EVEN_K; Да, не добавлять 1 кластер после SHRADD AX,512; Нет, добавлять другие кластераEVEN_K: MOV CL,9; Деление на 512 (512=размер кластера)SHR AX,CLMOV DX, [DI+18] ; Получить размер файла (старшее слово)MOV CL,7; Умножение на 128 (2^16/2^9)SHL DX,CLADD AX,DX; Добавить старшее слово до младшего словаMOV FILE_SIZE,AX; Сохранить размерMOV DX,1; Прочитать FATAND I_O_FLAG,0; Выбор чтения 1 кластераCALL CLUSTER_I_OMOV CX,FILE_SIZE; Счетчик количества кластеровMOV AX,START_CLUSTER; Проверка на то, что первый кластер свободныйDEC AX;CALL GET_NEXT_ZERO;CMP DX,START_CLUSTERJE FILL; Если свободный, переход на заполнение FATMOV AH,13H; Нет, файл перезаписуетсяMOV DX,FCB_LOC; Удаляется сохраненная запись директорииINT 21H;MOV AH,9; Выход с ошибкойLEA DX,WRITTEN_OVER_MSGINT 21HJMP 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 кластер в FATLOOP FILL; Обработать следующий кластерMOV DX,1; Запись измененной 1 копии FATOR I_O_FLAG,1; Выбор записи кластераCALL CLUSTER_I_O; Запись кластераMOV DX,3; Запись измененной 1 копии FATCALL CLUSTER_I_O; Запись кластераOUT1: INT 20H; ВыходUNDEL ENDPCLUSTER_I_O PROC NEAR; Чтение кластера; Вход: DX-начальный секторPUSH AX; Сохранить используемые регистры в стекеPUSH BX; INT 25H изменяет все регистрыPUSH CXPUSH DXPUSH DIMOV 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 DXPOP CXPOP BXPOP AXRET; ВыходCLUSTER_I_O ENDPGET_NEXT_ZERO PROC NEAR; Поиск следующей нулевой записи FAT; Вход: AX-FAT номер записи (кластер); Выход: следующий ноль в DXPUSH AX; Сохранить используемые регистры в стекеPUSH BXPUSH CXCHECK_NEXT:; ПоискINC AX; AX начало сдедующей записиMOV BX,AX; Получить 3/2*AX для действительного смещения в FATSHL BX,1;ADD BX,AXSHR BX,1; BX - значение смещения записи FAT in AXMOV DX,WORD PTR DATA [BX] ; в DX записеется значение записи FATTEST AX,1; Запись четная?JZ EVEN_ENTRY; Да, использовать младшие 12 bitsMOV CL,4; Нет, использовать старшие 12 bitsSHR DX,CLEVEN_ENTRY:AND DX,0FFFH; Получить младшие 12 bitsCMP DX,0; значение FAT =0?JNE CHECK_NEXT; Нет, переход к следующему кластеруMOV DX,AX; Поместить значение записи из AXPOPS: POP CX; восстановить регистрыPOP BXPOP AXRETGET_NEXT_ZERO ENDPPUT_FAT_ENTRY PROC NEAR; Запись новой FAT записи в FAT; Получает номер уластера FAT в AX и новую запись в DXPUSH AX; Сохранить используемые регистры в стекеPUSH BXPUSH CXPUSH DXMOV BX,AX; Получить смещение в FAT, 3*AX/2SHL BX,1; Умножить на 2ADD BX,AX; Добавит AX для получения 3*AXSHR BX,1; Деление на 2 - BX содержит значение смещения FATTEST AX,1; Четный номер?JZ P_EVEN_ENTRY; Да, использовать младшие 12 bitsMOV CL,4; Нет, использовать старшие 12 bitsSHL DX,CLP_EVEN_ENTRY:OR WORD PTR DATA [BX],DX; Записать номер кластера в FATPOP DX; восстановить регистрыPOP CXPOP BXPOP AXRETPUT_FAT_ENTRY ENDPCODE_SEG ENDSEND ENTRY
|
|