|
>
Команда форматирования инициализирует
новую дискету.Когда вы
инициализируете дискету, происходит запись
на нее маркеров
идентификации секторов.Эти поля контроллер использует при
операциях чтения и записи для опознавания
секторов.Например, во
время операции чтения BIOS посылает четыре
байта идентификации
сектора в контроллер дисковода.Эти четыре байта обычно
соответствуют номеру дорожки, номеру
головки, номеру сектора и
размеру сектора, и называются номером
цилиндра-головки-записи CHRN.
Контроллер использует значение номера CHRN
сравнивая его со
значениями, записанными в поля
идентификации секторов во время
форматирования.
Это означает, что контроллер не обращает
внимания на то, что
записано в поле номера CHRN на дискете,
т.е. сектора могут
пронумерованы в произвольном порядке, не
от первого до восьмого на
каждой дорожке. Как только контроллер
находит сектор, у которого
поле номера CHRN совпадает с заданным, он
читает сектор. Значения
Microsoft (R) Macro Assembler Version 5.001/1/80
04:06:20
Фиг. 9.5 Форматирование дискетыPage1-1
PAGE
,132
TITLE
Фиг. 9.5 Форматирование дискеты
0000 STACK SEGMENT STACK
00000040[ DW 64 DUP (?)
????
]
0080 STACK ENDS
0000 CODE SEGMENT
ASSUMECS:CODE,ES:CODE
000000 00 01 02 00 00 02 ID_BUFFER
DB 0, 0, 1, 2, 0, 0, 2, 2
02
000800 00 03 02 00 00 04 DB 0, 0, 3, 2, 0, 0, 4, 2
02
001000 00 05 02 00 00 06 DB 0, 0, 5, 2, 0, 0, 6, 2
02
001800 00 07 02 00 00 08 DB 0, 0, 7, 2, 0, 0, 8, 2
02
0020
FORMATPROC FAR
00201E PUSH DS ; Адрес возврата в ДОС
00212B C0 SUB AX, AX
002350 PUSH AX
00248D 1E 0000 R LEA BX, ID_BUFFER ; Занесение
адреса буфера в ES:BX
00280E PUSH CS
002907 POP ES
002AB9 0001 MOV CX, 1 ; Трек 0, сектор 1
002DBA 0000 MOV DX, 0 ; Дисковод 0, сторона 0
0030
TRACK_LOOP:
00308D 3E 0000 R LEA DI, ID_BUFFER ;
Необходимо для занесения номера
0034B0 08 MOV AL, 8 ;трека в буфер форматирования
0036
ID_SETUP:
003626: 88 2D MOV ES:[DI], CH ; Занесение
номера трека (цилиндра)
003983 C7 04 ADD DI, 4 ; Переход
на следующее поле
003CFE C8 DEC AL
003E75 F6 JNZ ID_SETUP ; Цикл по полям в
буфере
0040B8 0501 MOV AX, 501H ; Форматирование
0043CD 13 INT 13H
0045FE C5 INC CH ; Переход на
следующий трек
004780 FD 40 CMP CH, 40H ; Все
сформатировано?
004A75 E4 JNE TRACK_LOOP ; Цикл по трекам
004CCB RET
; Возврат в ДОС
004D
FORMATENDP
004D CODE ENDS
END
FORMAT
Фиг. 9.5 Форматирование дискеты
номера CHRN контроллер помещает на дискету
во время операции
форматирования. Вы имеете возможность
записать в качестве значений
номера CHRN любые значения, которые
выберете. Буфер данных для
команды форматирования содержит байты
номера CHRN для каждого
сектора дискеты. Это означает, что буфер
данных может содержать
например такие значения:
DB10,0,1,2,10,0,2,2
DB10,0,3,2,10,0,4,2
для дорожки 10 стороны 0 дискеты. Это
пример поля данных,
которое использует команда FORMAT
операционной системы PC DOS или
MS DOS. На Фиг. 9.5 показана программа,
которая форматирует
одностороннюю дискету с обычными
значениями номера CHRN. Заменять
этой программой команду FORMAT
операционной системы PC DOS нельзя,
так как система PC DOS также проверяет
дискету и записывает на
дискету справочник и таблицу расположения
файлов. Еще вы можете
заметить, что эта программа сразу же после
запуска начинает
форматировать дискету в дисководе A:. Вы должны быть готовы к
этому, если собираетесь выполнить эту
программу.
Вы можете использовать команду
форматирования в том случае,
если хотите защитить дискету от
копирования. Защита от копирования
означает, что дискета шифруется таким
образом, что ее становится
трудно скопировать. Так как утилита
DISKCOPY предполагает, что
идентификаторы секторов записаны обычным
образом, она не может
копировать дискету с не стандартными
номерами секторов. Записав на
дискету идентификатор сектора, отличный от
нормального, вы защитите
ее от копирования.
В качестве примера давайте защитим дискету
от копирования,
записав не стандартный номер сектора на
дорожку 10. Пример,
приведенный выше, показывает обычные
номера секторов. Если вместо
них буфер данных будет содержать значения
DB 10, 0, 10, 2, 10, 0,
2, 2 DB 10, 0, 3, 2, 10, 0, 4, 2
дорожка 10 не будет иметь сектора 1.
Вместо него на ней
появится сектор 10, которого не бывает на
нормальной дискете
системы PC DOS. Программа DISKCOPY не
может скопировать дорожку 10
правильно. Если теперь данная программа
проверит (с помощью команды
проверки) наличие сектора 10 на дорожке 10
дискеты, отсутствие
ошибки будет означать, что дискета
оригинальная, а не копия.
Этот способ защиты от копирования не
совсем надежен. Каждый
опытный пользователь (и даже некоторые
программы копирования) могут
обнаружить защиту такого типа и обойти ее.
Но модификация
идентификаторов секторов не может
производиться произвольно. Для
определения адреса установки головок BIOS
использует номер дорожки
из поле CHRN, так что номер цилиндра
должен соответствовать номеру
цилиндра, на котором находится сектор. Код
в байте номера головки
определяет установку электронного
переключателя, выбирающего
головку, поэтому это значение должно быть
задано корректно. Длина
поля берется из таблицы параметров, а не
из регистров при вызове,
так что ее изменить трудно. К тому же, это
число использует и BIOS,
и контроллер, определяя длину сектора, так
что изменить его вы
сможете только после тщательной
подготовки. Свободно изменяемым
остается только номер сектора. Перед тем,
как вы начнете изменять
номера секторов, запомните, что если при
этом вы собираетесь еще
использовать эту дискету в рамках DOS,
система будет пытаться
использовать сектор, который вы заменили
сектором со своим
нестандартным номером, если вы не
модифицируете таблицу
расположения файлов дискеты так, чтобы
зарезервировать этот сектор.
Если вам нужно считывать по нескольку
секторов (что позволяет
драйвер дисковода BIOS), номера у секторов
должны быть
последовательными, но не обязательно
начинаться с первого.
В общем, команда форматирования дает
некоторое средство защиты
от копирования. Однако абсолютно надежный
метод защиты еще не
найден. Только хороший выбор техники
шифрования поможет оставить
честных людей честными.
|