|
Этот параметр может принимать одно из следующих значений:
Значение Размер сектора в байтах
________ _______________________
0 128
1 256
2 512 (стандартный для ДОС)
3 1024
Листинг программы 7.1 демонстрирует (на Паскале), как
осуществляется доступ к таблице базы диска и как изменяются
ее параметры. То же самое можно сделать на БЕЙСИКе, хотя
здесь требуется побайтное извлечение адресных значений. Ниже
приведена программа на БЕЙСИКе, которая находит и
распечатывает таблицу базы диска.
100 REM Программа на БЕЙСИКе для поиска и распечатки
таблицы базы диска
110 REM
120 REM Сначала необходимо установить указатель вектора
прерываний
130 REM
140 DEF SEG=0 'начало памяти
150 OFFSET1=30*4 'смещение до вектора прерывания
160 REM
170 REM Далее нужно определить смещение адреса вектора
180 REM
190 OFFSET2=PEEK(OFFSET1)+256*PEEK(OFFSET1+1)
200 REM
210 REM Теперь нужно определить сегментную часть
адреса вектора
220 REM
230 DEFSEG=PEEK(OFFSET1+2)+256*PEEK(OFFSET1+3)
240 REM
250 REM Теперь можно начинать просмотр таблицы
260 REM
270 PRINT "Ниже следуют данные талицы базы диска в
шестнадцатиричном виде"
280 FOR I=0 TO 10
290 PRINT " ";
300 IF PEEK(OFFSET2+1)=16 THEN PRINT"0"; 'добавмть
ноль для четности
310 PRINT HEX$(PEEK(OFFSET2+1));
320 NEXT I
330 PRINT:PRINT
Если Вам нужны средства для защиты от копирования, мы
предоставляем их Вам в двух формах.
Программы 7.103 и 7.104, имеющиеся на дискете,
прилагаемой к этой книге, предоставляют процедуры на
ассемблере и на Паскале, которые позволят организовать защиту
записи и приспособить ее к Вашей схеме защиты. Кроме того, в
пакет входит готовая программа защиты, которую можно вызывать
как на БЕЙСИКе, так и на Паскале.
{ Листинг 7.1 -- процедуры на Паскале для доступа к пара-}
{ метрам "базы диска" }
{ Этот фрагмент программы демонстрирует возможность доступа }
{ к "базе диска" или таблице управления дискетами. Этот }
{ листинг разрабатывался для обеспечения наиболее легкой }
{ настройки на конкретные нужды пользователей перед его ис- }
{ пользованием. }
module Листинг 7.1;
type
disk_base_type = array [1..11] of byte;
{ Ниже кратко описаны все 11 байт таблицы : }
{ 1 : время шага; время вывода головки }
{ 2 : время ввода головки; режим ПДП }
{ 3 : время ожидания отключения двигателя }
{ 4 : длина сектора в байтах: 0=128,1=256,2=512,3=1024 }
{ 5 : конец дорожки (номер последнего сектора) }
{ 6 : длина межсекторного промежутка }
{ 7 : длина сегмента данных (когда не задана длина сектора) }
{ 8 : длина промежутка для форматирования }
{ 9 : байт заполнитель для форматирования }
{ 10: время установления головки }
{ 11: время запуска двигателя }
var
disk_base : disk_base_type;
disk_base_pointer : ads of disk_base_type; {сегментированный
адрес}
vector_pointrer : ads of adsmem; {сегментированный адрес}
procedure disk_base_access;
begin
{сначала указатель устанавливается на вектор прерывания базы}
{ диска}
vector_pointer.s := 0; {раздел сегмента 0, начало памяти}
vector_pointer.r := 30 * 4; {смещение для вектора 30}
{далее считывается вектор, чтобы установить местоположение}
{ таблицы}
disk_base_pointer := vector_pointer ^;
{указатель базы диска ("disk_base_pointer") теперь содержит }
{сегментированный адрес, на который указывал указатель век- }
{тора ("vector_pointer") -- это означает, что указатель базы}
{диска теперь укаазывает на адрес фактического местонахожде-}
{ния таблицы }
{Теперь будет выполняться проверка того. находится ли таблица}
{в оперативной памяти. Это можно установить попытавшись из- }
{менить значение в таблице и затем проверив, изменилось ли }
{оно на самом деле. Вместо этого мы просто проверим, в каких }
{адресах памяти располагается таблица.
|