Type
{Structure
de lecture pour la disquette}
SecPosType=Record
Head:Byte;
SectTrack:Word;
End;
{Structure
de partition}
PartEntryType=Record
Status:Byte;
StartSec:SecPosType;
PartType:Byte;
EndSec:SecPosType;
SecOfs,NumSec:LongInt;
End;
HPFSSuperBlockRec=Record
ResA:Array[0..$B]of
Byte;
RootDirFNode:LongInt;
{ Secteur où se trouve le répertoire
racine }
TotalSector:LongInt;
{ Nombre total de secteurs dans la partition
}
ResB:LongInt;
BitmapTable:LongInt;
ResC:Array[$1C..511]of
Byte;
End;
{Description
-----------
Cette fonction copie un secteur de partition
du disque dur dans un tampon.
Entrée
-------
Lecteur
Code BIOS du lecteur (80h, 81h,...)
Tete
Numéro de la tête de lecture/écriture
SecCyl
Numéro de secteur et de cylindre au format BIOS
Tamp
Tampon dans lequel le secteur est chargé
}
Function ReadPartSec(Lecteur,Tete:Byte;SecCyl:Word;Var
Tamp):Boolean;Assembler;ASM
MOV AX,0201h
MOV DL,Lecteur
MOV DH,Tete
MOV CX,SecCyl
LES BX,Tamp
INT 13h
CMC
MOV AL,0
ADC AL,AL
END;
{ Cette fonction change l'unit‚ de disque courant
pour l'utilisation par le système d'exploitation. }
Procedure SetDsk(Disk:Byte);Assembler;ASM
MOV AH,0Eh
MOV DL,Disk
INT 21h
END;
{ Cette fonction
permet de confirmer la présence ou non d'unité
de disque logique du système d'exploitation et non pas si
une disquette en dans une unité mais bien l'affectation d'une
unité pour une périphérique particulière.}
Function DskExist(Dsk:Byte):Boolean;Var
Old,M:Byte;Begin
DskExist:=False;
If Dsk>25Then
Exit;
Old:=GetDsk;
SetDsk(Dsk);
If(Dsk=GetDsk)Then
DskExist:=True;
SetDsk(Old);
End;
{ Fonction cherchant la première unité
utilisée}
Function FindFirstDskUnused:Byte;Var
I:Byte;Begin
FindFirstDskUnused:=$FF;
For I:=0to
25do
If Not DskExist(I)Then
Begin
FindFirstDskUnused:=I;
Break;
End;
End;
Procedure DetectHPFS;
Var
PartPrimary:PartSecType;
PartLogical:PartSecType;
BootRec:Array[0..511]of
Byte;
HPFSBoot:HPFSBootRec
Absolute BootRec;
HPFSSuperBlock:HPFSSuperBlockRec;
J,I,K:Byte;
Dsk:Byte;
Procedure ReadBoot(Head:Byte;SectTrack:Word);
Var Root:Array[0..511]of
Char;
Begin
ReadPartSec(K,Head,SectTrack,BootRec);
If HPFSBoot.Sign='HPFS'Then
Begin
Dsk:=FindFirstDskUnused;
DriveFormat[Dsk]:=dfiHPFS;
DrivPhysUnit[Dsk]:=K;
DrivePartUnit[Dsk]:=I
or
4+(J
shl 3);
WriteLn('HPFS
Trouvé attribu‚ à l'unité ',Char(Dsk+64),':');
ReadPartSec(K,Head,SectTrack+16,HPFSSuperBlock);
WriteLn('Taille
de l''unité ',Char(Dsk+64),':
',HPFSSuperBlock.TotalSector*512,'
octets');
End;
End;
Begin
For K:=$80to
$80+NmHardDsk
do Begin
ReadPartSec(K,0,1,PartPrimary);
For I:=1to
4do
Begin
If PartPrimary.PartTable[I].PartType=5Then
Begin
ReadPartSec(K,PartPrimary.PartTable[I].StartSec.Head,PartPrimary.PartTable[I].StartSec.SectTrack,PartLogical);
For J:=1to
4do Begin
If(PartLogical.PartTable[J].PartType)in[7,$17]Then
Begin
ReadBoot(PartLogical.PartTable[J].StartSec.Head,PartLogical.PartTable[J].StartSec.SectTrack);
End;
End;
End
Else
If(PartPrimary.PartTable[J].PartType)in[7,$17]Then
Begin
ReadBoot(PartPrimary.PartTable[J].StartSec.Head,PartPrimary.PartTable[J].StartSec.SectTrack);
End;
End;
End;
End;
BEGIN
DetectHPFS;
END. |