2 вхід FAT) |___________|

(указує на ____________

 5 вхід FAT) |FILE2.TXT |

 |___________|

 Область файлів даних Відповідний вхід FAT

 __________________________________

 | FILE1.TXT | 2

 |________________________________|

 | FILE1.TXT | 3

 |________________________________|

 | FILE1.TXT | 4

 |________________________________|

 | FILE2.TXT | 5

 |________________________________|

 | FILE2.TXT | 6

 |________________________________|

 | FILE2.TXT | 7

 |________________________________|

 | не використається (доступний) | 8

 |________________________________|

Відповідність між FAT й областю файлів даних

 ;-і-і-і Одержати номер наступного посилання з 12-бітової FAT

 ;Параметри:

 ; ax = поточний номер ліворуч

 ; ds:bx = адреса FAT (повинна бути безперервної)

 ;

 ; Повертає:

 ; ax = номер наступного посилання

 ;

 ; Використає ax, bx, cx

 next 12 proc near

 add bx,ax /ds:bx - частковий індекс

 shr ax,1/ax = зсув /2

 / зрушення не потрібний

 pushf / зберегти зрушення

 add bx,ax /ds:bx - індекс номера наступного кластера

 mov ax,|bx| /ax = індекс номера наступного кластера

 popf / зрушення не потрібний

 jc shift / пропустити при використанні більше 12 біт

 and ax,0fffh / менш 12 біт

 ret

 shift: mov cx,4/ cx = лічильник зрушень

 shr ax,c1 /cx =

 ret

 next12 endp

Ассемблерная програма для доступу до 12-бітового FAT

 

Корневий каталог

Входи каталогу, як у кореневому, так й у підкаталогах, мають довжину 32 байта. Кожен вхід включає ім'я файлу й розширення, розмір файлу, початковий вхід в FAT , час і дату створення або останньої модифікації файлу і його атрибути. Ця структура нагадує формат блоків управління файлом (file control blocks - FCBs) для СР/М, використовуваний у файловій системі MS DOS, версії 1.х.

Угода про найменування файлів в MS DOS відбувається також з СР/М: восьмисимвольне ім'я файлу й наступний за ним трьохсимвольний тип файлу, вирівняні ліворуч і при необхідності доповнені пробілами. В межах обмежень символьного ряду ім'я й тип є абсолютно довільними. Час і дата задаються у форматі, використовуваному іншими функціями MS DOS і відбивають час останнього запису файлу.

Показаний дамп сектора каталогу обсягом 512 байт, що тримає 16 входів (кожен вхід у цьому прикладі займає два рядки). Байт зі зсувом ОАВН, що містить значення 10Н позначає, що вхід починаючи з адреси 0А0Н, ставиться до підкаталогу. Байт зі зсувом

 ;-і-і-і Одержати номер наступного посилання з 16-бітової FAT

 ;Параметри:

 ; ax = поточний номер ліворуч

 ; ds:bx = адреса FAT (повинна бути безперервної)

 ;

 ; Повертає:

 ; ax = номер наступного посилання

 ;

 ; Використає ax, bx, cx

 next 16 proc near

 add ax,ax /ax = зсув ліворуч

 add bx,ax /ds:bx - індекс номера наступного посилання

 mov ax,|bx| /ax = номер наступного посилання

 ret

 next16 endp

Ассемблерная програма для доступу до 16-бітового FAT

160Н, що містить 0Е5Н, означає, що файл вилучений. Байт зі зсувом

8ВН і значенням 08Н указує, що вхід каталогу, починаючи зі зсуву

80Н, є міткою тому. В остаточному підсумку, байт зі зсувом 1Е0Н

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

 Корнєвій каталог може мати спеціальний тип входу, що називається міткою тому, ідентифікується типом атрибута 08Н и використається для позначення імені диска. Корнєвій каталог може містити тільки одну мітку тому. Корнєвій каталог може також включати входи, указиває на підкаталоги; такі входи ідентифікуються типом атрибута 10Н і нульовим розміром файлу. Програми обробки підкаталогів повинні здійснює трасування ланцюжків кластерів в FAT.

Два інших особливих типи входів каталогу зустрічаються тільки в підкаталогах. Ці входи містять <імена_файлів>. и.., що означає відповідно поточний каталог і батьківський каталог для поточні. Ці спеціальні входи, називані іноді альтернативними іменами каталогу (directory aliases), використаються для швидкого переміщення в структурі каталогу.

 0 1 2 3 4 5 6 7 8 9 A B C D E F

0000 49 4F 20 20 20 20 20 20-53 59 53 27 00 00 00 00 10......SYS'.....

0010 00 00 00 00 00 00 59 53-89 0B 02 00 D1 12 00 00 ......YS....O....

