begin

Disk_Error := False;

if (Disk<2) or (Disks=NIL) then

goto Get; {He искать в списке, если дискета или нет списка} {Ищем в списке описателей} р := Disks;

while (р".Disklnfo.NumberODisk) and (p^.NextDiskoNIb) do

p := p^.NextDisk; (Если не тот номер диска} if p'\.DiskInfo.Number=Disk then

begin (Найден нужный элемент - выход} Disklnfo := p^DiskInfo;

exit end;

(Формируем описатель диска с помощью вызова IOCTL} Get:

IO.Build.BPB := True; (Требуем построить ВРВ} GetIOCTLInfo(Disk,10); (Получаем информацию} If Disk_Error then exit;

with Disklnfo, 10 do {Формируем описатель, begin

Number a= Disk;

TypeD == TypeDrv;

AttrD - Attrib;

Cyls = Cylindrs;

Media - BPB.Media;

SectSize - BPB.SectSiz;

TrackSiz = Add.TrkSecs;

TotSecs ч BPB.TotSecs;

if TotSecs=0 then

begin (Диск большой емкости}

ReadWriteSector(Number,0,1,Boot,2); (Читаем загрузочный сектор} TotSecs :•" Boot.Add.LargSectors;

end;

Heads = Add.HeadCnt;

Tracks = (TotSecs+pred(TrackSiz)) div (TrackSiz*Heads);

ClusSize = BPB.ClustSiz;

FATLock - BPB.ResSecs;

FATCnt = BPB.PatCnt;

FATSize - BPB.FatSize;

RootLock = FATLock+FATCnt*FATSize;

RootSize » BPB.RootSiz;

DataLock = RootLock+(RootSize*SizeO?(Dir_Type)) div SectSize;

MaxClus = (TotSecs-DataLock) div ClusSize+2,-fAT16 - (MaxCius > 4086) and (TotSecs > 20790) end end; (GetDiskInfof /———————.———————/

Function GetDiskNumber(c: Char): Byte;

(Преобразует имя диска A...Z в номер О...26. Если указано недействительное имя, возвращает 255} var

DrvNumber: Byte;

begin

ifOpCase(c) in ['A'..'2'] then

DrvNumber :« ord(UpCase(c))-ord('A')

else

DrvNumber := ^55;

if DrvNumber > GetHaxDrv then