Chapitre – 11
Faire des sauvegardes
Pourquoi des sauvegardes ?
“Mieux vaut prévenir que guérir”. Faire des sauvegardes est également un élément important de la prévention des catastrophes de données, ce qui peut nous aider à surmonter le crash du disque ou tout autre type de perte de données. Dans ce chapitre, nous verrons comment nous pouvons récupérer les données même après de graves pannes de disque, uniquement à l'aide de sauvegardes effectuées précédemment.
La récupération effectuée par les sauvegardes précédemment stockées est presque toujours jusqu'à 100 %, mais les différents types de pannes de disque peuvent entraîner une variation des résultats de la récupération dans certains cas particuliers.
La récupération de données à l'aide de sauvegardes est assez simple, rapide et fiable et peut donner les meilleurs résultats alors que la récupération de données sans sauvegardes est un processus difficile, compliqué, qui peut prendre beaucoup de temps et même dans ce cas, nous craignons ne pas obtenir les données à 100 % dans plusieurs cas.
Quand et quoi sauvegarder
Il existe plusieurs zones différentes sur le disque qui doivent être sauvegardées une fois ou à différents intervalles de temps. Le tableau suivant donne une idée des mesures de sauvegarde complètes et aide à savoir quand et quoi sauvegarder :
What to Backup |
When to be Backed up |
Backup of MBR |
Once after FDISK. The MBR is Created By the FDISK command of DOS. You can take backup of MBR After FDISK, however even after the FORMAT of partitions created by FDISK, The MBR remains Unchanged. |
Backup of DBR |
Back up the DBRs for each logical drive once, after FORMAT. |
Backup of FAT and Directory entries. |
FAT and Directory Entries are changed every time when you create of delete files or directories. Therefore it is recommended that you should take backup daily. |
Backup of User Data |
Should be taken regularly. This type of backup causes the disk imaging to take place. However it is time taking yet most of the companies which have very sensitive data in their disks like to spend their time on disk imaging because by doing this they can backup all of the information described above. |
En plus de cela, vous devriez créer une disquette de démarrage d'urgence pour le système. En cas de catastrophe avec les données de votre disque dur, vous pouvez démarrer votre système à l'aide de cette disquette et analyser le disque à la recherche d'erreurs.
Sauvegarde du MBR (Master Boot Record) et son utilisation
Le Master Boot Record (MBR) ou parfois appelé la table de partition principale (MPT), contient un petit programme pour charger et démarrer la partition active (ou amorçable) à partir du disque dur. L'enregistrement de démarrage principal contient des informations sur les quatre partitions principales.
Pour une étude détaillée sur le MBR, reportez-vous au chapitre "Approche logique des disques et du système d'exploitation", abordé plus haut dans ce livre.
Le MBR est situé au secteur absolu 0 ou nous pouvons dire au cylindre 0, à la tête 0 et au secteur 1. Il est créé sur le disque dur en exécutant la commande FDISK.EXE de DOS.
Pourquoi sauvegarder le MBR :
MBR permet au secteur de démarrage de la partition active de recevoir le contrôle au démarrage du système.
Après le Power-On Self Test (POST), le BIOS charge le MBR (Master Boot Record) du disque dur dans la mémoire, puis l'exécute. Tout d'abord, le MBR vérifie le disque dur pour une partition active, puis il charge l'enregistrement de démarrage DOS (DBR) en mémoire et passe le contrôle au code de démarrage du système d'exploitation, puis le code d'enregistrement de démarrage du système d'exploitation charge le reste du système d'exploitation dans Mémoire.
Là, on peut dire que si le MBR du disque est corrompu, le disque dur est presque mort et le système est complètement incapable de démarrer ou d'exécuter le système d'exploitation. Dans de telles conditions, toutes les données stockées sur le disque dur deviennent inaccessibles. Généralement, les messages d'erreur s'affichent comme suit :
“Table de partition invalide” "Erreur lors du chargement du système d'exploitation" «Système d'exploitation manquant"
Que peut-on récupérer avec la sauvegarde du MBR ?
La sauvegarde du MBR peut vous aider à vous débarrasser des messages d'erreur ci-dessus. Avec la sauvegarde, les problèmes suivants peuvent être corrigés :
- Erreur de chargement du système d'exploitation, en raison d'un IPL (chargeur de programme initial) corrompu
- Partition(s) principale(s) perdue(s)
- Informations sur la partition corrompue
- Numéro magique invalide
Écrire le programme pour effectuer une sauvegarde du MBR :
/* Programme de sauvegarde du MBR */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo; /* Structure to Hold the
information of disk Parameters */
int result;
int count=0;
char filename[80]; /* Stores the File name given by
User */
static char dbuf[512]; /* Data Buffer of 512 Bytes */
FILE *fp;
dinfo.drive = 0x80; /* drive number for First Hard
Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
printf("\n Enter The Filename and path to store the
Backup of MBR \n ");
gets(filename);
// Ouvrir le fichier pour stocker la sauvegarde MBR \\
if((fp=fopen(filename,"wb"))==NULL)
{
printf("Could not Create File, Press any key to
Exit...");
getch();
exit(0);
}
printf("Attempting to read from Hard disk drive :\n");
//// Lire le secteur de disque spécifié \\\\
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Disk read from hard disk drive :
successful.\n");
/// Écrire 512 octets de MBR dans le fichier \\\\
while(count<512)
{
fprintf(fp,"%c",dbuf[count] & 0xff );
count++;
}
fclose(fp);
}
else
printf("Cannot read Hard Disk drive, status = 0x%02x\n", result);
return 0;
}
Commentaires sur le codage du programme :
Dans le codage du programme donné précédemment, nous procédons essentiellement à l'exécution des tâches suivantes étape par étape :
- dinfo pointe vers la structure diskinfo_t qui contient les informations des paramètres requis par l'opération effectuée par la fonction _bios_disk.
- Puisque nous voulons lire le premier secteur du disque, l'emplacement du secteur sera donc le suivant :
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
>Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- Ouvrir un flux de fichiers avec un nom de fichier et un chemin donnés par l'utilisateur pour stocker la sauvegarde du MBR de 512 octets exacts. Le nom et le chemin du fichier sont stockés dans le tableau de caractères filename.
- _bios_disk(_DISK_READ, &dinfo) lit le premier secteur du disque dur (80H), spécifié par dinfo.
- Le statut renvoyé est stocké dans le résultat qui est utilisé pour afficher le message de réussite de l'opération ou pour afficher un message d'erreur à l'écran en cas d'erreur.
Programme de restauration du MBR à partir de la sauvegarde :
Si le MBR est corrompu de quelque manière que ce soit, le programme indiqué ensuite aide à restaurer le MBR Back.
Il faut toujours garder à l'esprit que l'utilisation illégale ou l'utilisation par méconnaissance de ce programme peut détruire vos informations de données sur le disque dur et rendre toutes les données inaccessibles. Vous devez être sûr de ce que vous allez faire. Sinon, vous risquez de compliquer davantage le problème.
Programme de restauration du MBR à partir d'une sauvegarde :
Le codage du programme est le suivant :
/* Programme pour restaurer la sauvegarde du MBR à partir du fichier de sauvegarde */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result;
int count=0;
char filename[80]; /* Stores the File name given
by User */
static char dbuf[512]; /* Data Buffer of 512 Bytes
*/
FILE *fp;
/* Obtenir l'entrée utilisateur pour le chemin du fichier de sauvegarde MBR */
printf("\n Enter The Filename and path of Backup File of
MBR \n ");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Could not open Backup File, Press any key
to Exit...");
getch();
exit(1);
}
/* Obtenir l'entrée utilisateur pour le chemin du fichier de sauvegarde MBR */
while(count<512)
{
fscanf(fp,"%c",&dbuf[count]);
count++;
}
fclose(fp);
printf("Attempting to Write to Hard disk drive :\n");
dinfo.drive = 0x80; /* drive number for First
Hard Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
result = _bios_disk(_DISK_WRITE, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Restoring the Backup of MBR to The Disk
Sector: successful.\n");
}
else
printf("Cannot Write on Hard Disk drive, status =
0x%02x\n", result);
return 0;
}
Commentaires sur le codage du programme :
Dans le codage du programme donné ci-dessus, nous procédons essentiellement à l'exécution des tâches suivantes étape par étape :
- dinfo pointe vers la structure diskinfo_t qui contient les informations des paramètres requis par l'opération effectuée par la fonction _bios_disk.
- Puisque nous voulons écrire sur le premier secteur du disque, l'emplacement du secteur sera donc le suivant :
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- Le nom du fichier et le chemin de la sauvegarde du MBR, donnés par l'utilisateur, sont stockés dans le tableau de caractères filename. Il convient de garder à l'esprit que les informations MBR doivent être de 512 octets exacts.
- _bios_disk(_DISK_WRITE, &dinfo) écrit les données sur le premier secteur du disque dur (80H), spécifié par dinfo.
- Le statut renvoyé est stocké dans le résultat qui est utilisé pour afficher le message de réussite de l'opération ou pour afficher un message d'erreur à l'écran en cas d'erreur.
Sauvegarde du DBR (DOS Boot Record) et son utilisation
Après la table de partition, le DOS Boot Record (DBR) ou parfois appelé DOS Boot Sector est la deuxième information la plus importante sur votre disque dur.
Pour une étude détaillée sur DBR, reportez-vous au chapitre "Approche logique des disques et du système d'exploitation", discuté plus haut dans ce livre.
Le premier secteur logique de chaque partition DOS contiendra un enregistrement de démarrage DOS (DBR) ou un secteur de démarrage DOS. Le travail du DBR est de charger le système d'exploitation du disque dur dans la mémoire principale de l'ordinateur et de donner le contrôle du système au programme chargé.
L'enregistrement de démarrage DOS (DBR) pour la première partition sur un disque dur se trouve généralement au secteur absolu 63 (le 64e secteur sur le lecteur de disque) ou sous forme CHS, nous pouvons dire C–H–S = 0–1&ndash ;1 pour la plupart des lecteurs.
Cependant, cet emplacement peut varier en fonction du SPT (secteurs par piste) du lecteur. Par exemple, sur un ancien lecteur de 245 Mo n'ayant que 31 SPT, l'enregistrement de démarrage était situé sur le 32e secteur (secteur absolu 31).
Le DBR est créé par la commande FORMAT du DOS, une fois le partitionnement effectué à l'aide de la commande FDISK. Le secteur sur lequel réside DBR devient le secteur logique 1 de cette partition particulière pour le DOS. Le numéro de secteur utilisé par DOS commence par le secteur physique sur lequel se trouve DBR.
Le DBR contient un petit programme qui est exécuté par le programme exécutable Master Boot Record (MBR). Toutes les partitions DOS contiennent le code de programme pour démarrer la machine, c'est-à-dire charger le système d'exploitation, mais seule cette partition est contrôlée par le Master Boot Record qui est spécifié comme partition active, dans l'entrée de la table de partition.
Pourquoi sauvegarder DBR :
Le DBR contient des informations importantes sur la géométrie du disque. Ces informations sont situées dans le premier secteur de chaque partition, telles que :
- Code d'accès + NOP
- Nom et version OEM
- Octets par secteur
- Secteurs par cluster
- Secteurs réservés
- Nombre de copies de FAT
- Nombre maximal d'entrées dans le répertoire racine (mais non disponible pour FAT32)
- Nombre de secteurs dans la partition inférieur à 32 Mo (donc non disponible pour FAT32)
- Descripteur de média (F8H pour les disques durs)
- Secteurs par FAT (dans les anciens systèmes FAT et non disponibles pour FAT32)
- Secteurs par piste
- Nombre de têtes
- Nombre de secteurs cachés dans la partition
- Nombre de secteurs dans la partition
- Nombre de secteurs par FAT
- Indicateurs de descripteur d'informations FAT
- Version du lecteur FAT32
- Numéro de cluster du début du répertoire racine
- Numéro de secteur du secteur d'informations du système de fichiers
- Numéro de secteur du secteur de démarrage de sauvegarde
- Réservé
- Numéro de partition du lecteur logique
- Signature étendue (29H)
- Numéro de série de la partition
- Nom du volume de la partition
- Nom FAT
- Code exécutable
- Marqueur exécutable ou numéro magique (AAH 55H)
Généralement, les messages d'erreur suivants s'affichent à l'écran :
“Échec du démarrage du disque”
“Disque non système ou erreur de disque”
“Disque système non valide ou erreur d'E/S de disque”
“Remplacez le disque, puis appuyez sur n'importe quelle touche””
Que peut-on récupérer avec la sauvegarde de DBR ?
La sauvegarde de DBR peut vous aider à vous débarrasser des messages d'erreur ci-dessus. Ces messages d'erreur à l'écran attendent que l'utilisateur place une disquette amorçable avec les programmes mentionnés ci-dessus dans le lecteur de disquette et appuie sur une touche.
Le lecteur doit être accessible si vous démarrez le système à partir de la disquette ou du CD de démarrage. Bien que le disque dur ne soit pas amorçable, cela ne devrait généralement pas affecter l'accès aux données du lecteur de disque. Après avoir démarré le système avec le disque amorçable, vous pouvez accéder aux données.
En restaurant la sauvegarde de DBR, vous pouvez surmonter les problèmes générés, comme mentionné ci-dessus.
Programmes pour créer et restaurer des sauvegardes de DBR :
Les programmes pour effectuer les sauvegardes des DBR et les restaurer sont presque similaires aux programmes de sauvegarde et de restauration du MBR.
Par exemple, si vous allez écrire les programmes pour effectuer la sauvegarde du DBR du premier lecteur logique du disque et pour le restaurer, les paramètres spécifiés par la structure dinfo seront modifiés comme suit :
Parameter |
What it means |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive |
dinfo.head = 1 |
It points to head number 1 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
Here we see that only the location of the sector to read/write is changed. Here the C-H-S is given as 0-1-1 as the DBR of first logical drive is stored here.
Imagerie de disque complète
Ce type de sauvegarde devient de plus en plus populaire de nos jours et est préféré par ces organisations qui ont des données très sensibles dans leurs systèmes. Ils ne peuvent prendre aucune chance de même un seul pour cent de perte de données.
Ces organisations effectuent régulièrement leurs sauvegardes sous forme d'image disque complète. Bien que cela prenne du temps, mais vous garantit que vous ne manquerez de rien. En raison de sa popularité croissante, les programmeurs ont fait de leur mieux pour rendre le logiciel d'imagerie de disque de plus en plus rapide afin de minimiser la durée du processus d'imagerie.
L'imagerie de disque est une bonne idée, car en y consacrant quelques dizaines de minutes, vous pouvez avoir la tranquillité d'esprit d'avoir une sauvegarde de tout dans votre poche. Tous les facteurs tels que MBR, BDR, FAT, répertoires racine sont copiés tels quels sur le disque de destination.
Ce dont nous avons besoin pour l'image disque, c'est d'un disque dur de destination identique (ou presque) à notre disque dur source dans lequel nous avons nos précieuses données. Une chose est toujours gardée à l'esprit que le disque de destination ne doit pas être plus petit que le disque source.
Après avoir pris l'image complète, si vous démarrez le système avec le disque de destination, dans lequel vous avez pris l'image disque, vous obtiendrez généralement toutes les données telles quelles.
Écrire le programme pour une image complète du disque
Le programme pour l'image disque a été donné ensuite. Le programme utilise les extensions INT 13H, il peut donc également prendre en charge de gros disques.
Le programme crée l'image du premier disque dur physique (0x80) sur le deuxième disque dur physique (0x81) donc avant de créer l'image de sauvegarde, vous devez garder à l'esprit que toutes les données du disque de destination (0x81) seront être écrasé par les données du disque source (0x80) dans un modèle secteur par secteur.
Le codage du programme a été donné ensuite :
/* Programme pour créer l'image du premier disque dur (0x80) sur le deuxième disque dur (0x81) */
#include<stdio.h>
#include<dos.h>
#include<conio.h>
/* Structure à utiliser par la fonction getdrivegeometry à l'aide de l'extension INT 13H, numéro de fonction 0x48. */
struct geometry
{
unsigned int size ; /* (call) size of Buffer */
unsigned int flags ; /* Information Flags */
unsigned long cyl ; /* Number of Physical
Cylinders on Drive */
unsigned long heads ;/* Number of Physical
Heads on Drive */
unsigned long spt ; /* Number of Physical
Sectors Per Track */
unsigned long sectors[2] ; /* Total Number of
Sectors on Drive */
unsigned int bps ; /* Bytes Per Sector */
} ;
/* Structure du format de paquet d'adresse de disque, à utiliser par les fonctions, readabsolutesectors et writeabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Size of Packet, generally 10H */
char reserved ; /* Reserved (0) */
int blockcount ; /* Number of Blocks to Transfer */
char far *bufferaddress ; /* address to Transfer
Buffer */
unsigned long blocknumber[2] ; /* Starting Absolute
Block Number */
} ;
///// Fonction pour obtenir les paramètres du lecteur \\\\\
unsigned long getdrivegeometry (int drive)
{
union REGS i, o ;
struct SREGS s ;
struct geometry g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
i.h.ah = 0x48 ; /* Function Number 0x48 of INT 13H
Extensions See the Comments
Below */
i.h.dl = drive; /* Drive Number */
i.x.si = FP_OFF ( (void far*)&g ) ;
s.ds = FP_SEG ( (void far*)&g ) ;
/* Invoque le numéro de fonction spécifié de l'extension INT 13H avec les valeurs de registre de segment */
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder =
%lu\n", g.heads, g.spt, g.cyl);
/* Si la fonction d'obtention de la géométrie du lecteur échoue, affichez le message d'erreur et quittez */
if(g.spt==0)
{
printf("\n Get Drive Geometry Function Fails....");
printf("\n Extensions Not Supported, Press any Key to
Exit...");
getch();
exit(1);
}
return *g.sectors; /* Return The Number of Sectors
on Drive */
}
////// Début du principal \\\\\\
void main()
{
unsigned long loop=0, Sectors_in_HDD1=0, Sectors_in_HDD2=0;
unsigned char buffer[61440]; /* Data buffer of 61440
Bytes to Read/Write 120 Sectors of 512 Bytes at a time to save time. */
char choice;
clrscr();
/* Si nombre total de disques durs connectés est inférieur à deux Afficher un message d'erreur et quitter. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n You Must Have At least Two Hard Disks
Attached to your Computer To Run This");
printf("\n Program. Press any Key to Exit... ");
getch();
exit(1);
}
/// Obtenir les paramètres du premier disque dur (0x80) \\\
Sectors_in_HDD1 = getdrivegeometry (0x80);
printf(" Total Sectors in First Hard Disk = %lu\n\n",
Sectors_in_HDD1);
/// Obtenir les paramètres du deuxième disque Hsrd (0x81) \\\
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Total Sectors in Second Hard Disk = %lu\n\n",
Sectors_in_HDD2);
/// Confirmez d'abord, puis continuez \\\
printf("\n All The Data in Second Hard Disk will be
lost !!!");
printf("\n Press \'Y\' to Continue, Else any key to
Exit... ");
choice = getche();
switch(choice)
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
/* La destination ne doit pas être plus petite que la source */
if(Sectors_in_HDD2<Sectors_in_HDD1)
{
printf("\n\n Destination Disk should not be Smaller
than Source Disk");
printf("\n Press any Key to Exit...");
getch();
exit(0);
}
/* Si tout va bien, copiez tous les secteurs du disque source sur le disque dur de destination */
gotoxy(10,15);printf("Copying Absolute Sector: ");
for(loop=0;loop< =Sectors_in_HDD1;loop=loop+120)
{
readabsolutesectors ( 0x80, loop, 120, buffer );
writeabsolutesectors ( 0x81, loop, 120, buffer );
gotoxy(36,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
}
//// Afficher le message d'achèvement \\\
printf("\n\n Disk Imaging is Now Completed, Press any Key
To Exit...");
getch();
}
//// End of main
Commentaires sur le codage :
Dans le codage du programme donné précédemment, pour l'imagerie de disque, nous procédons en effectuant les tâches suivantes :
- La structure, la géométrie est utilisée par la fonction getdrivegeometry à l'aide de l'extension INT 13H, numéro de fonction 0x48. Pour une description détaillée des extensions INT 13H, reportez-vous au chapitre “Manipulation de gros disques durs”, discuté plus haut dans ce livre.
Les types de données représentant plusieurs paramètres du disque ont les significations suivantes :
Data Type |
Size in Bytes |
Description |
unsigned int size |
2 Bytes |
Size of Buffer |
unsigned int flags |
2 Bytes |
Information Flags |
unsigned long cyl |
4 Bytes |
Number of Physical Cylinders on Drive |
unsigned long heads |
4 Bytes |
Number of Physical Heads on Drive |
unsigned long spt |
4 Bytes |
Number of Physical Sectors Per Track |
unsigned long sectors[2] |
8 Bytes |
Total Number of Sectors on Drive |
unsigned int bps |
2 Bytes |
Bytes Per Sector |
- La structure diskaddrpacket est utilisée par les fonctions readabsolutesectors et writeabsolutesectors. Le format du paquet d'adresse de disque a été donné dans le tableau suivant :
Data Type |
Size in Bytes |
Description |
char packetsize |
1 Byte |
Size of Packet, generally 10H |
char reserved |
1 Byte |
Reserved (0) |
int blockcount |
2 Bytes |
Number of Blocks to Transfer |
char far *bufferaddress |
4 Bytes |
address to Transfer Buffer |
unsigned long blocknumber[2] |
4 Bytes |
Starting Absolute Block Number |
- La fonction getdrivegeometry est utilisée pour obtenir les paramètres du Drive spécifié. La fonction getdrivegeometry utilise le numéro de fonction 0x48 des extensions INT 13H.
La signification des paramètres a été décrite dans le tableau ci-dessous :
Parameter |
What it means |
i.h.ah = 0x48 |
Function Number 0x48 of INT 13H Extensions |
i.h.dl = drive |
Drive Number |
i.x.si = FP_OFF ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
s.ds = FP_SEG ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
La fonction int86x(0x13, &i, &o, &s) invoque l'interruption 13H avec des valeurs de registre de segment. La fonction getdrivegeometry renvoie le nombre total sur le lecteur.
- Dans la fonction main(), (char)peekb(0x0040, 0x0075); (la fonction peekb est définie dans DOS.H) renvoie le nombre de disques durs connectés au système.
Le nombre de disques durs connectés au système est représenté par l'octet stocké à l'emplacement mémoire 0040H:0075H (Segment 0040H : Décalage 0075H). Si le nombre de disques durs connectés au système est inférieur à deux, le programme affiche le message d'erreur et se termine.
Sectors_in_HDD1 = getdrivegeometry (0x80); obtient les paramètres du premier disque dur (0x80) et renvoie le nombre total de secteurs sur le premier disque dur.
De même Sectors_in_HDD2 = getdrivegeometry (0x81); obtient les paramètres du deuxième disque dur (0x81) et renvoie le nombre total de secteurs sur le deuxième disque dur.
Après confirmation par l'utilisateur de poursuivre l'imagerie, vérifiez d'abord la condition selon laquelle la taille du disque dur source ne doit pas être supérieure à la taille du disque dur de destination. Si la destination est plus petite, affichez le message d'erreur et quittez.
Si tout se passe bien, copiez les secteurs du disque source sur le disque de destination. Ici, nous lisons et écrivons 61440 octets (120 secteurs avec chacun des 512 octets) à la fois pour accélérer le processus d'imagerie.
Si vous souhaitez utiliser plus de secteurs à la fois, même au-delà de la limite de 64K, vous pouvez le faire en utilisant “énorme pointeur” dans le modèle à grande mémoire. L'exemple de spécification est le suivant :
char énorme tableau[100000L] ;
- La fonction, readabsolutesectors ( 0x80, loop, 120, buffer ); lit les 120 secteurs du premier disque dur (0x80), en commençant par le numéro de secteur spécifié par une boucle d'entier long non signé et stocke les données dans le tampon de données.
- La fonction, writeabsolutesectors ( 0x81, loop, 120, buffer ); écrit les données du tampon de données sur 120 secteurs du deuxième disque dur (0x81), en commençant par le numéro de secteur spécifié par une boucle d'entier long non signé.
Le codage des fonctions readabsolutesectors ( ) et writeabsolutesectors ( ) a été donné ensuite :
//// Fonction de lecture de secteur(s) absolu(s) \\\\
int readabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* packet size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of sectors
to read */
/* pour le tampon de données */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ; /* Sector number
to read */
pp.blocknumber[1] = 0 ; /* Block number */
i.h.ah = 0x42 ; /* Function Number*/
i.h.dl = drive ; /* Physical Drive Number */
i.x.si = FP_OFF ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
/* Invoque la fonction spécifiée de INT 13H avec des valeurs de registre de segment */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /*failure */
else
return 1 ; /* success */
}
//// Fonction d'écriture de secteur(s) absolu(s) \\\\
int writeabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Packet Size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of Sectors
to be written */
/* pour le tampon de données */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ;/* Sector number
to be written */
pp.blocknumber[1] = 0 ; /* Block number = 0 */
i.h.ah = 0x43 ; /* Function Number */
i.h.al = 0x00 ; /* Write Flags, see
comments */
i.h.dl = drive ; /* Physical Drive number*/
/* ds:si for buffer Parameters */
i.x.si = FP_OFF ( (void far*)&pp ) ;
/* ds:si for buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ;
/* Invoque la fonction spécifiée de INT 13H avec des valeurs de registre de segment */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /* failure */
else
return 1 ; /* success */
}
Commentaires sur le codage :
Les paramètres utilisés par les deux fonctions ont les significations suivantes :
Parameter |
Size in Bytes |
Description |
pp.packetsize = 16 ; |
1 Byte |
Size of packet = 10H |
pp.reserved = 0 ; |
1 Byte |
Reserved = 0 |
pp.blockcount = numofsectors ; |
2 Bytes |
Number of sectors to read |
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer)); |
----- |
for Data buffer or Transfer Buffer |
pp.blocknumber[0] = sectornumber ; |
4 Bytes |
Sector number to read/write (generally, we need only this). Only alone This can support up to 2.1 Terabytes. |
pp.blocknumber[1] = 0 ; |
4 Bytes |
Block number. Use this, If accessing the disk of greater then 2.1 Terabytes in size. |
i.h.ah = 0x42 ; or i.h.ah = 0x43 ; |
2 Bytes |
Function Number of INT 13H Extensions |
i.h.al = 0x00 ; |
1 Byte |
Write Flags used in write function only,00H, 01H are used for Write Without Verify and 02H is used for write with verify |
i.h.dl = drive ; |
2 Bytes |
Physical Drive Number |
i.x.si = FP_OFF ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
s.ds = FP_SEG ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
int86x ( 0x13, &i, &o, &s ) ; |
------ |
Invoke the specified Function of INT 13H with segment register values |
Page modifiée le: 09/03/2022