0020 4F 53 44 4F 53 20 20 20-53 59 53 27 00 00 00 00 MSDOS...SYS'....

0030 00 00 00 00 00 00 41 49-52 0A 07 00 C9 43 00 00 ......AIR...IC..

0040 41 4E 53 49 20 20 20 20-53 59 53 20 00 00 00 00 ANSI.....SYS....

0050 00 00 00 00 00 00 41 49-52 0A 18 00 76 07 00 00 ......AIR...V...

0060 58 54 41 4C 4B 20 20 20-45 58 45 20 00 00 00 00 XTALK....EXE....

0070 00 00 00 00 00 00 F7 7D-38 09 23 02 84 0B 01 00 ......W18.......

0080 4C 41 42 45 4C 20 20 20-20 20 20 08 00 00 00 00 LABEL...........

0090 00 00 00 00 00 00 8C 20-2A 09 00 00 00 00 00 00 .........*.D..R.

00A0 4C 4F 54 55 53 20 20 20-20 20 20 10 00 00 00 00 LOTUS...........

00B0 00 00 00 00 00 00 E0 OA-E1 C6 A6 01 00 00 00 00 ......'.a.&.a...

00C0 4C 54 53 4C 4F 41 44 20-43 4F 4D 20 00 00 00 00 LTSLOAD.COM.....

00D0 00 00 00 00 00 00 E0 0A-E1 06 A7 01 A0 27 00 00 ......'.a.......

00E0 4D 43 49 2D 53 46 20 20-58 54 4B 20 00 00 00 00 MCI-SE...XTK....

00F0 00 00 00 00 00 00 46 19-32 0D B1 01 79 04 00 00 .......F.2.1.y..

0100 58 54 41 4C 4B 20 20 20-48 4C 50 20 00 00 00 00 XTALK...HLP.....

0110 00 00 00 00 00 00 C5 6D-73 07 A3 02 AF 88 00 00 ......Ems.#.....

0120 54 58 20 20 20 20 20 20-43 4F 4D 20 00 00 00 00 TX COM....

0130 00 00 00 00 00 00 05 61-65 0C 39 01 E8 20 00 00 .................

0140 43 4F 4D 4D 41 4E 44 20-43 4F 4D 20 00 00 00 00 COMMAND COM .....

0150 00 00 00 00 00 00 41 49-52 0A 27 00 55 3F 00 00 ......AIR.'.UP...

0160 E5 32 33 20 20 20 20 20-45 58 45 20 00 00 00 00 e23 EXE.....

0170 00 00 00 00 00 00 9C B2-85 0B 42 01 80 5F 01 00 ........2..B.....

0180 47 44 20 20 20 20 20 20-44 52 56 20 00 00 00 00 GD.......DRV.....

0190 00 00 00 00 00 00 E0 0A-E1 06 9A 01 5B 08 00 00 .......'a...'....

01A0 4B 42 20 20 20 20 20 20-44 52 56 20 00 00 00 00 KB.......DRV.....

01B0 00 00 00 00 00 00 E0 0A-E1 06 9D 01 60 01 00 00 .......'a...'....

01C0 50 52 20 20 20 20 20 20-44 52 56 20 00 00 00 00 PR.......DRV.....

01D0 00 00 00 00 00 00 E0 0A-E1 06 9E 01 49 01 00 00 .......'a..'.....

01E0 00 F6 F6 F6 F6 F6 F6 F6-F6 F6 F6 F6 F6 F6 F6 F6 .................

01F0 F6 F6 F6 F6 F6 F6 F6 F6-F6 F6 F6 F6 F6 F6 F6 F6 .................

Шестнадцатеричный дамп сектора каталогу обсягом 512 байт

Область файлу

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


Практична частина

 

Лістинг модулів програми

Модуль, який блокує запуск COM та EXE файлів

#include <fcntl.h>

#include <io.h>

#include <dos.h>

#include <stdio.h>

#include <string.h>

#include <process.h>

unsigned char buffer[3];

FILE *fd;

int handle;

fail(char *);

void pass(char *);

main(int argc,char *argv[])

 {

 int n;

 if(argc!=3)

 {

 printf("\nFailpass Utility v1.0 Email: chingpongin@yahoo.co.in");

 printf("\nEnable/Disable .EXE or .COM execution");

 printf("\nsyntex failpass fail <filename.extension>");

 printf("\n or");

 printf("\n failpass pass <filename.extension>");

 exit(2);

 }

 strupr(argv[1]);

 n=strcmp(argv[1],"FAIL");

 if(n==0)

 {

 fail(argv[2]);

 exit(2);

 }

 n=strcmp(argv[1],"PASS");

 if(n==0)

 {

 pass(argv[2]);

 exit(2);

 }

 return 0;

}

