Capítulo – 11
Hacer copias de seguridad
¿Por qué hacer copias de seguridad?
“La prevención siempre es mejor que la cura”. Hacer copias de seguridad también es una parte importante de la prevención de desastres de datos, lo que puede ayudarnos a superar el bloqueo del disco o cualquier otro tipo de pérdida de datos. En este capítulo, discutiremos cómo podemos recuperar los datos incluso después de algunas fallas graves del disco, solo con la ayuda de copias de seguridad realizadas previamente.
La recuperación realizada por las copias de seguridad previamente almacenadas es, casi siempre, hasta el 100 por ciento, sin embargo, los diversos tipos de fallas del disco pueden causar la variación en los resultados de la recuperación en algunos casos particulares.
La recuperación de datos con la ayuda de copias de seguridad es bastante fácil, rápida y confiable, y puede dar los mejores resultados, mientras que la recuperación de datos sin copias de seguridad es un proceso difícil, complicado, puede tomar mucho tiempo e incluso entonces tenemos miedo de no obtener el 100 por ciento de los datos en varios casos.
Cuándo y qué respaldar
Hay varias áreas diferentes en el disco de las que se debe hacer una copia de seguridad una vez o en diferentes intervalos de tiempo. La siguiente tabla da una idea de las medidas de copia de seguridad completas y ayuda a saber cuándo y qué hacer una copia de seguridad:
De qué respaldar |
Cuándo hacer una copia de seguridad |
Copia de seguridad de MBR |
Una vez después de FDISK. El MBR es creado por el comando FDISK de DOS. Puede realizar una copia de seguridad de MBR después de FDISK; sin embargo, incluso después del FORMATO de las particiones creadas por FDISK, el MBR permanece sin cambios. |
Copia de seguridad de DBR |
Haga una copia de seguridad de los DBR para cada unidad lógica una vez, después de FORMATEAR. |
Copia de seguridad de FAT y entradas de Directorio. |
FAT y las entradas de directorio se cambian cada vez que crea o elimina archivos o directorios. Por lo tanto, se recomienda que realice copias de seguridad diariamente. |
Copia de seguridad de los datos del usuario |
Debe tomarse regularmente. Este tipo de copia de seguridad hace que se realice la creación de imágenes del disco. Sin embargo, lleva tiempo, pero a la mayoría de las empresas que tienen datos muy confidenciales en sus discos les gusta dedicar su tiempo a la creación de imágenes del disco porque al hacerlo pueden hacer una copia de seguridad de toda la información descrita anteriormente. |
Además de esto, debe crear un disquete de arranque de emergencia para el sistema. Si hay algún tipo de desastre con los datos en su disco duro, puede iniciar su sistema con la ayuda de este disquete y analizar el disco en busca de errores.
Copia de seguridad de MBR (Master Boot Record) y su uso
El registro de arranque maestro (MBR) o, a veces, la tabla de partición maestra (MPT), contiene un pequeño programa para cargar e iniciar la partición activa (o de arranque) desde la unidad de disco duro. El registro de arranque maestro contiene información sobre las cuatro particiones primarias.
Para obtener un estudio detallado sobre MBR, consulte el capítulo "Enfoque lógico de los discos y el sistema operativo", analizado anteriormente en este libro.
El MBR está ubicado en el Sector Absoluto 0 o podemos decir en el cilindro 0, cabeza 0 y sector1. Se crea en el disco duro ejecutando el comando FDISK.EXE de DOS.
Por qué respaldar MBR:
MBR permite que el sector de arranque de la partición activa reciba el control cuando se inicia el sistema.
Después de la prueba automática de encendido (POST), el BIOS carga el MBR (registro de arranque maestro) del disco duro en la memoria y luego lo ejecuta. Primero, el MBR verifica el disco duro en busca de una partición activa, luego carga el registro de inicio de DOS (DBR) en la memoria y transfiere el control al código de inicio del sistema operativo y luego el código de registro de inicio del sistema operativo carga el resto del sistema operativo en Memoria.
Por eso podemos decir que si el MBR del disco está dañado, el disco duro está casi muerto y el sistema es completamente incapaz de arrancar o ejecutar el sistema operativo. En tal condición, todos los datos almacenados en el disco duro se vuelven inaccesibles. En general, los mensajes de error se muestran de la siguiente manera:
“Tabla de particiones no válida” “Error al cargar el sistema operativo” “Falta sistema operativo"
¿Qué se puede recuperar con la copia de seguridad de MBR?
La copia de seguridad de MBR puede ayudarlo a deshacerse de los mensajes de error anteriores. Con la copia de seguridad, se pueden corregir los siguientes problemas:
- Error al cargar el sistema operativo debido a una IPL (cargador de programa inicial) dañada
- Partición(es) primaria(s) perdida(s)
- Información de partición corrupta
- Número mágico no válido
Escribiendo el programa para hacer una copia de seguridad de MBR:
/* Programa para hacer Backup de 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);
// Abra el archivo para almacenar la copia de seguridad de 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");
//// Leer el sector de disco especificado \\\\
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Disk read from hard disk drive :
successful.\n");
/// Escriba 512 bytes de MBR en el archivo \\\\
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;
}
Comentarios sobre la codificación del programa:
En la codificación del programa dada anteriormente, básicamente estamos procediendo a realizar las siguientes tareas paso a paso:
- dinfo apunta a la estructura diskinfo_t que contiene la información de los parámetros requeridos por la operación realizada por la función _bios_disk.
- Dado que queremos leer el primer sector del disco, la ubicación del sector será la siguiente:
Parámetro |
Qué significa |
dinfo.drive = 0x80 |
Indica la unidad física 80H que es la primera unidad de disco duro. |
dinfo.head = 0 |
Apunta al número de cabeza 0 |
dinfo.track = 0 |
apunta a rastrear 0 |
dinfo.sector = 1 |
Primer sector del disquete que es sector 1 |
dinfo.sector = 1 |
>Número de sectores a considerar para la operación de lectura =1 |
dinfo.buffer = dbuf |
Búfer de datos para la operación |
- Abra una secuencia de archivos con el nombre de archivo y la ruta proporcionados por el usuario para almacenar la copia de seguridad de MBR de 512 bytes exactos. El nombre del archivo y la ruta se almacenan en el nombre de archivo de la matriz de caracteres.
- _bios_disk(_DISK_READ, &dinfo) lee el primer sector del disco duro (80H), especificado por dinfo.
- El estado devuelto se almacena en el resultado que se utiliza para mostrar el mensaje de operación exitosa o para mostrar un mensaje de error en la pantalla si ocurre algún error.
Programa para restaurar el MBR desde la copia de seguridad:
Si el MBR está dañado de alguna forma, el programa que se proporciona a continuación ayuda a restaurar el MBR Atrás.
Siempre se debe tener en cuenta que el uso ilegal o el uso por desconocimiento de este programa puede destruir la información de sus datos en el disco duro y puede hacer que todos los datos sean inaccesibles. Debes estar seguro de lo que vas a hacer. De lo contrario, puede complicar más el problema.
Programa para restaurar el MBR desde la copia de seguridad:
La codificación del programa es la siguiente:
/* Programa para restaurar la copia de seguridad de MBR desde el archivo de copia de seguridad */
#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;
/* Obtenga la entrada del usuario para la ruta del archivo de copia de seguridad 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);
}
/* Los datos MBR deben ser de 512 bytes exactos */
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;
}
Comentarios sobre la codificación del programa:
En la codificación del programa anterior, básicamente estamos procediendo a realizar las siguientes tareas paso a paso:
- dinfo apunta a la estructura diskinfo_t que contiene la información de los parámetros requeridos por la operación realizada por la función _bios_disk.
- Dado que queremos escribir en el primer sector del disco, la ubicación del sector será la siguiente:
Parámetro |
Qué significa |
dinfo.drive = 0x80 |
Indica la unidad física 80H que es la primera unidad de disco duro. |
dinfo.head = 0 |
Apunta al número de cabeza 0 |
dinfo.track = 0 |
apunta a rastrear 0 |
dinfo.sector = 1 |
Primer sector del disquete que es sector 1 |
dinfo.sector = 1 |
Número de sectores a considerar para la operación de lectura = 1 |
dinfo.buffer = dbuf |
Búfer de datos para la operación |
- El nombre del archivo y la ruta de la copia de seguridad de MBR, proporcionados por el usuario, se almacenan en el nombre de archivo de la matriz de caracteres. Debe tenerse en cuenta que la información del MBR debe ser de 512 bytes exactos.
- _bios_disk(_DISK_WRITE, &dinfo) escribe los datos en el primer sector del disco duro (80H), especificado por dinfo.
- El estado devuelto se almacena en el resultado que se utiliza para mostrar el mensaje de operación exitosa o para mostrar un mensaje de error en la pantalla si ocurre algún error.
Copia de seguridad de DBR (DOS Boot Record) y su uso
Después de la tabla de particiones, el Registro de arranque de DOS (DBR) o, a veces, llamado Sector de arranque de DOS es la segunda información más importante en su disco duro.
Para obtener un estudio detallado sobre DBR, consulte el capítulo, “Enfoque lógico de discos y SO”, analizado anteriormente en este libro.
El primer sector lógico de cada partición de DOS contendrá un registro de arranque de DOS (DBR) o un sector de arranque de DOS. El trabajo del DBR es cargar el sistema operativo desde el disco duro a la memoria principal de la computadora y dar el control del sistema al programa cargado.
El registro de arranque de DOS (DBR) para la primera partición en un disco duro generalmente se encuentra en Absolute Sector 63 (el sector 64 en la unidad de disco) o en forma CHS podemos decir C–H–S = 0–1&ndash ;1 para la mayoría de las unidades.
Sin embargo, esta ubicación puede variar según el SPT (sectores por pista) de la unidad. Por ejemplo, en una unidad antigua de 245 MB que solo tenía 31 SPT, el registro de arranque estaba ubicado en el sector 32 (sector absoluto 31).
El DBR se crea con el comando FORMAT de DOS, después de realizar la partición con el comando FDISK. El sector en el que reside DBR se convierte en el sector lógico 1 de esa partición en particular para el DOS. El número de sector utilizado por DOS comienza en el sector físico en el que se encuentra DBR.
El DBR contiene un pequeño programa que es ejecutado por el programa ejecutable Master Boot Record (MBR). Todas las particiones de DOS contienen el código del programa para iniciar la máquina, es decir, cargar el sistema operativo, pero el Registro de inicio maestro solo le da control a esa partición, que se especifica como partición activa, en la entrada de la tabla de particiones.
Por qué hacer una copia de seguridad de DBR:
El DBR contiene información importante sobre la geometría del disco. Esta información se encuentra en el primer sector de cada partición, como:
- Código de salto + NOP
- Nombre y versión del OEM
- Bytes por sector
- Sectores por clúster
- Sectores reservados
- Número de copias de FAT
- Número máximo de entradas del directorio raíz (pero no disponible para FAT32)
- Número de sectores en la partición de menos de 32 MB (por lo tanto, no disponible para FAT32)
- Descriptor de medios (F8H para discos duros)
- Sectores por FAT (en sistemas FAT anteriores y no disponible para FAT32)
- Sectores por pista
- Número de cabezas
- Número de sectores ocultos en la partición
- Número de sectores en la partición
- Número de sectores por FAT
- Indicadores de descripción de información FAT
- Versión de la unidad FAT32
- Número de clúster del inicio del directorio raíz
- Número de sector del sector de información del sistema de archivos
- Número de sector del sector de arranque de respaldo
- Reservado
- Número de unidad lógica de partición
- Firma extendida (29H)
- Número de serie de la partición
- Nombre del volumen de la partición
- Nombre FAT
- Código ejecutable
- Marcador ejecutable o número mágico (AAH 55H)
Generalmente, los siguientes mensajes de error se muestran en la pantalla:
“Error de arranque del disco”
“Disco no del sistema o error de disco”
“Disco de sistema no válido o error de E/S de disco”
“Reemplace el disco y luego presione cualquier tecla…”
¿Qué se puede recuperar con el Backup de DBR?
La copia de seguridad de DBR puede ayudarlo a deshacerse de los mensajes de error anteriores. Estos mensajes de error en la pantalla esperan a que el usuario coloque un disco de arranque con los programas mencionados anteriormente en la unidad de disquete y presione una tecla.
La unidad debe estar accesible si inicia el sistema desde el disquete o CD de inicio. Aunque el disco duro no es arrancable, generalmente eso no debería afectar el acceso a los datos de la unidad de disco. Después de iniciar el sistema con el disco de inicio, puede acceder a los datos.
Al restaurar la copia de seguridad de DBR puede superar los problemas generados, como se mencionó anteriormente.
Programas para hacer y restaurar copias de seguridad de DBR:
Los programas para hacer las copias de seguridad de los DBR y restaurarlos son casi similares a los programas de copia de seguridad y restauración de MBR.
Por ejemplo, si va a escribir los programas para hacer una copia de seguridad de DBR de la primera unidad lógica del disco y restaurarlo, los parámetros especificados por la estructura dinfo se cambiarán de la siguiente manera:
Parámetro |
Qué significa |
dinfo.drive = 0x80 |
Indica la unidad física 80H que es la primera unidad de disco duro |
dinfo.head = 1 |
Apunta al número de cabeza 1 |
dinfo.track = 0 |
apunta a rastrear 0 |
dinfo.sector = 1 |
Primer sector del disquete que es sector 1 |
dinfo.sector = 1 |
Número de sectores a considerar para la operación de lectura = 1 |
dinfo.buffer = dbuf |
Búfer de datos para la operación |
Aquí vemos que solo se cambia la ubicación del sector a leer/escribir. Aquí, el C-H-S se da como 0-1-1 ya que aquí se almacena el DBR de la primera unidad lógica.
Imagen de disco completa
Este tipo de copia de seguridad se está volviendo cada vez más popular en la actualidad y es el preferido por las organizaciones que tienen datos muy confidenciales en sus sistemas. La gente no puede correr el riesgo de perder ni un solo porcentaje de datos.
Estas organizaciones realizan sus copias de seguridad como una imagen de disco completa con regularidad. Aunque lleva algo de tiempo, le da la seguridad de que no se perderá nada. Debido a su creciente popularidad, los programadores han hecho todo lo posible para hacer que el software de creación de imágenes de disco sea cada vez más rápido para minimizar el período de tiempo que toma el proceso de creación de imágenes.
La creación de imágenes de disco es una buena idea porque con solo dedicar unas decenas de minutos puede tener la tranquilidad de tener una copia de seguridad de todo en su bolsillo. Todos los factores como MBR, BDR, FAT, directorios raíz se copian en el disco de destino tal como están.
Lo que necesitamos para crear imágenes de disco es un disco duro de destino idéntico (o casi idéntico) a nuestro disco duro de origen en el que tenemos nuestros datos valiosos. Siempre hay que tener en cuenta que el disco de destino no debe ser más pequeño que el disco de origen.
Después de tomar la imagen completa, si inicia el sistema con el disco de destino, en el que tomó la imagen del disco, generalmente obtendrá todos los datos tal como están.
Escribiendo el programa para una imagen de disco completa
El programa para imágenes de disco se ha dado a continuación. El programa utiliza las extensiones INT 13H, por lo que también puede admitir discos grandes.
El programa crea la imagen de la primera unidad de disco duro física (0x80) a la segunda unidad de disco duro física (0x81), por lo tanto, antes de realizar la imagen de respaldo, debe tener en cuenta que todos los datos en el disco de destino (0x81) se ser sobrescrito por los datos del disco de origen (0x80) en el patrón sector por sector.
La codificación del programa se ha dado a continuación:
/* Programa para hacer la Imagen del Primer Disco Duro (0x80) al segundo Disco Duro (0x81) */
#include<stdio.h>
#include<dos.h>
#include<conio.h>
/* Estructura que utilizará la función getdrivegeometry mediante la extensión INT 13H, número de función 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 */
} ;
/* Estructura del formato del paquete de dirección de disco, para ser utilizado por las funciones, readabsolutesectors y 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 */
} ;
///// Función para obtener parámetros de la unidad \\\\\
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 ) ;
/* Invocar el número de función especificado de la extensión INT 13H con valores de registro de segmento */
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder =
%lu\n", g.heads, g.spt, g.cyl);
/* Si falla la función de obtención de la geometría de la unidad, mostrar un mensaje de error y salir */
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; /* Devolver el número de sectores
en unidad */
}
////// Inicio de la 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 total no. de discos duros conectados es menos de dos Mostrar mensaje de error y salir. */
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);
}
/// Obtener parámetros del primer disco duro (0x80) \\\
Sectors_in_HDD1 = getdrivegeometry (0x80);
printf(" Total Sectors in First Hard Disk = %lu\n\n",
Sectors_in_HDD1);
/// Obtener parámetros del segundo disco Hsrd (0x81) \\\
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Total Sectors in Second Hard Disk = %lu\n\n",
Sectors_in_HDD2);
/// Primero confirme, luego continúe \\\
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);
}
/* El destino no debe ser más pequeño que el Origen */
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 todo está bien, copie todos los sectores del disco de origen al disco duro de destino */
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);
}
}
//// Mostrar el mensaje de finalización \\\
printf("\n\n Disk Imaging is Now Completed, Press any Key
To Exit...");
getch();
}
//// Fin de la principal
Comentarios sobre la codificación:
En la codificación del programa dado anteriormente, para imágenes de disco Procedemos realizando las siguientes tareas:
- La estructura, la geometría es utilizada por la función getdrivegeometry mediante la extensión INT 13H, número de función 0x48. Para obtener una descripción detallada de las extensiones INT 13H, consulte el capítulo "Manejo de discos duros grandes", analizado anteriormente en este libro.
Los tipos de datos que representan varios parámetros del disco tienen los siguientes significados:
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 estructura diskaddrpacket es utilizada por las funciones readabsolutesectors y writeabsolutesectors. El formato del paquete de direcciones de disco se proporciona en la siguiente tabla:
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 función getdrivegeometry se utiliza para obtener los parámetros de la unidad especificada. La función getdrivegeometry utiliza el número de función 0x48 de INT 13H Extensions.
El significado de los parámetros se describe en la siguiente tabla:
Parámetro |
Qué significa |
i.h.ah = 0x48 |
Número de función 0x48 de INT 13H Extensiones |
i.h.dl = drive |
Número de unidad |
i.x.si = FP_OFF ( (void far*)&g ) |
ds:si dirección al búfer para los parámetros de la unidad como se discutió anteriormente |
s.ds = FP_SEG ( (void far*)&g ) |
ds:si dirección al búfer para los parámetros de la unidad como se discutió anteriormente |
La función int86x(0x13, &i, &o, &s) invoca la interrupción 13H con valores de registro de segmento. La función getdrivegeometry devuelve el número total en la unidad.
- En la función main(), (char)peekb(0x0040, 0x0075); (la función peekb está definida en DOS.H) devuelve el número de discos duros conectados al sistema.
El número de discos duros conectados al sistema está representado por el byte almacenado en la ubicación de memoria 0040H:0075H (Segmento 0040H: Compensación 0075H). Si la cantidad de discos duros conectados al sistema es menor, dos programas muestran el mensaje de error y se cierran.
Sectors_in_HDD1 = getdrivegeometry (0x80); obtiene los parámetros del primer disco duro (0x80) y devuelve el número total de sectores en el primer disco duro.
Del mismo modo, Sectors_in_HDD2 = getdrivegeometry (0x81); obtiene los parámetros del segundo disco duro (0x81) y devuelve el número total de sectores en el segundo disco duro.
Después de la confirmación por parte del usuario para continuar con la generación de imágenes, primero verifique la condición de que el tamaño del disco duro de origen no debe ser mayor que el tamaño del disco duro de destino. Si el destino es más pequeño, muestra el mensaje de error y sal.
Si todo va bien, copie los sectores del disco de origen al disco de destino. Aquí estamos leyendo y escribiendo 61440 bytes (120 sectores con 512 bytes cada uno) a la vez para acelerar el proceso de creación de imágenes.
Si desea usar más sectores a la vez, incluso más allá del límite de 64K, puede hacerlo usando “Puntero enorme” en el modelo de memoria grande. El ejemplo de especificación es el siguiente:
gran matriz char[100000L];
- La función, readabsolutesectors ( 0x80, loop, 120, buffer ); lee los 120 sectores del primer disco duro (0x80), a partir del número de sector especificado por el bucle entero largo sin signo y almacena los datos en el búfer de datos.
- La función, writeabsolutesectors ( 0x81, loop, 120, buffer ); escribe los datos del búfer de datos en 120 sectores del segundo disco duro (0x81), comenzando desde el número de sector especificado por el bucle entero largo sin signo.
La codificación de las funciones readabsolutesectors ( ) y writeabsolutesectors ( ) se ha dado a continuación:
//// Función para leer sector(es) absoluto(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 */
/* para búfer de datos */
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 */
/* Invocar la función especificada de INT 13H con valores de registro de segmento */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /*failure */
else
return 1 ; /* success */
}
//// Función para escribir sector(es) absoluto(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 */
/* para búfer de datos */
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 ) ;
/* Invocar la función especificada de INT 13H con valores de registro de segmento */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /* failure */
else
return 1 ; /* success */
}
Comentarios sobre la codificación:
Los parámetros utilizados por ambas funciones tienen los siguientes significados:
Parámetro |
Tamaño en bytes |
Descripción |
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 |
Página modificada el: 15/01/2022