Informations techniques sur FIPS

Version F19991221

FIPS a été écrit en C++ V2.0 avec les compilateurs Turbo C++ 1.0 et Borland C++ 3.1

Il peut être compilé avec tout compilateur C++ récent (peut-être après de petites modifications dans les appels au BIOS).

Si vous êtes un expert C++, ne regardez pas de trop près le code, c'est mon premier programme en C++ et il est loin d'être acceptable (trop de données publiques, certains initialisateurs et opérateurs d'assignements sont absents, etc.). Les critiques constructives sont les bienvenues !

Comment FIPS fonctionne :

FIPS utilise les interruptions BIOS 13h 00h (ràz des disques), 13h 02h (lecture du secteur), 13h 08h (obtention des paramètres du lecteur), 13h 03h (écriture du secteur) et 13h 04h (vérification du secteur).

Voici la séquence des fonctions appelées en principal :

evaluate_argument_vector

lit les arguments de la ligne de commande et règle en conséquence les variables globales

notice

affiche l'avis de copyright et le numéro de version

ask_for_drive_number

laisse le choix à l'utilisateur du disque (si plus d'un)

harddrive.reset

remise à zéro du disque dur

harddrive.rootsector->read

lit le secteur 0,0,1 du disque choisi dans une partie de caractère non signé

hd.partition_table().get

extrait l'information nécessaire du secteur racine (voir plus loin - Le secteur racine)

hd.print_partition_table

imprime l'information

hd.check

vérifie si tout est ok (voir plus loin - Le secteur racine)

ask_for_partition_number

laisse à l'utilisateur le choix de la partition

partition->bootsector->read

lit le premier secteur de la partition choisie vers une autre partie

partition->bpb().get

extrait l'information du secteur d'amorçage (voir plus loin - Le secteur d'amorçage)

partition->print_bpb

imprime l'information

partition->info().get

calcule le nombre d'unités d'allocation, le secteur de début des FATS, etc.

partition->check

vérifie le secteur d'amorçage (voir plus bas, Le secteur d'amorçage)

fat1.check_against(fat2)

vérifie que la FAT 1 est identique à la FAT 2 (voir plus bas - La FAT)

save_root_and_boot

écrit les secteurs racine et d'amorçage sur une disquette (facultatif)

ask_for_new_start_cylinder

demande à l'utilisateur quel est le premier cylindre de la nouvelle partition

fat2.check_empty

vérifie que la portion de partition choisie est vide (see below - The FAT)

hd.calculate_new_root

Calcule la nouvelle table des partitions à partir du cylindre de départ choisi. Notez que les entrées de partition seront déplacées vers le début de la nouvelle table des partitions, ainsi la nouvelle partition sera la dernière et les noms de lecteur ne changeront pas.

hd.partition_table.put

écrit la nouvelle table des partitions sur le tampon du secteur racine

hd.partition_table.get,hd.print_partition_table,hd.check

vérifie que le nouveau secteur racine est ok

partition->calculate_new_boot

met le nouveau nombre de secteurs dans les informations du secteur d'amorçage

partition->bpb()->put

écrit les informations du nouveau secteur d'amorçage dans le tampon du secteur d'amorçage

partition->bpb()->get,partition->print_bpb,partition->check

vérifie que le nouveau secteur d'amorçage est ok

ask_for_write_permission

demande à l'utilisation la confirmation de procéder

harddrive.rootsector->write

écrit le secteur racine modifié sur le disque

partition->bootsector->write

écrit le secteur d'amorçage modifié sur le disque

 

Le secteur racine

Le secteur racine est le premier secteur de chaque disque dur. Il contient le programme qui charge le secteur d'amorçage de la partition amorçable et la table des partitions. Les deux derniers octets du secteur racine doivent être 55 aa (hex).

La table des partitions commence à 1be. Elle contient 4 * 16 octets pour les quatre partitions possibles.

Tous les nombres sont basés à zéro sauf le nombre de début et fin de secteur (qui doit être 1-63).

Une entrée de partition contient ce qui suit :

1 octet - Indicateur d'amorçage. Doit être 0 (non amorçable) ou 80h (amorçable). Une seule partition peut être amorçable à la fois (j'ai lu quelque part que l'indicateur d'amorçage peut aussi être à 81h pour le second lecteur - quelqu'un serait-il au courant ?)

 1 octet - Tête de début. Le numéro de la tête du premier secteur de la partition. 