fail(char *fname)

 {

 _chmod(fname,1,FA_ARCH);

 fd=fopen(fname,"rb+");

 if(fd==NULL)

 {

 printf("\nCann't open %s\n\n",fname);

 exit(2);

 }

 fseek(fd,0,SEEK_SET);

 fread(buffer,2,1,fd);

 if(buffer[0]==0xcd)

 if(buffer[1]==0x20)

 {

 fclose(fd);

 printf("\n%s already protected...\n\n",fname);

 exit(2);

 }

 fseek(fd,0,SEEK_END);

 fwrite(buffer,2,1,fd);

 fseek(fd,0,SEEK_SET);

 buffer[0]=0xcd; /* don't take any PANGA with this line */

 buffer[1]=0x20; /* don't take any PANGA with this line */

 fwrite(buffer,2,1,fd);

 fclose(fd);

 return 0;

}

void pass(char *fname)

 {

 int xyz;

 fd=fopen(fname,"rb+");

 if(fd==NULL)

 {

 fclose(fd);

 printf("\nCannot open file %s\n\n",fname);

 exit(2);

 }

 fseek(fd,0,SEEK_SET);

 fread(buffer,2,1,fd);

 if(buffer[0]!=0xcd)

 if(buffer[1]!=0x20)

 {

 fclose(fd);

 printf("\n%s is NOT protected....\n\n",fname);

 exit(2);

 }

 fseek(fd,-2,SEEK_END);

 fread(buffer,2,1,fd);

 fseek(fd,0,SEEK_SET);

 fwrite(buffer,2,1,fd);

 fclose(fd);

 handle=open(fname,O_RDWR);

 chsize(handle,(filelength(handle))-2);

 close(handle);

}

Модуль, який пише та читає інформацію напряму в ділянку диску без звертання до FAT системи

include common.mac

text segment use16

assume CS:text, DS:text

org 256

myproc proc

mov AH,09h ;printing function

printf g ;print g

printf g1 ;print g1

;parse the command line...

getf guff ;guff will have the command line

;is the command line empty?

cmp guff[0], 0

je expl

;is the command line starting with ?

cmp guff[0], '?'

je expl

;we are reading the disk

cmp guff[0], '^'

je readdisk

;nothing else but to write...

jmp writedisk

writedisk:

printf g2

waitenter

mov AH, 09h ;writing out

printf g3 ;what are we doing

printf guff ;file name

call disk_write ;write to disk

jmp rc

readdisk:

printf g2

waitenter

call disk_read ;write from disk

jmp rc

expl:

printf gline

jmp rc

rc: ;return

mov AX, 4C00h

int 21h

myproc endp

;====================================================================

;====================================================================

;==================== Procedure: disk_read =======================

;====================================================================

;====================================================================

disk_read proc

mov AH, 02h ;read raw input

mov AL, 1 ;number of sectors

mov CH, 0 ;cylinder

mov CL, 1 ;sector

mov DH, 1 ;head

mov DL, 0 ;disk drive - floppy

lea BX, guff

int 13h ;call BIOS

jnae ocr

;now guff stores file name

mov AH, 02h

mov AL, 1

mov CH, 1

mov CL, 1

mov DH, 0

mov DL, 0

lea BX, file

int 13h ;call BIOS

jnae ocr

;decrypt data

call chiper

;write output to the file saved

mov AH, 3Ch ;create file

mov CX, 0 ;no attributes

lea DX, guff ;name

int 21h ;call DOS

mov handle, AX ;get file handle

mov AH, 40h ;write to file

mov BX, handle ;handle

;get len

mov CX, 0 ;dump CX and SI

mov SI, 0

clen:

cmp file[SI], 0 ;is it zero yet?

je clenf ;this is the len

inc SI ;increase counting

inc CX ;increase counting

jmp clen ;jump back

clenf:

lea DX, file ;file data

int 21h ;call DOS

mov AH, 3Eh ;close file

mov BX, handle ;handle

int 21h ;call DOS

;open file for writing....

mov AH, 09h

printf success

jmp finr

ocr:

mov AH, 09h

printf error

finr: ret

disk_read endp

;====================================================================

;====================================================================

;====================================================================

;====================================================================

;==================== Procedure: disk_write ======================

;====================================================================

;====================================================================

disk_write proc

;write file name

mov AH, 03h ;write raw output

mov AL, 1 ;write 1 sector

mov CH, 0 ;cylinder zero

mov CL, 1 ;sector no 1

mov DH, 1 ;head 1

mov DL, 0 ;disk drive A:

lea BX, guff ;set buffer

int 13h ;call BIOS

;read file...

mov AH, 3Dh ;open file

mov AL, 2 ;read-write

lea DX, guff ;file name

int 21h ;call DOS

mov handle, AX ;get handle

mov AH, 3Fh ;reading file

mov BX, handle ;set handle

mov CX, 1024 ;reading

