Cómo utilizar las extensiones INTERNAS 13H en C que programa, podemos llamar las funciones de extensión de 13H INTERNO con las mismas funciones de C (int86 (), int86x () etc.), que utilizábamos en los capítulos anteriores. El ejemplo siguiente da el foco a las tres funciones (las extensiones del cheque presentes, haber leído extendida y haber extendido escriben)

Data Recovery PRO DATA DOCTOR

Home | Order Online | Downloads | Contact Us | Software Knowledgebase

it | es | pt | fr | de | jp | kr | cn | ru | nl | gr


Cómo utilizar las extensiones INTERNAS 13H en la programación de C

Podemos llamar las funciones de extensión de 13H INTERNO con las mismas funciones de C (int86 (), int86x () etc.), que utilizábamos en los capítulos anteriores. Aprendámoslo por un ejemplo.

El ejemplo siguiente da el foco a las tres funciones (las extensiones del cheque presentes, haber leído extendida y haber extendido escriben). Sin embargo no vamos al uso ampliado escribimos la función en este capítulo.

Del programa los cheques si se apoyan las extensiones o no si las extensiones están presentes para 13H INTERNO, primero lee el sector absoluto 0 (así MBR) del disco. La codificación del programa procede de la manera siguiente:

/* Programa para tener acceso a sectores más allá de 8.46 GB usando 13 extensiones INTERNAS del BIOS */

#include<stdio.h>
#include<dos.h>

/* Assigns the identifier to the data type */
typedef unsigned char Byte;
typedef unsigned int Word;
typedef unsigned long DWord;

/* disk_packet structure is loaded in DS:SI and command executed */

struct disk_packet
{
Byte size_pack; // Size of packet must be 16 or 16+
Byte reserved1; // Reserved
Byte no_of_blocks;// Number of blocks for transfer
Byte reserved2; // Reserved

/* Address in Segment:Offset format */
Word offset; //offset address
Word segment; //segment address

/* To Support the Disk Even of Capacity of 1152921504.607 GB */

DWord lba1;
DWord lba2;
}disk_pack;

/* Function to check if the Extensions are supported */

void check_ext_present()
{
union REGS inregs, outregs; /* Input Registers and
Output */
inregs.h.ah=0x41; /* Function to Check
Extension Present */
inregs.x.bx=0x55AA;
inregs.h.dl=0x80; /* Drive No for first Hard Disk */

int86(0x13,&inregs,&outregs); /*Call interrupt */

if(outregs.x.cflag)
{
/* Extension Not Supported */
printf("\nBios extension not supported");
exit(1);
}

if(outregs.x.bx==0xAA55)
if(outregs.x.cx & 0x1)

/* Extension Present */
printf("\nExtended I/O supported");
}

/* Function to read the Sector */

void read_sectors(void *buffer)
{
union REGS inregs, outregs; /* Input and Output
Registers */
struct SREGS segregs; // Segment Registers
disk_pack.size_pack=16; // Set size to 16
disk_pack.no_of_blocks=1; // One block
disk_pack.reserved1=0; // Reserved Word
disk_pack.reserved2=0; // Reserved Word
disk_pack.segment=FP_SEG(buffer);// Segment of buffer
disk_pack.offset=FP_OFF(buffer); // Offset of buffer

/* request for MBR of hard disk 1 */
/* Read Absolute sector 0 */

disk_pack.lba1=0; /* LBA address, Contains first
32 bits */

/* We normally require( drives < 2.1 T.B) to set
only this */

disk_pack.lba2=0; // Last 32 bit address
inregs.h.ah=0x42; // Function to read
inregs.h.dl=0x80; // Drive Number for First Hard Disk inregs.x.si = FP_OFF(&disk_pack); /*Make DS:SI point
to disk_pack */
segregs.ds = FP_SEG(&disk_pack);

/* Call Interrupt */
int86x(0x13,&inregs,&outregs,&segregs);

if(outregs.x.cflag)
printf("\n\nError %d\n",outregs.h.ah);
else
printf("\n\nI hope Everything is all Right");
}

