Chapitre – 16
DÉVELOPPER PLUS D'UTILITAIRES DE DISQUE
Introduction
Dans ce chapitre, nous verrons comment utiliser les informations MBR, DBR, FAT et le répertoire racine pour développer des utilitaires qui peuvent nous aider à gérer les données, à optimiser le stockage ou à résoudre de nombreux problèmes de dépannage de disque.
Généralement, ces programmes constituent une solution à un problème spécifique. Certains utilitaires et leur programmation ont été abordés dans ce chapitre.
Masquer des sections
En règle générale, l'utilitaire de masquage de partition est utilisé par les utilisateurs qui travaillent sur le même système informatique que celui qu'ils utilisent. S'il y a plusieurs utilisateurs sur un ordinateur, il y a une forte probabilité que les données d'un autre utilisateur puissent être lues, volées ou supprimées.
Dans un tel cas, si l'utilisateur possède des données importantes ou des informations confidentielles sur le même ordinateur, il peut souhaiter masquer la partition où se trouvent ses données afin que la partition ne soit pas accessible par le système d'exploitation et donc ne puisse pas être consultée par un autre utilisateur.
Lorsque l'utilisateur souhaite travailler sur le système, il peut accéder à la section en ouvrant simplement la section. Généralement, de tels événements se produisent dans les établissements professionnels où les ordinateurs sont utilisés par de nombreux étudiants, mais les étudiants seniors sont toujours préoccupés par leurs données importantes ou leurs travaux de projet. Comme dans le cas d’un manque de connaissances, un nouvel étudiant peut endommager ou même supprimer ses données.
Comment une section devient-elle masquée ?
Le tableau suivant montre le format de partition dans la table de partition MBR :
Compenser |
Signification |
Taille |
Description |
00H |
Octet indicateur de type de démarrage |
1 octet |
Si l'octet est 00H, la partition est inactive, et si l'octet est 80H , la partition est active (ou amorçable). |
01H |
Numéro de section de départ |
1 octet |
Numéro de partition de départ en hexadécimal |
02H |
Numéro de secteur et de cylindre du début de la partition |
2 octets |
Les 6 bits du premier octet constituent le numéro de secteur de départ, et la combinaison des 2 bits restants (comme les deux bits les plus significatifs) et des 8 bits de l'autre octet (les 8 bits les moins significatifs restants du nombre de 10 bits) constituent le numéro de cylindre de départ de la partition. |
04H |
Octet indicateur du système de fichiers |
1 octet |
Octet indicateur du système de fichiers en hexadécimal (pour une liste complète des octets indicateurs de partition, voir le chapitre « Approche logique des disques et des systèmes d'exploitation » abordé plus haut dans ce livre) |
05H |
Numéro de titre de fin de section |
1 octet |
Numéro de partition de fin en hexadécimal |
06H |
Numéro de secteur et de cylindre à la fin de la section |
2 octets |
Les 6 bits du premier octet constituent le numéro de secteur final, et la combinaison des 2 bits restants (comme les deux bits les plus significatifs) et des 8 bits de l'autre octet (les 8 bits les moins significatifs restants du nombre de 10 bits) constituent le numéro de cylindre final de la partition. |
08H |
Numéro absolu du secteur du début de la partition |
4 octets |
Nombre de secteurs entre le MBR et le premier secteur de la partition |
0H |
Numéro absolu du secteur de la fin de la partition |
4 octets |
Nombre de secteurs dans la section |
|
|
Total = 16 octets |
|
Au décalage 04H, dans chaque entrée de partition, il y a un octet indicateur de système de fichiers. Cet octet indicateur représente le type de système de fichiers de cette partition. Si la valeur de cet octet change, l'identification de la section change.
Par exemple, la valeur d'octet de l'indicateur de partition pour « DOS 12 bits FAT » est 0x01. Si cette valeur est modifiée à 0x11, l'identifiant du système de fichiers dans l'entrée de la table de partition devient « FAT 12 bits DOS caché » (pour une liste complète des octets de l'indicateur de partition, voir le chapitre « Approche logique des disques et des systèmes d'exploitation » abordé plus haut dans ce livre).
Le tableau ci-dessous montre quelques exemples supplémentaires d’octets indicateurs de système de fichiers pour certains types de partition :
Octet indicateur de type de partition |
Description du système de fichiers de partition |
0x01 |
DOS 12 bits FAT |
0x11 |
FAT DOS 12 bits caché |
0x04 |
DOS 16 bits FAT (<= 32 Mo) |
0x14 |
FAT DOS 16 bits caché (<= 32 Mo) |
0x05 |
DOS étendu |
0x15 |
DOS étendu caché |
0x06 |
DOS 16 bits grand (> 32 Mo) |
0x16 |
DOS 16 bits caché de grande taille (> 32 Mo) |
0x07 |
NTFS |
0x17 |
NTFS caché |
0x0B |
Windows FAT32 |
0x1B |
Fenêtres cachées FAT32 |
0x0C |
Windows FAT32 (LBA) |
0x1C |
Fenêtres cachées FAT32 (LBA) |
0x0E |
Windows FAT16 (LBA) |
0x1E |
Fenêtres cachées FAT16 (LBA) |
0x0F |
Fenêtres étendues |
0x1F |
Fenêtres cachées agrandies |
Ici, nous voyons que la partition cachée correspondante pour tout système de fichiers est trouvée en ajoutant la valeur 0x10 à son octet indicateur système.
Bien que ce ne soit pas une règle absolue pour masquer la partition, cela fonctionne même pour la plupart des systèmes de fichiers. La raison en est que lorsque nous modifions la valeur de l'octet indicateur de partition, l'identité du système de fichiers dans l'entrée de la table de partition est modifiée. Et il est très rare que le nouveau système de fichiers soit également pris en charge par le même système d'exploitation.
Écrire un programme pour masquer une partition
Le programme ci-dessous est utilisé pour masquer la partition à l'aide de l'entrée de partition de cette partition dans la table de partition du MBR. Si vous souhaitez masquer d'autres partitions logiques dans le volume étendu, vous devez accéder aux MBR étendus.
Le codage du programme est donné ci-après :
/* Programme pour masquer la partition en utilisant l'entrée de la table de partition de cette partition à partir du MBR */
#include <bios.h>
#include <stdio.h>
int main(void)
{
structure diskinfo_t dinfo;
int résultat, à masquer ;
int i;
static char dbuf[512];/* Tampon de données pour lire-écrire le
Informations sectorielles */
clrscr();
dinfo.drive = 0x80; /* numéro de lecteur pour le premier
Disque dur */
dinfo.head = 0; /* numéro de tête de disque */
dinfo.track = 0; /* numéro de piste */
dinfo.sector = 1; /* numéro de secteur */
dinfo.nsectors = 1; /* nombre de secteurs */
dinfo.buffer = dbuf; /* tampon de données */
/* Lire le premier secteur du disque */
résultat = _bios_disk(_DISK_READ, &dinfo);
si ((résultat & 0xff00) == 0)
{
printf("Les codes de partition des quatre entrées de partition sont,
0x%02x, 0x%02x, 0x%02x et 0x%02x.\n",
dbuf[450] et 0xff, dbuf[466] et 0xff,
dbuf[482] et 0xff, dbuf[498] et 0xff);
couleur du texte(15);
gotoxy(5,5);cprintf("L'entrée de partition dans le MBR est la suivante
suit : ");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3. "); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4. "); showtype(dbuf[498] & 0xff);
/* obtenir l'entrée utilisateur pour masquer la partition */
gotoxy(1,15);
printf("Entrez le numéro de partition que vous souhaitez masquer,
Ou appuyez sur n'importe quelle autre touche pour quitter... ");
à cacher = getche();
changer(à cacher)
{
case '1': /* Masquer la première partition dans la table de partitions */
dbuf[450] = dbuf[450] +16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
cas '2' : /* Masquer la deuxième partition dans la table de partitions */
dbuf[466] = dbuf[466]+16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
cas '3' : /* Masquer la troisième partition dans la table de partitions */
dbuf[482] = dbuf[482] +16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
cas '4' : /* Masquer la quatrième partition dans la table de partitions */
dbuf[498] = dbuf[498]+16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
défaut:
sortie(0);
}
si ((résultat & 0xff00) == 0)
{
printf("\n\nLes nouveaux codes de partitionnement de quatre partitions
Les entrées sont, 0x%02x, 0x%02x, 0x%02x et 0x%02x.\n",
dbuf[450] et 0xff, dbuf[466] et 0xff,
dbuf[482] et 0xff, dbuf[498] et 0xff);
obtenir();
}
autre
{
printf("Impossible de modifier l'octet, état = 0x%02x\n",
résultat);
obtenir();
}
}
retourner 0;
}
Commentaires sur le codage :
Le programme lit les octets indicateurs du système de fichiers des quatre entrées de partition dans la table de partition du MBR. La fonction showtype( ) est utilisée pour afficher le nom du système de fichiers pour la valeur correspondante de l'octet indicateur du système de fichiers.
L'utilisateur sélectionne la partition à masquer dans le menu affiché à l'écran, puis 16 (0x10) est ajouté à la valeur de l'octet indicateur du système de fichiers de cette partition pour la masquer.
Le codage de la fonction showtype( ) est le suivant :
/* Fonction permettant d'afficher le nom du système de fichiers correspondant à la valeur de l'octet indicateur du système de fichiers */
type d'émission(i)
{
commutateur (i)
{
cas 0x00 :cprintf("Vide"); pause;
cas 0x01 :cprintf("DOS 12 bits FAT"); pause;
cas 0x02 :cprintf("racine XENIX"); pause;
cas 0x03 :cprintf("XENIX usr"); pause;
cas 0x04 :cprintf("DOS 16 bits <32M"); pause;
cas 0x05 :cprintf("Étendu"); pause;
cas 0x06 :cprintf("DOS 16 bits >=32M"); pause;
cas 0x07 :cprintf("OS/2 HPFS"); pause;
cas 0x08 :cprintf("AIX"); pause;
cas 0x09 :cprintf("AIX bootable"); pause;
cas 0xa :cprintf("OS/2 Boot Manag"); pause;
cas 0xb :cprintf("Win95/98/ME FAT32"); pause;
cas 0xc :cprintf("Win95/98/ME FAT32 (LBA)"); pause;
cas 0xd :cprintf("Win95 FAT16"); pause;
cas 0xe :cprintf("Win95 FAT16 (LBA)"); pause;
cas 0xf :cprintf("Win95 Extended"); pause;
cas 0x11 :cprintf("FAT-12 caché");break;
cas 0x12 :cprintf("Diagnostics Compaq");pause;
cas 0x14 :cprintf("FAT-16 caché (<32)");break;
cas 0x15 :cprintf("Étendu caché");pause;
cas 0x16 :cprintf("FAT-16 caché");break;
cas 0x17 :cprintf("NTFS"); pause;
cas 0x40 :cprintf("Venix 80286"); pause;
cas 0x51 :cprintf("Novell ?"); pause;
cas 0x52 :cprintf("Microport"); pause;
cas 0x63 :cprintf("GNU HURD"); pause;
cas 0x64 :
cas 0x65 :cprintf("Novell Netware"); pause;
cas 0x75 :cprintf("PC/IX"); pause;
cas 0x80 :cprintf("Ancien MINIX"); pause;
cas 0x81 :cprintf("Linux/MINIX"); pause;
cas 0x82 :cprintf("Linux swap"); pause;
cas 0x83 :cprintf("Linux natif"); pause;
cas 0x85 :cprintf("Linux étendu"); pause;
cas 0x93 :cprintf("Amoeba"); pause;
cas 0x94 :cprintf("Amoeba BBT"); pause;
cas 0xa5 :cprintf("BSD/386"); pause;
cas 0xa6 :cprintf("OpenBSD"); pause;
cas 0xa7 :cprintf("ÉTAPE SUIVANTE"); pause;
cas 0xb7 :cprintf("BSDI fs"); pause;
cas 0xb8 :cprintf("BSDI swap"); pause;
cas 0xc7 :cprintf("Syrinx"); pause;
cas 0xdb :cprintf("CP/M"); pause;
cas 0xe1 :cprintf("accès DOS"); break;
cas 0xe3 :cprintf("DOS R/O"); pause;
cas 0xf2 :cprintf("DOS secondaire"); break;
cas 0xff :cprintf("BBT"); pause;
par défaut :cprintf("INCONNU");
}
retourner 0;
}
Écrire un programme pour afficher la partition
Le programme permettant de révéler la partition cachée fonctionne exactement à l'opposé du programme qui cache le programme. Dans ce programme, nous soustrayons 16 (0x10) de la valeur de l'octet indicateur du système de fichiers de la partition cachée.
Le codage du programme est le suivant :
/* Programme pour afficher la partition masquée par le programme précédent */
#include <bios.h>
#include <stdio.h>
int main(void)
{
structure diskinfo_t dinfo;
int résultat, à masquer ;
int i;
static char dbuf[512];/* Tampon de données */
clrscr();
dinfo.drive = 0x80; /* numéro de lecteur pour
Premier disque dur */
dinfo.head = 0; /* numéro de tête de disque */
dinfo.track = 0; /* numéro de piste */
dinfo.sector = 1; /* numéro de secteur */
dinfo.nsectors = 1; /* nombre de secteurs */
dinfo.buffer = dbuf; /* tampon de données */
résultat = _bios_disk(_DISK_READ, &dinfo);
si ((résultat & 0xff00) == 0)
{
printf("Les codes de partitionnement de quatre partitions
Les entrées sont, 0x%02x, 0x%02x, 0x%02x et 0x%02x.\n",
dbuf[450] et 0xff, dbuf[466] et 0xff,
dbuf[482] et 0xff, dbuf[498] et 0xff);
couleur du texte(15);
gotoxy(5,5);
cprintf("L'entrée de partition dans le MBR est la suivante :");
gotoxy(10,7);cprintf("1. "); showtype(dbuf[450] & 0xff);
gotoxy(10,8);cprintf("2. "); showtype(dbuf[466] & 0xff);
gotoxy(10,9);cprintf("3. "); showtype(dbuf[482] & 0xff);
gotoxy(10,10);cprintf("4. "); showtype(dbuf[498] & 0xff);
/* Obtenir l'entrée Utiliser pour afficher la partition */
gotoxy(1,15);printf("Entrez le numéro de partition à laquelle
afficher, ou appuyez sur n'importe quelle autre touche pour
Sortie... ");
à cacher = getche();
changer(à cacher)
{
/* Afficher la première partition de la table de partitions */
cas '1':
dbuf[450] = dbuf[450] -16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
/* Afficher la deuxième partition de la table de partitions */
cas '2':
dbuf[466] = dbuf[466]-16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
/* Afficher la troisième partition de la table de partitions */
cas '3':
dbuf[482] = dbuf[482] -16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
/* Afficher la quatrième partition de la table de partitions */
cas '4':
dbuf[498] = dbuf[498]-16;
résultat = _bios_disk(_DISK_WRITE, &dinfo);
casser;
défaut:
sortie(0);
}
si ((résultat & 0xff00) == 0)
{
printf("\n\nLes nouveaux codes de partitionnement de quatre partitions
Les entrées sont, 0x%02x, 0x%02x, 0x%02x et 0x%02x.\n",
dbuf[450] et 0xff, dbuf[466] et 0xff,
dbuf[482] et 0xff, dbuf[498] et 0xff);
obtenir();
}
autre
{
printf("Impossible de modifier l'octet, état = 0x%02x\n",
résultat);
obtenir();
}
}
retourner 0;
}
Commentaires sur le programme
Soyez prudent lorsque vous indiquez le numéro de partition à afficher. Si le numéro de partition est saisi par erreur, les informations du système de fichiers de cette partition seront modifiées et la partition peut devenir inaccessible. Cependant, le programme décrit précédemment pour masquer les partitions peut vous aider à corriger l'octet indicateur du système de fichiers de cette partition.
Écriture d'un programme pour supprimer une partition
Le programme de suppression de partition est utilisé à des fins de dépannage. Par exemple, supposons que vous ayez des partitions de système de fichiers FAT32 sur votre disque. Vous avez maintenant décidé d'installer simultanément le système d'exploitation LINUX sur votre disque.
Si, d'une manière ou d'une autre, l'installation du système d'exploitation est interrompue au moment où des modifications sont apportées à la table de partition du MBR, il existe de nombreuses possibilités que la partition sur laquelle vous alliez installer l'autre système d'exploitation devienne inaccessible.
Dans ce cas, l'espace disque de la partition perdue devient inutile car inaccessible. Cependant, si nous supprimons les informations de partition de cette partition de la table de partitions, nous pouvons à nouveau rendre cet espace utilisable en utilisant la commande FDISK de DOS.
Le programme permettant de supprimer l'entrée de partition de la table de partition du MBR est donné ci-dessous :
/* Programme pour supprimer la deuxième entrée de partition de la table de partition du MBR */
# inclure <bios.h>
/* structure pour lire l'entrée de partition à partir de la table de partition */
structure de partition
{
/* Octet de partition actif */
char non signé amorçable ;
/* Tête de départ */
caractère non signé start_side ;
/* combinaison du secteur de départ et du numéro de cylindre */
int non signé start_sec_cyl ;
/* Octet indicateur du système de fichiers */
type de partie char non signé ;
/* Fin de la tête */
caractère non signé end_side ;
/* combinaison du secteur de départ et du numéro de cylindre */
int non signé end_sec_cyl ;
/* Numéro de secteur relatif */
partie_début non signée longue ;
/* Longueur de la partition en secteurs */
plen long non signé ;
} ;
/* Structure pour lire-écrire le MBR */
partie de structure
{
/* IPL (chargeur de programme initial) */
caractère non signé master_boot[446] ;
/* Table de partitions */
structure partition pt[4] ;
/* Nombre magique */
int dernierdeux ;
} ;
partie de structure p ;
void main()
{
int non signé t1,t2;
clrscr();
disque bios ( 2, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* affiche les informations de
Table de partition */
obtenir();
p.pt[1].bootable = 0;
p.pt[1].start_side = 0 ;
p.pt[1].start_sec_cyl = 0 ;
p.pt[1].parttype = 0;
p.pt[1].end_side = 0;
p.pt[1].end_sec_cyl = 0;
p.pt[1].part_beg = 0;
p.pt[1].plen = 0;
printf("\n\n\n Après la suppression de la deuxième partition
Entrée de la table de partition MBR,");
printf("\n La table de partition sera modifiée comme
Suit : ");
/* Pour supprimer les informations de la deuxième partition de la partition
table de MBR Supprimer les barres obliques de la
Fonction biosdisk( ). Ne pas utiliser négligemment, Partition
les informations de la deuxième partition de la table de partition seront
être complètement effacé. */
////// biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) ;
display(); /* Affiche les informations de la partition
tableau après modification */
obtenir();
}
Commentaires sur le programme :
Décommentez la fonction biosdisk ( 3, 0x80, 0, 0, 1, 1, &p ) pour supprimer la deuxième partition de la table de partition du MBR.
Pour supprimer la partition, tous les paramètres de celle-ci doivent être définis sur 0 dans l'entrée de la table de partitions du MBR. N'oubliez jamais que si vous supprimez la partition étendue, toutes les partitions logiques de cette partition étendue deviendront également inaccessibles.
La fonction display( ) permet d'afficher la table de partition du MBR. Le codage de la fonction est le suivant :
/* Fonction pour afficher la table de partition du MBR */
afficher()
{
entier non signé s_sec, s_trk, e_sec, e_trk, i, t1, t2 ;
char type[20], boot[5] ;
printf("\n\nPart. Boot Emplacement de départ Emplacement de fin
Nombre relatif de »);
printf("\nType Cylindre latéral Secteur Cylindre latéral
Secteur Secteurs Secteurs\n");
pour ( i = 0 ; i <= 3 ; i++ )
{
si ( p.pt[i].bootable == 0x80 )
strcpy ( boot, "Oui" ) ;
autre
strcpy ( boot, "Non" ) ;
commutateur ( p.pt[i].parttype )
{
cas 0x00 :
strcpy ( type, "Inutilisé" ) ; break ;
cas 0x1 :
strcpy ( type, "FAT12" ) ; pause ;
cas 0x2 :
strcpy ( type, "Xenix" ) ; pause ;
cas 0x3 :
strcpy ( type, "Xenix:usr" ) ; pause ;
cas 0x4 :
strcpy ( type, "FAT16<32M" ) ; pause ;
cas 0x5 :
strcpy ( type, "DOS-Ext." ) ; pause ;
cas 0x6 :
strcpy ( type, "FAT16>32M" ) ; pause ;
cas 0x7 :
strcpy ( type, "NTFS" ) ; pause ;
cas 0x0b :
strcpy ( type, "FAT32" ) ; pause ;
cas 0x0c :
strcpy ( type, "FAT32-LBA" ) ; pause ;
cas 0x0d :
strcpy ( type, "VFAT16" ) ; pause ;
cas 0x0e :
strcpy ( type, "VFAT16-LBA" ) ; pause ;
cas 0x0f :
strcpy ( type, "FAT EXT" ) ; pause ;
cas 0x17 :
strcpy ( type, "HPFS" ) ; pause ;
cas 0x81 :
strcpy ( type, "Ancien LINUX" ) ; break ;
cas 0x82 :
strcpy ( type, "LinuxSwap" ) ; pause ;
cas 0x83 :
strcpy ( type, "LinuxNative" ) ; pause ;
cas 0x85 :
strcpy ( type, "Ext. Linux." ) ; break ;
défaut :
strcpy ( type, "Inconnu" ) ; pause ;
}
s_sec = ( p.pt[i].start_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].start_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].start_sec_cyl & 0x00c0 ) << 2 ;
s_trk = t1 | t2 ;
e_sec = ( p.pt[i].end_sec_cyl & 0x3f ) ;
t1 = ( p.pt[i].end_sec_cyl & 0xff00 ) >> 8 ;
t2 = ( p.pt[i].end_sec_cyl & 0x00c0 ) << 2 ;
e_trk = t1 | t2 ;
printf ( "\n%6s %3s", tapez, boot ) ;
printf ( "%4d %6d %8d", p.pt[i].start_side,
s_trk,s_sec ) ;
printf ( "%7d %6u %8u", p.pt[i].end_side, e_trk,
e_sec ) ;
printf ( " %10lu %10lu", p.pt[i].part_beg,
p.pt[i].plen ) ;
}
retourner 0;
}
Formatage de la disquette « Track 0 Bad »
Ce programme est utilisé pour formater les disquettes qui ont des secteurs défectueux sur leur piste 0 et lorsqu'elles sont formatées sous DOS ou Windows, il affiche des messages d'erreur tels que « Piste 0 DÉFECTUEUSE ». Cependant, vous pouvez également l'utiliser pour formater des disquettes normales.
Le codage du programme est fourni sur le disque joint à ce livre sous le nom « TTFORMAT.C ». La logique de fonctionnement du programme est la même que celle du programme publié dans le magazine informatique PCQUEST, édition de février 2003.
Dans ce programme, nous essayons de rendre ce type de disquettes réutilisables en les formatant. Le programme indique que vous pouvez manipuler la disquette même si elle contient des secteurs défectueux. Cependant, si le premier secteur de la disquette est défectueux, la disquette ne peut pas être formatée.
Le programme réécrit toutes les informations du DBR, du FAT et du répertoire racine. S'il y a des secteurs défectueux à la surface du disque, ils sont marqués comme défectueux dans le FAT.
Dans le codage du programme, la structure BPB est utilisée pour écrire le bloc de paramètres BIOS du DBR. La structure boot_sector est utilisée pour écrire le DBR du disque. La structure address_field est utilisée pour interagir avec le nombre de cylindres, de têtes et de secteurs par piste et avec la taille du secteur.
Différentes fonctions utilisées dans le codage du programme et leur description ont été données dans le tableau ci-après.

Le numéro de série du volume de la disquette est calculé par le DOS en fonction de la date et de l'heure actuelles de l'horloge système.
La première partie du numéro de série est calculée par la somme de l'heure (secondes et centièmes de seconde) et de la date (mois et jour). La deuxième partie du numéro de série est égale à la somme de l'heure (heures et minutes) et de la date (année).
Tous les calculs sont effectués en système hexadécimal. Par exemple, supposons que vous ayez formaté la disquette dans un environnement DOS à 11:16:28:65 le 23/10/2003. Calculons maintenant le numéro de série du disque.
L'heure au format (secondes et centièmes de seconde) est
= (28 et 65)
= (1CH et 41H)
Écrivez-le comme 1C41
De même, la date au format (mois et jour) est
= (10 et 23)
= (0AH et 17H)
Écrivez-le comme 0A17
De même, l'heure au format (heures et minutes) est,
= (11 et 16)
= (0BH et 10H)
Écrivez-le comme 0B10
Et l'année sera
= 2003
= 07D3
Calculons maintenant le numéro de série de la disquette, selon la description donnée précédemment. La première partie du numéro de série sera (1C41 + 0A17) = 2658 et la deuxième partie sera (0B10 + 07D3) = 12E3.
Écriture de l'outil d'édition de disque
L'encodage du programme d'édition de disque était donné sur le disque inclus avec ce livre, avec le nom de fichier « TTEDITOR.C ». Vous pouvez utiliser ce programme pour analyser la surface des disques durs ou des disquettes. Même la plupart du temps, lors de l'écriture de ce livre, j'ai utilisé TTEDITOR pour analyser la surface du disque ou effectuer des modifications sur le disque.
Voici quelques-unes des tâches importantes que ce programme d’édition peut effectuer :
- Lecture d'informations secteur par secteur à partir de la surface des disques durs et des disquettes.
- Écrire une copie de sauvegarde de n’importe quel secteur dans un fichier.
- Récupérer les données du secteur à partir du fichier.
- Changer un octet.
- Calculatrice pour convertir des nombres hexadécimaux en nombres décimaux et binaires.
Le programme utilise les fonctions biosdisk( ) et _bios_disk( ) pour accéder aux disques. Si vous souhaitez analyser un disque au-delà de 8,4 Go, modifiez le programme pour utiliser les extensions INT 13H. La description des fonctions utilisées dans le programme est donnée dans le tableau suivant :
Fonction |
Description |
arrière-plan() |
crée l'arrière-plan et le cadre du premier écran |
lignecl( ) |
Utilisé pour effacer une ligne entière de l'écran spécifié par le numéro de ligne. |
mise à jour( ) |
Fonction permettant d'appeler toutes les fonctions d'affichage sur l'écran |
écriture dans le fichier() |
Fonction permettant d'écrire des données de secteur dans un fichier utilisateur. |
écrire dans le secteur ( ) |
La fonction de restauration d'un secteur à partir d'un fichier spécifié. |
msgdisp() |
Fonction d'affichage de messages sur l'écran. |
changement( ) |
Fonction permettant de modifier un octet de n'importe quel secteur spécifié par l'utilisateur. |
cadre( ) |
Fonction de dessin de la structure du cadre d'affichage sectoriel |
affichermax( ) |
Affiche le numéro CHS maximal d'un disque (valable pour les disques jusqu'à 8,4 Go) |
afficher( ) |
Affichage du secteur et des informations à l'écran. |
hextodéc( ) |
Fonction permettant de convertir un nombre hexadécimal en son nombre décimal et binaire correspondant. |