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