lea DX, file ;buffer

int 21h ;call DOS

;encrypt data

call chiper

;looping through each

mov AH, 03h

mov AL, 1

mov CH, 1

mov CL, 1

mov DH, 0

mov DL, 0

lea BX, file

int 13h

;show message

jnb okw

occ:

mov AH, 09h

printf error

jmp fin

okw:

mov AH, 09h

printf success

fin: ret ;return backwards

disk_write endp

;====================================================================

;====================================================================

;====================================================================

;====================================================================

;==================== Procedure: chiper ==========================

;====================================================================

;====================================================================

chiper proc

mov SI, 0

;xor values

chipe:

cmp file[SI], 0

je chipf ;jump if zero...

xor file[SI], 3

inc SI ;increase counter

jmp chipe

chipf:

ret ;return

chiper endp

;====================================================================

;====================================================================

g db 'Welcome to Disk Encryptor 1.1...', 10, 13, 'This program allows you to save encrypted data onto the disk....', 10, 13, 'Features: Data Chipering, Maximum of 1024 bytes of raw data', 10, 13,'Software Written in Assembler', 10, 13, '$'

gline db 10, 13, '? - help', 10, 13, '^ - reads a file from the floppy', 10, 13, '[Filename] - Saves the file onto a floppy', 10, 13, '$'

g1 db 'Copyright (C) Daniel Moisyeyev 2002. All Rights Reserved.', 10, 13, 10, 13, '$'

g2 db 10, 13, 'Please insert a floppy and press any key...', 10, 13, '$'

g3 db 10, 13, 'About to write $'

error db 10, 13, 'Error occured$'

success db 10, 13, 'Operation Completed$'

num db 4 dup(0), '$'

guff db 15 dup(0)

;file storage

handle dw 0

file db 1024 dup(0)

text ends

end myproc


Робота з програмою

Розроблена програма являє собою дві утіліти командного рядку. Перша дозволяє блокувати запуск виконавчіх файлів COM та EXE:

failpass fail <filename.extension>

failpass pass <filename.extension>

 друга – тестує роботу з ділянкою диску в обхід FAT системи

Please insert a floppy and press any key...

About to write

Operation Completed


Висновки

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

Драйвер пристрою, у свою чергу, перетворить запит MS-DOS на логічний сектор у фізичну адресу блокового пристрою. Первісна файлова система MS DOS записана за допомогою програми MS-DOS FORMAT (див. теоретичну частину роботи).


Література

1. Нейбауэр А. Моя первая программа на С/С++. П., 1995. 368 С.

2. Бруно Бабэ. Просто и ясно о Borland C++. М., 1996. 400 С.

3. ObjectWindows для C++. К., 1993., 208 С.

4. Н. Барканати. Программирование игр для Windows на Borland C++. М., 1994.


Информация о работе «Програма для роботи з файловою системою»
Раздел: Информатика, программирование
Количество знаков с пробелами: 32269
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
27773
0
2

... С++ та мови низького рівня програмування – Асемблера. Використання різних методів та ресурсів програмування дозволило створити невелику за об’ємом та швидкодіючу програму емуляції роботи командного процесора ОС. ЛІТЕРАТУРА 1. Баженова І. Ю. Visual C++ 6.0 Уроки програмування. – Київ: Фоліо, 1997 2. Б. Керниган, Д. Ричи. Язык программирования «С». – Москва: Видавництво 1996 3. Белецкий ...

Скачать
38056
3
14

... його. Наприклад, вводимо назву виробу, норму витрат та кількість виробів – і перевіряємо обчислену потребу матеріалу. Програма цієї курсової роботи з дисципліни «Системне програмування та операційні системи» призначена для перевірки тестового контролю знань. Кожне запитання тесту може мати кілька варіантів відповідей: 1. Набір програмних модулів, які дозволяють керувати машиною? операційна ...

Скачать
10408
0
0

Windows? 1.Основні елементи інтерфейсу Windows При завантаженні операційної системи на екрані монітора з’являється Робочий стіл, на якому розташовані в першу чергу стандартні об’єкти (папки) Windows, а потім об’єкти, додані користувачем. До стандартних об’єктів відносяться: 1) мой комп’ютер – містить у собі всі об’єкти ПК: диски, периферійні пристрої, панель управління. 2) корзина – мі ...

Скачать
49602
4
0

... Але, щоб отримати доступ до цих файлів, їх треба спочатку розпакувати. Файли з розширеннями .TAR прийшли зі світу ОС UNIX – зазвичай їх запаковують у a GZIP файл (.GZ). такі файли також можна видозмінювати за допомогою файлового менеджера Windows Commander. Архіви формату CAB використовуються Microsoft для інсталяції програм. CAB архіви можна розпаковувати тільки в Windows Commander. Файли CAB пі ...

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


Наверх