9.11.4. Команда форматирования

Команда форматирования инициализирует новую дискету. Когда вы инициализируете дискету, происходит запись на нее маркеров идентификации секторов. Эти поля контроллер использует при операциях чтения и записи для опознавания секторов. Например, во время операции чтения BIOS посылает четыре байта идентификации сектора в контроллер дисковода. Эти четыре байта обычно соответствуют номеру дорожки, номеру головки, номеру сектора и размеру сектора, и называются номером цилиндра-головки-записи CHRN. Контроллер использует значение номера CHRN сравнивая его со значениями, записанными в поля идентификации секторов во время форматирования. Это означает, что контроллер не обращает внимания на то, что записано в поле номера CHRN на дискете, т.е. сектора могут пронумерованы в произвольном порядке, не от первого до восьмого на каждой дорожке. Как только контроллер находит сектор, у которого поле номера CHRN совпадает с заданным, он читает сектор. Значения номера CHRN контроллер помещает на дискету во время операции форматирования. Вы имеете возможность записать в качестве значений номера CHRN любые значения, которые выберете. Буфер данных для команды форматирования содержит байты номера CHRN для каждого сектора дискеты. Это означает, что буфер данных может содержать например такие значения:


DB     10, 0, 1, 2
DB     10, 0, 2, 2
DB     10, 0, 3, 2
DB     10, 0, 4, 2

для дорожки 10 стороны 0 дискеты. Это пример поля данных, которое использует команда FORMAT операционной системы PC DOS или MS DOS. На Фиг. 9.5 показана программа, которая форматирует одностороннюю дискету с обычными значениями номера CHRN. Заменять этой программой команду FORMAT операционной системы PC DOS нельзя, так как система PC DOS также проверяет дискету и записывает на дискету справочник и таблицу расположения файлов. Еще вы можете заметить, что эта программа сразу же после запуска начинает форматировать дискету в дисководе A:. Вы должны быть готовы к этому, если собираетесь выполнить эту программу.


Microsoft (R) Macro Assembler Version 5.00                  1/1/80 04:03:56
Фиг. 9.5 Форматирование дискеты                                   Page  1-1
PAGE  ,132
                         TITLE    Фиг. 9.5 Форматирование дискеты

0000                     STACK    SEGMENT STACK
0000    0040[                     DW        64 DUP (?)
             ????
            ]
0080                     STACK    ENDS

0000                     CODE     SEGMENT

                                  ASSUME    CS:CODE,ES:CODE
0000    00 00 01 02 00 00 02      ID_BUFFER DB      0, 0, 1, 2, 0, 0, 2, 2
        02
0008    00 00 03 02 00 00 04      DB      0, 0, 3, 2, 0, 0, 4, 2
        02
0010    00 00 05 02 00 00 06      DB      0, 0, 5, 2, 0, 0, 6, 2
        02
0018    00 00 07 02 00 00 08      DB      0, 0, 7, 2, 0, 0, 8, 2
        02

0020                     FORMAT   PROC      FAR
0020    1E                        PUSH      DS            ; Адрес возврата в ДОС
0021    2B C0                     SUB       AX, AX
0023    50                        PUSH      AX
0024    8D 1E 0000 R              LEA       BX, ID_BUFFER ; Занесение адреса буфера в ES:BX
0028    0E                        PUSH      CS
0029    07                        POP       ES
002A    B9 0001                   MOV       CX, 1         ; Трек 0, сектор 1
002D    BA 0000                   MOV       DX, 0         ; Дисковод 0, сторона 0
0030                     TRACK_LOOP:
0030    8D 3E 0000 R              LEA       DI, ID_BUFFER ; Необходимо для занесения номера
0034    B0 08                     MOV       AL, 8         ;    трека в буфер форматирования
0036                     ID_SETUP:
0036    26: 88 2D                 MOV       ES:[DI], CH   ; Занесение номера трека (цилиндра)
0039    83 C7 04                  ADD       DI, 4         ; Переход на следующее поле
003C    FE C8                     DEC       AL
003E    75 F6                     JNZ       ID_SETUP      ; Цикл по полям в буфере
0040    B8 0501                   MOV       AX, 501H      ; Форматирование
0043    CD 13                     INT       13H
0045    FE C5                     INC       CH            ; Переход на следующий трек
0047    80 FD 40                  CMP       CH, 40H       ; Все сформатировано?
004A    75 E4                     JNE       TRACK_LOOP    ; Цикл по трекам
004C    CB                        RET                     ; Возврат в ДОС
004D                     FORMAT   ENDP
004D                     CODE     ENDS
                         END      FORMAT

                                  Фиг. 9.5 Форматирование дискеты

Вы можете использовать команду форматирования в том случае, если хотите защитить дискету от копирования. Защита от копирования означает, что дискета шифруется таким образом, что ее становится трудно скопировать. Так как утилита DISKCOPY предполагает, что идентификаторы секторов записаны обычным образом, она не может копировать дискету с не стандартными номерами секторов. Записав на дискету идентификатор сектора, отличный от нормального, вы защитите ее от копирования.

В качестве примера давайте защитим дискету от копирования, записав не стандартный номер сектора на дорожку 10. Пример, приведенный выше, показывает обычные номера секторов. Если вместо них буфер данных будет содержать значения


DB 10, 0, 10, 2
DB 10, 0,  2, 2 
DB 10, 0, 10, 2
DB 10, 0,  2, 2 
 

дорожка 10 не будет иметь сектора 1. Вместо него на ней появится сектор 10, которого не бывает на нормальной дискете системы PC DOS. Программа DISKCOPY не может скопировать дорожку 10 правильно. Если теперь данная программа проверит (с помощью команды проверки) наличие сектора 10 на дорожке 10 дискеты, отсутствие ошибки будет означать, что дискета оригинальная, а не копия.

Этот способ защиты от копирования не совсем надежен. Каждый опытный пользователь (и даже некоторые программы копирования) могут обнаружить защиту такого типа и обойти ее. Но модификация идентификаторов секторов не может производиться произвольно. Для определения адреса установки головок BIOS использует номер дорожки из поле CHRN, так что номер цилиндра должен соответствовать номеру цилиндра, на котором находится сектор. Код в байте номера головки определяет установку электронного переключателя, выбирающего головку, поэтому это значение должно быть задано корректно. Длина поля берется из таблицы параметров, а не из регистров при вызове, так что ее изменить трудно. К тому же, это число использует и BIOS, и контроллер, определяя длину сектора, так что изменить его вы сможете только после тщательной подготовки. Свободно изменяемым остается только номер сектора. Перед тем, как вы начнете изменять номера секторов, запомните, что если при этом вы собираетесь еще использовать эту дискету в рамках DOS, система будет пытаться использовать сектор, который вы заменили сектором со своим нестандартным номером, если вы не модифицируете таблицу расположения файлов дискеты так, чтобы зарезервировать этот сектор. Если вам нужно считывать по нескольку секторов (что позволяет драйвер дисковода BIOS), номера у секторов должны быть последовательными, но не обязательно начинаться с первого.

В общем, команда форматирования дает некоторое средство защиты от копирования. Однако абсолютно надежный метод защиты еще не найден. Только хороший выбор техники шифрования поможет оставить честных людей честными.