//// Write Sector Function \\\\

void write_sector()
{

/* Será escrito de la misma forma que funcionan los read_sectors, a menos que el número de la función, que será 0x43 en esta función. Discutiremos extendido escribimos la función en los capítulos siguientes.

Antes de usar esta función comprobar y verificar por favor cuáles son tú que va a hacer. Debes tener el conocimiento apropiado de lo que vas a hacer. El uso de esta función en la carencia del conocimiento o puede destruir negligentemente tus datos.*/

}

/// Main Function \\\\
void main()
{
int i=0;

/* buffer to hold MBR */
Byte mbr[512];
clrscr();

/* check for BIOS extension present */
check_ext_present();

/* read sector */
read_sectors(&mbr);

printf("\n\n Data of MBR \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* display the MBR buffer */
printf("%c",mbr[i]);
}
}

 

Comentarios sobre la codificación del programa

el typedef asigna a identificador al tipo de datos tales que octeto sin firmar del carbón del typedef; asigna el octeto del identificador para el tipo de datos carbón. La palabra del identificador se asigna semejantemente a interno y DWord se asigna para desear.

La estructura del disk_packet se carga en el DS: Se ejecuta el SI y el comando (tal como haber leído extendida, extendido escribir o verificar el etc.). Ver las funciones de las extensiones INTERNAS 13H de IBM/MS (función 41H a funcionar 49H) dadas antes.

Los controles de funcionamiento check_ext_present () si las extensiones son disponibles/apoyadas o no. La función se llama con BX=55AAH (inregs.x.bx=0x55AA;) y si se apoyan las extensiones el registro de BX se fija a AA55H. (Véase la función 41H dada antes)

Los read_sectors de la función se utilizan para leer el sector absoluto del disco, especificado por disk_pack.lba1. En este programa hemos dado disk_pack.lba1=0, así vamos a leer el sector absoluto 0 (véase la nota abajo) que va así a leer el MBR del disco.

La función del write_sector es también igual que los read_sectors funcionan y serán escritos de la misma forma pero con las diversas opciones de la función. La utilizaremos en los capítulos siguientes.

Nota:

Leímos los sectores del disco de las dos maneras siguientes:

  1. Sector relativo leído (o escribir)
  2. El sector absoluto leyó (o escribir)

En el sector relativo leído leímos los sectores del disco de acuerdo con la geometría de CHS (cilindro, principal y sector) del disco. En el sector relativo leído el MBR del disco (primer sector del disco) está en el cilindro 0, la cabeza 0 y el sector 1.

En la lectura absoluta de los sectores del disco, no necesitamos especificar el cilindro o los números principales en nuestro programa. Los sectores absolutos se cuentan del sector absoluto 0.

Así si vamos a leer el MBR del disco (primer sector del disco), vamos a leer el sector absoluto 0. Es el trabajo del BIOS para convertir el número absoluto del sector a su número correspondiente del cilindro, principal y del sector.

Como en la lectura absoluta del sector (o la escritura), tenemos que calcular solamente los sectores absolutos dentro del lazo en las operaciones tales como lectura entera del disco o la escritura, mientras que en caso de la lectura relativa del sector (o de la escritura), necesitamos funcionar tres lazos a la vez para calcular la lectura/la escritura absolutas del sector de CHS por lo tanto es mucho más rápida que la lectura/la escritura relativas del sector.

Por ejemplo, si tenemos cualquier disco duro con las 16 cabezas (lados), 12 cilindros y con 63 sectores, la tabla dada después, demostraciones el procedimiento y la diferencia de los ambos los métodos y así demostraciones de la lectura cómo el acercamiento absoluto del sector puede hacer nuestro tiempo que lleva programas (tales como escritura entera de la lectura del disco o disco entero que limpia los programas etc.) el funcionamiento mucho más rápidamente:

Lectura relativa de los sectores

Lectura absoluta del sector

Cilindro =0, =0 principal, sector = 1

        Sector absoluto = 0

