Sommaire
Introduction
Les partitions sont tous simplement une méthode de partage d'information à travers divers système d'exploitation sans que ceux-ci doivent s'adapter au méthode d'entreposage des concurrents. Par exemple la HPFS est utilisée par IBM pour promouvoir son système d'exploitation OS/2, la NTFS de Microsoft est utilisée pour ventée les mérites de leur système Windows NT et 2000, la FAT32 pour Windows 9X, Linux Ext2 est utilisée pour le système d'exploitation gratuit Linux. Toutes ces formats d'entreposage peuvent figurer sur le même disque dur cependant pas au même endroit comme on sans doute... Ils également l'utilitée d'offrir une partition fonctionnant mieux avec certain système d'exploitation qu'avec d'autres : La FAT 12 et 16 sont très efficace sous un DR-DOS.
Partition HPFS d'OS/2
La partition HPFS est un système d'organisation de fichier à très haute performance (Nous l'avons nous-même exploiter sur un 80386 avec un 1 Go de disque dur et peu importe le nombre de fichiers, il démontra toujours des performances exceptionnels largement supérieur au FAT 12 et 16. En plus celui-ci offre la possibilité de stocké des fichiers ayant une longueur supérieur des noms et extensions d'une longueur respective de 8 et 3 caractères contrairement au FAT 12 et 16.
Voici donc un petit programme démonstrateur en Turbo Pascal 7 plutôt mal construit, cependant il permettra à certain de mieux comprendre comment on trouve des partitions HPFS d'OS/2 et d'éventuellement en monter sur un système DOS.
- Program Partition;
-
- Const
- dfiAmovible=0; { Unité amovible }
- dfiFixed=1; { Disque dur }
- dfiNotExist=$80; { Unité absente }
- dfiExist=$81; { Unité existe }
- dfiMount=$E0; { Unité monter }
- dfiHPFS=$E8; { Partition HPFS }
- dfiFAT32=$E9; { Partition FAT32 }
- dfiUnknown=$FF; { Etat inconnu }
-
- DriveFormat:Array[0..25]of Byte=(
- dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
- dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
- dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
- dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
- dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
- dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
- dfiUnknown,dfiUnknown
- );
-
- DrivPhysUnit:Array[0..25]of Byte=(
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF
- );
-
- DrivePartUnit:Array[0..25]of Byte=(
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF
- );
-
- 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;
-
- PartSecType=Record { décrit le secteur de partition }
- BootCode:Array[0..$1BD]of Byte; { Code de démarrage du disque dur }
- PartTable:Array[0..3]of PartEntryType; { Table des partitions de disque dur }
- IdCode:Word; { Signature: AA55h }
- End;
-
- {Secteur de démarrage d'une partition HPFS }
- HPFSBootRec=Record
- ResA:Array[0..$35]of Byte; { Signification inconnue??? }
- Sign:Array[0..3]of Char; { Signature = 'HPFS' }
- ResB:Array[$3A..$1FF]of Byte; { Signification inconnue??? }
- 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;
-
- Var
- NmHardDsk:Byte Absolute $0000:$0475; { Nombre de disque dur }
-
- {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;
-
- Function GetDsk:Byte;Assembler;ASM
- MOV AH,19h
- INT 21h
- 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.
Code source
Voici des exemples du code source d'utilitaires reliés sur GitHub :
Lien | Langage de programmation | Projet | Description |
---|---|---|---|
https://github.com/gladir/corail/blob/master/FDISK.PAS | Free Pascal, Turbo Pascal | Corail | Gestionnaire de partitions |
https://github.com/gladir/corail/blob/master/DISKEDIT.PAS | Free Pascal, Turbo Pascal | Corail | Éditeur de disque dur |
Voir également
Unité de disque - Référence des partitions
Dictionnaire Informatique - Lettre T - Type de partition.