2 octets - Secteur et cylindre de début. Les bits sont les suivants :

CCSSSSSS CCCCCCCC

où le premier octet contient le numéro de secteur (1 - 63) et les deux bits forts du numéro de cylindre. Le second octet contient les huit bits faibles du numéro de cylindre.

1 octet - Indicateur du système. Pour DOS , il doit être :

1 - FAT 12 bits, numéro de secteur sur 16 bits
4 - FAT 16 bits, numéro de secteur sur 16 bits
5 - Partition étendue
6 - FAT 16 bits, numéro de secteur sur 32 bits

1 octet - Tête de fin. Numéro de la tête du dernier secteur de la partition

2 octets - Secteur et cylindre de fin. Même format que le secteur et cylindre de début

4 octets - Premier secteur. Numéro du prmeier secteur de la partition. Cela correspond à la tête, au secteur + cylindre de début. L'octet de poids fort est en premier.

4 octets - Nombre de total de secteurs

La fonction check_rootsector_validity vérifie :

Le secteur d'amorçage

Le secteur d'amorçage est le prmeier secteur de toute partition. Il contient le programme qui lance le système d'exploitation et le bloc de paramètres du BIOS. Les deux derniers octets doivent aussi contenir 55 aa. Les informations du secteur d'amorçage sont les suivantes :

00 3 octets - Instruction de saut ('eb xx 90' ou 'e9 xx xx')
03 8 octets - Nom et version OEM - p.e. MSDOS5.0
0b 2 octets - Octets par secteur - doit être 512
0d 1 octet - Secteurs par unité d'allocation - puissance de deux
0e 2 octets - Secteurs réservés - 1 usuellement (secteur d'amorçage)
10 1 octet - Nombre de FATs - doit être 2
11 2 octets - Nombre d'entrées du répertoire racine - usuellement 512
13 2 octets - Nombre (court) de secteurs - 0, en cas de partition BIGDOS
15 1 octet - Descripteur de support - usuellement f8h
16 2 octets - Secteurs par FAT - selon
18 2 octets - Secteurs par piste
1a 2 octets - Nombre de têtes
1c 2 octets - Nombre de secteurs cachés (bas)

BPB étendu depuis le DOS 4.0 -

1e 2 octets - Nombre de secteurs cachés (haut)
20 4 octets - Nombre de secteurs (long)
24 1 octet - Numéro de lecteur physique - 80h ou 81h
25 1 octet - Réservé
26 1 octet - Signature - 29h

 La fonction check_bootsector_validity vérifie que :

La FAT

La FAT (File Allocation Table, table d'allocation des fichiers) contient les informations sur la façon dont les unités d'allocation du disque sont liées aux fichiers. Chaque entrée de répertoire contient un pointeur dirigé sur la première unité d'allocation du fichier. L'entrée de l'unité d'allocation correspondante dans la FAT contient un pointeur dirigé sur l'unité d'allocation suivante, ou un marqueur de fin de fichier (EOF marker - FFFF pour une FAT 16 bits ou FFF pour une FAT 12 bits) si l'unité d'allocation est la dernière du fichier.

Les unités d'allocation défectueuses sont marquées FFF7 ou FF7. Les unités d'allocation vides sont désignées avec 0.

La première unité d'allocation du disque est l'unité d'allocation numéro 2, elle commence sur le premier secteur, après le répertoire racine. Les entrées de la FAT pour les unités d'allocation 0 et 1 contiennent l'octet descripteur de support (normalement F8h pour un disque dur) et deux ou trois octets FFh.

Sur une partition DOS normale, il existe deux copies de la FAT, et ces deux copies doivent être identiques. La FAT 2 est la FAT primaire.

La fonction check_fat_validity vérifie si les deux FATs sont identiques et si les entrées 0 et 1 contiennent ce qu'elles sont supposées contenir.

La fonction check_fat_empty vérifie si les entrées de l'unité d'allocation qui couvrent la nouvelle partition contiennent soit 0 (vide) soit FFF7 (unité d'allocation défectueuse).


J'espère que ces informations vous auront été utiles. SI vous trouvez quelque aberration ou si vous avez des ajouts ou commentaires à faire, merci de m'en informer.

 

Arno Schaefer

arno_schaefer@gmx.de

Retour au sommaire


Traduction © 1999 César Alexanian