Cilindro =0, =0 principal, sector = 2

        Sector absoluto = 1

Cilindro =0, =0 principal, sector = 3

        Sector absoluto = 2

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cilindro =0, =0 principal, sector = 62

        Sector absoluto = 61

Cilindro =0, =0 principal, sector = 63

        Sector absoluto = 62

Cilindro =0, =1 principal, sector = 1

        Sector absoluto = 63

Cilindro =0, =1 principal, sector = 2

        Sector absoluto = 64

Cilindro =0, =1 principal, sector = 3

        Sector absoluto = 65

Cilindro =0, =1 principal, sector = 4

        Sector absoluto = 66

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cilindro =0, =1 principal, sector = 63

        Sector absoluto = 125

Cilindro =0, =2 principal, sector = 1

        Sector absoluto = 126

Cilindro =0, =2 principal, sector = 2

        Sector absoluto = 127

Cilindro =0, =2 principal, sector = 3

        Sector absoluto = 128

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cilindro =0, =15 principal, sector = 63

        Sector absoluto = 1007

Cilindro =1, =0 principal, sector = 1

        Sector absoluto = 1008

Cilindro =1, =0 principal, sector = 2

        Sector absoluto = 1009

Cilindro =1, =0 principal, sector = 3

        Sector absoluto = 1010

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cilindro =1, =0 principal, sector = 63

        Sector absoluto = 1070

Cilindro =1, =1 principal, sector = 1

        Sector absoluto = 1071

Cilindro =1, =1 principal, sector = 2

        Sector absoluto = 1072

Cilindro =1, =1 principal, sector = 3

        Sector absoluto = 1073

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cilindro =1, =15 principal, sector = 63

        Sector absoluto = 2015

Cilindro =2, =0 principal, sector = 1

        Sector absoluto = 2016

Cilindro =2, =0 principal, sector = 2

        Sector absoluto = 2017

Cilindro =2, =0 principal, sector = 3

        Sector absoluto = 2018

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cilindro =11, =15 principal, sector = 60

        Sector absoluto = 12092

Cilindro =11, =15 principal, sector = 61

        Sector absoluto = 12093

Cilindro =11, =15 principal, sector = 62

        Sector absoluto = 12094

Cilindro =11, =15 principal, sector = 63

        Sector absoluto = 12095

 

La información de la tabla de la partición de MBR, que es exhibido por cualquier disco MBR que analiza la herramienta, se ha dado abajo:

En la información antedicha, los números relativos del sector para comenzar de ambas particiones son 63 y 11277630 respectivamente, que están libres de particiones y se cuentan según el número de sectores, disponible en disco.

Sample Chapters from book DATA RECOVERY WITH AND WITHOUT PROGRAMMING by Author Tarun Tyagi
Data Recovery with & without Programming


Publishers of the Book
Number of Pages
ISBN
Price of the Book


BPB Publications, New Delhi, India
540
81-7656-922-4
$69.00 (Including Shipping Charges, Cost of Book and Other expenses, Free Source Code CD included with the Book)





Buy Data recovery Book

Previous page

page 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20

 

 

Chapter 10


page 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20


page 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33

Next page

© Copyright 2002-2005 DataDoctor.Biz

Home | Contact us | Downloads | Services | Resources | Terms and conditions | Site map

Website Data Recovery | recuperación de Datos | Récupération de données | Datenrettung | Recupero dati | データ復旧 | 데이터 복구 | 数据恢复 | Восстановление данных | De terugwinning van gegevens | Ανάκτηση δεδομένων
Sitemap Site map1 2 3 4 | Spanish1 2 3 | French1 2 3 | German1 2 3 | Italian1 2 3 | Portuguese1 2 3 | Japanese1 2 3 | Korean1 2 3 | Chinese1 2 3 | Russian1 2 3 | Dutch1 2 3 | Greek1 2 3
Data Recovery Book English | Spanish | French | German | Italian | Portuguese | Japanese | Korean | Chinese | Russian | Dutch | Greek