cx:=CSec; {Цилиндр/сектор}
al:=1; {Читаем один сектор}
es:=seg(Buf);
bx:=ofs(Buf);
Intr($13,Reg);
Output
end
end; {SetAbsSector}
{------------------}
procedure SetDefaultDrv(Disk:Byte);
{Устанавливает диск по умолчанию}
begin
if Disk<=GetMaxDrv then with Reg do
AH:=$E;
DL:=Disk;
MSDOS(Reg)
end;
{---------------------}
procedure SetFATItem(Disk:Byte;Cluster,Item:Word);
{Устанавливаем содержимое ITEM в элемент CLUSTER таблицы FAT}
var
DI:TDisk;
k,j,n:Integer;
Fat:record
case Byte of
0:(w: array[0..255] of Word);
1:(b: array[0..512*3-1] of Byte);
GetDiskInfo(Disk,DI);
if not Disk_Error then with DI do
if (Cluster<=MaxClus) and (Cluster>=2) then
if FAT16 then
k:=Cluster div 256; {Нужный сектор FAT}
j:=Cluster mod 256; {Смещение в секторе}
n:=1
else
k:=Cluster div 1024; {Нужная тройка секторов FAT}
j:=(3*Cluster) shr 1-k*1536;
n:=3
ReadSector(Disk,FatLock+k*n,n,Fat);
if not Disk_Error then
Fat.w[j]:=Item
if odd(Cluster) then
Item:=Item shl 4+Fat.b[j] and $F
Item:=Item+(Fat.b[j+1] and $F0) shl 12;
Fat.b[j]:=Lo(Item);
Fat.b[j+1]:=Hi(Item)
if not FAT16 then
begin {Проверяем "хвост" FAT}
k:=k*n; {к - смещение сектора}
while k+n>FatSize do dec(n)
inc(FATLock,k); {FATLock - номер сектора в FAT}
{Записываем изменение в FatCnt копий FAT}
for k:=0 to pred(FatCnt) do
WriteSector(Disk,FATLock+k*FatSize,n,Fat)
end; {SetFATItem}
{----------------------}
procedure SetMasterBoot(var Buf);
{Записываем в главный загрузочный сектор содержимое Buf}
with Reg do
ah:=3; {Операция записи}
al:=1; {Кол-во секторов}
dl:=$80; {1-й жесткий диск}
dh:=0; {Головка 0}
cx:=1; {1-й сектор 0-й дорожки}
Disk_Error:=(Flags and FCarry<>0);
if Disk_Error then
Disk_Status:=ah
Disk_Status:=0
end; {SetMasterBoot}
procedure UnpackCylSec(CSec:Word;var Cyl,Sec:Word);
{Декодируем цилиндр и сектор для прерывания $13}
Cyl:=(CSec and 192) shl 2+CSec shr 8;
Sec:=CSec and 63
end; {RecodeCylSec}
procedure WriteSector(Disk:Byte;Sec:LongInt;NSec:Word;var Buf);
{Записывает сектор (секторы) на указанный диск}
if DI.TotSecs>$FFFF then
ReadWriteSector(Disk,Sec,Nsec,Buf,3)
ReadWriteSector(Disk,Sec,Nsec,Buf,1);
end; {ReadSector}
{=============} end. {Unit F_Disk} {==============}
2 ТЕКСТ МОДУЛЯ F_PROT
{==================} Unit F_Prot; {=======================}
нелегального копирования. Мобильный вариант
INTERFACE
procedure ProtCheck(var P1,P2; var Res: Integer);
{Проверяет легальность копии:
Р1 - адрес процедуры NORMA; Р2 - адрес процедуры ALARM;
Res - результат работы:
0: был вызов NORMA;
1: был вызов ALARM;
2: не вставлена дискета.
Любое другое значение может быть только при трассировке программы}
function SetOnHD: Integer;
{Устанавливает копию на жесткий диск. Возвращает:
-1 - не вставлена дискета;
-2 - не мастер-дискета;
-3 - защита от записи или ошибка записи;
-4 - программа не скопирована на ЖД;
-5 - ошибка доступа к ЖД;
-6 - исчерпан лимит установок;
-7 - программа уже установлена;
>=0 - количество оставшихся установок}
function RemoveFromHD: Integer;
{Удаляет копию с жесткого диска. Возвращает:
-3 - защита от записи или ошибка записи ГД;
IMPLEMENTATION
Uses DOS, F_Disk;
type
TDate=array[1..4] of Word;
TKey=record case Byte of
0:(
Hard: Word; {Ключ для шифровки данных}
Dat: TDate); {Дата создания ПЗУ}
1:(KeyW: array[1..5] of Word);
const
TRK=80; {Номер дорожки}
HED=0; {Номер головки}
SEC=1; {Номер сектора}
SIZ=1; {Код размера секторов}
ETracks=80; {Эталонное количество дорожек на дискете}
ETrackSiz=18; {Эталонное количество секторов на дорожке}
Key:TKey=(KeyW:(0,0,0,0,0)); {Ключ стационарной программы}
{----------------}
TBuf=array[1..256] of Byte;
P:Pointer; {Ссылка на прежнюю ТПД}
Bif:TBuf; {Буфер чтения/записи сектора}
R:registers; {Регистры}
function DiskettPrepare(var DSK: Byte):Boolean;
DBT_Type=record {Структура таблицы параметров дискеты}
Reserv1:array[0..2] of Byte;
SizeCode:Byte; {Код размера сектора}
LastSect:Byte; {Количество секторов на дорожке}
Reserv2:array[5..10] of Byte
Info: TDisk;
DBT,OldDBT:^DBT_Type;
{проверяем наличие дискеты}
DSK:=0; {начинаем с диска А:}
repeat
GetDiskInfo(DSK,Info);
if DSK=0 then
DSK:=1 {Повторяем для диска В:}
DSK:=2 {Закончить с ошибкой}
until not Disk_Error or (DSK=2);
begin {Нет доступа ни к А:, ни к В:}
DiskettPrepare:=False;
Exit
{проверяем тип дискеты}
with Info do
if(Tracks<>ETracks) or
(TrackSiz<>ETrackSiz) then
begin {Не эталонный тип}
DSK:=3;
{Переустанавливаем ТПД}
GetIntVec($1E,P);
OldDBT:=P;
New(DBT);
DBT^:=OldDBT^;
with DBT^ do
SizeCode:=SIZ;
LastSect:=ETrackSiz
SetIntVec($1E,DBT)
DiskettPrepare:=True
end; {DiskettPrepare}
function LegalDiskett(var DSK:Byte):Boolean;
{Проверяет легальность мобильной копии}
k,n:Word;
{Подготавливаем дискету}
if DiskettPrepare(DSK) then
{читаем ключевой сектор}
for k:=1 to 256 do
bif[k]:=0;
With R do
ah:=0;
dl:=DSK;
Intr($13,R);
ah:=2;
al:=1;
ch:=TRK;
cl:=SEC;
dh:=HED;
es:=seg(Bif);
bx:=ofs(Bif);
SetIntVec($1E,P);
if (Flags and FCarry)<>0 then
LegalDiskett:=False;
DSK:=4;
begin {проверяем содержимое сектора}
for k:=2 to 256 do
Bif[k]:=Bif[k] xor Bif[1];
N:=0;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9