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 !
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).
lit les arguments de la ligne de commande et règle en conséquence les variables globales
affiche l'avis de copyright et le numéro de version
laisse le choix à l'utilisateur du disque (si plus d'un)
remise à zéro du disque dur
lit le secteur 0,0,1 du disque choisi dans une partie de caractère non signé
extrait l'information nécessaire du secteur racine (voir plus loin - Le secteur racine)
imprime l'information
vérifie si tout est ok (voir plus loin - Le secteur racine)
laisse à l'utilisateur le choix de la partition
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)
imprime l'information
calcule le nombre d'unités d'allocation, le secteur de début des FATS, etc.
vérifie le secteur d'amorçage (voir plus bas, Le secteur d'amorçage)
vérifie que la FAT 1 est identique à la FAT 2 (voir plus bas - La FAT)
écrit les secteurs racine et d'amorçage sur une disquette (facultatif)
demande à l'utilisateur quel est le premier cylindre de la nouvelle partition
vérifie que la portion de partition choisie est vide (see below - The FAT)
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.
écrit la nouvelle table des partitions sur le tampon du secteur racine
vérifie que le nouveau secteur racine est ok
met le nouveau nombre de secteurs dans les informations du secteur d'amorçage
écrit les informations du nouveau secteur d'amorçage dans le tampon du secteur d'amorçage
vérifie que le nouveau secteur d'amorçage est ok
demande à l'utilisation la confirmation de procéder
écrit le secteur racine modifié sur le disque
écrit le secteur d'amorçage modifié sur le disque
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).
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
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)
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 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).
Arno Schaefer