Section courante

A propos

Section administrative du site

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.

  1. Program Partition;
  2.  
  3. Const
  4.  dfiAmovible=0;      { Unité amovible }
  5.  dfiFixed=1;         { Disque dur }
  6.  dfiNotExist=$80;    { Unité absente }
  7.  dfiExist=$81;       { Unité existe }
  8.  dfiMount=$E0;       { Unité monter }
  9.  dfiHPFS=$E8;        { Partition HPFS }
  10.  dfiFAT32=$E9;       { Partition FAT32 }
  11.  dfiUnknown=$FF;     { Etat inconnu }
  12.  
  13.  DriveFormat:Array[0..25]of Byte=(
  14.   dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
  15.   dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
  16.   dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
  17.   dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
  18.   dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
  19.   dfiUnknown,dfiUnknown,dfiUnknown,dfiUnknown,
  20.   dfiUnknown,dfiUnknown
  21.  );
  22.  
  23.  DrivPhysUnit:Array[0..25]of Byte=(
  24.   $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
  25.   $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
  26.   $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
  27.   $FF,$FF
  28.  );
  29.  
  30.  DrivePartUnit:Array[0..25]of Byte=(
  31.   $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
  32.   $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
  33.   $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
  34.   $FF,$FF
  35.  );
  36.  
  37. Type
  38.  {Structure de lecture pour la disquette}
  39.  SecPosType=Record
  40.   Head:Byte;
  41.   SectTrack:Word;
  42.  End;
  43.  
  44.  {Structure de partition}
  45.  PartEntryType=Record
  46.   Status:Byte;
  47.   StartSec:SecPosType;
  48.   PartType:Byte;
  49.   EndSec:SecPosType;
  50.   SecOfs,NumSec:LongInt;
  51.  End;
  52.  
  53.  PartSecType=Record { décrit le secteur de partition }
  54.   BootCode:Array[0..$1BD]of Byte;    { Code de démarrage du disque dur }
  55.   PartTable:Array[0..3]of PartEntryType; { Table des partitions de disque dur }
  56.   IdCode:Word;                       { Signature: AA55h }
  57.  End;
  58.  
  59.  {Secteur de démarrage d'une partition HPFS }
  60.  HPFSBootRec=Record
  61.   ResA:Array[0..$35]of Byte;     { Signification inconnue??? }
  62.   Sign:Array[0..3]of Char;       { Signature = 'HPFS' }
  63.   ResB:Array[$3A..$1FF]of Byte;  { Signification inconnue??? }
  64.  End;
  65.  
  66.  HPFSSuperBlockRec=Record
  67.   ResA:Array[0..$B]of Byte;
  68.   RootDirFNode:LongInt;   { Secteur où se trouve le répertoire racine }
  69.   TotalSector:LongInt;         { Nombre total de secteurs dans la partition }
  70.   ResB:LongInt;
  71.   BitmapTable:LongInt;
  72.   ResC:Array[$1C..511]of Byte;
  73.  End;
  74.  
  75. Var
  76.  NmHardDsk:Byte Absolute $0000:$0475; { Nombre de disque dur }
  77.  
  78. {Description
  79. -----------
  80. Cette fonction copie un secteur de partition du disque dur dans un tampon.
  81. Entrée
  82. -------
  83. Lecteur Code BIOS du lecteur (80h, 81h,...)
  84. Tete Numéro de la tête de lecture/écriture
  85. SecCyl Num,ro de secteur et de cylindre au format BIOS
  86. Tamp Tampon dans lequel le secteur est chargé
  87. }
  88.  
  89. Function ReadPartSec(Lecteur,Tete:Byte;SecCyl:Word;Var Tamp):Boolean;Assembler;ASM
  90.  MOV AX,0201h
  91.  MOV DL,Lecteur
  92.  MOV DH,Tete
  93.  MOV CX,SecCyl
  94.  LES BX,Tamp
  95.  INT 13h
  96.  CMC
  97.  MOV AL,0
  98.  ADC AL,AL
  99. END;
  100.  
  101. Function GetDsk:Byte;Assembler;ASM
  102.  MOV AH,19h
  103.  INT 21h
  104. END;
  105.  
  106. { Cette fonction change l'unité de disque courant pour l'utilisation
  107. par le système d'exploitation. }
  108. Procedure SetDsk(Disk:Byte);Assembler;ASM
  109.  MOV AH,0Eh
  110.  MOV DL,Disk
  111.  INT 21h
  112. END;
  113.  
  114.  { Cette fonction permet de confirmer la pr,sence ou non d'unité
  115. de disque logique du système d'exploitation et non pas si une
  116. disquette en dans une unit, mais bien l'affectation d'une unité
  117. pour une périphérique particulière.}
  118.  
  119. Function DskExist(Dsk:Byte):Boolean;Var Old,M:Byte;Begin
  120.  DskExist:=False;
  121.  If Dsk>25Then Exit;
  122.  Old:=GetDsk;
  123.  SetDsk(Dsk);
  124.  If(Dsk=GetDsk)Then  DskExist:=True;
  125.  SetDsk(Old);
  126. End;
  127.  
  128. { Fonction cherchant la première unité utilisée}
  129. Function FindFirstDskUnused:Byte;Var I:Byte;Begin
  130.  FindFirstDskUnused:=$FF;
  131.  For I:=0to 25do If Not DskExist(I)Then Begin
  132.   FindFirstDskUnused:=I;
  133.   Break;
  134.  End;
  135. End;
  136.  
  137. Procedure DetectHPFS;
  138. Var
  139.  PartPrimary:PartSecType;
  140.  PartLogical:PartSecType;
  141.  BootRec:Array[0..511]of Byte;
  142.  HPFSBoot:HPFSBootRec Absolute BootRec;
  143.  HPFSSuperBlock:HPFSSuperBlockRec;
  144.  J,I,K:Byte;
  145.  Dsk:Byte;
  146.  
  147.  Procedure ReadBoot(Head:Byte;SectTrack:Word);
  148.  Var Root:Array[0..511]of Char;
  149.  Begin
  150.   ReadPartSec(K,Head,SectTrack,BootRec);
  151.   If HPFSBoot.Sign='HPFS'Then Begin
  152.    Dsk:=FindFirstDskUnused;
  153.    DriveFormat[Dsk]:=dfiHPFS;
  154.    DrivPhysUnit[Dsk]:=K;
  155.    DrivePartUnit[Dsk]:=I or 4+(J shl 3);
  156.    WriteLn('HPFS Trouvé attribué à l''unité ',Char(Dsk+64),':');
  157.    ReadPartSec(K,Head,SectTrack+16,HPFSSuperBlock);
  158.    WriteLn('Taille de l''unité ',Char(Dsk+64),': ',HPFSSuperBlock.TotalSector*512,' octets');
  159.   End;
  160.  End;
  161.  
  162. Begin
  163.  For K:=$80to $80+NmHardDsk do Begin
  164.   ReadPartSec(K,0,1,PartPrimary);
  165.   For I:=1to 4do Begin
  166.    If PartPrimary.PartTable[I].PartType=5Then Begin
  167.     ReadPartSec(K,PartPrimary.PartTable[I].StartSec.Head,PartPrimary.PartTable[I].StartSec.SectTrack,PartLogical);
  168.     For J:=1to 4do Begin
  169.      If(PartLogical.PartTable[J].PartType)in[7,$17]Then Begin
  170.       ReadBoot(PartLogical.PartTable[J].StartSec.Head,PartLogical.PartTable[J].StartSec.SectTrack);
  171.      End;
  172.     End;
  173.    End
  174.     Else
  175.    If(PartPrimary.PartTable[J].PartType)in[7,$17]Then Begin
  176.     ReadBoot(PartPrimary.PartTable[J].StartSec.Head,PartPrimary.PartTable[J].StartSec.SectTrack);
  177.    End;
  178.   End;
  179.  End;
  180. End;
  181.  
  182. BEGIN
  183.  DetectHPFS;
  184. 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.

Dernière mise à jour : Dimanche, le 1 mai 2016