Como usar as extensões 13H INTERNAS em C que programa, nós podemos chamar as funções de extensão de 13H INTERNO com as mesmas funções de C (int86 (), int86x () etc.), que nós usávamos nos capítulos mais adiantados. O seguinte exemplo dá o foco às três funções (as extensões da verificação atuais, lida prolongada e estendido escrevem)

Data Recovery PRO DATA DOCTOR

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

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


Como usar as extensões 13H INTERNAS na programação de C

Nós podemos chamar as funções de extensão de 13H INTERNO com as mesmas funções de C (int86 (), int86x () etc.), que nós usávamos nos capítulos mais adiantados. Deixar-nos aprendê-lo por um exemplo.

O seguinte exemplo dá o foco às três funções (as extensões da verificação atuais, lida prolongada e estendido escrevem). Entretanto nós não estamos indo ao uso estendido escrevemos a função neste capítulo.

Do programa as verificações se as extensões forem suportadas ou não se as extensões estiverem atuais para 13H INTERNO, primeiramente lê o setor absoluto 0 (assim MBR) do disco. O coding do programa prosegue na seguinte maneira:

/* Programa para alcançar setores além de 8.46 GB usando 13 extensões INTERNAS do 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;

/* a estrutura do disk_packet é carregada no DS: O SI e o comando executaram */

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

/* Para suportar o disco mesmo da capacidade de 1152921504.607 GB */

DWord lba1;
DWord lba2;
}disk_pack;

/* Funcionar para verificar se as extensões forem suportadas */

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()
{

/* Escrever-se-á na mesma maneira que os read_sectors funcionam, a não ser que o número da função, que será 0x43 nesta função. Nós discutiremos prolongado escrevemos a função em capítulos seguintes.

Antes de usar esta função por favor verificar e verificar o que são você que vai fazer. Você deve ter o conhecimento apropriado de o que você está indo fazer. O uso desta função na falta do conhecimento ou descuidada pode destruir seus dados. */

}

/// 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]);
}
}

 

Comentários no Coding do programa

o typedef atribui ao identificador ao tipo de dados tais que Byte não assinado do char do typedef; atribui o Byte do identificador para o tipo de dados char. A palavra do identificador é atribuída similarmente a interno e DWord é atribuído para long.

A estrutura do disk_packet é carregada no DS: O SI e o comando (tal como lida prolongada, estendido escrever ou verificar etc.) são executados. Ver as funções das extensões 13H INTERNAS de IBM/MS (função 41H a funcionar 49H) dadas antes.

The check_ext_present() verificações de função se as extensões forem disponíveis/suportadas ou não. A função é chamada com BX=55AAH (inregs.x.bx=0x55AA;) e se as extensões forem suportadas o registo de BX é ajustado a AA55H. (Ver a função 41H dada antes)

Os read_sectors da função são usados ler o setor absoluto do disco, especificado por disk_pack.lba1. Neste programa nós demos disk_pack.lba1=0, assim nós estamos indo ler o setor absoluto 0 (ver a nota abaixo) que vai assim ler o MBR do disco.

A função do write_sector é também mesma como os read_sectors funcionam e serão escritos na mesma maneira mas com as opções diferentes da função. Nós usá-la-emos nos capítulos seguintes.

Note:

Nós lemos os setores do disco nas seguintes duas maneiras:

  1. Setor relativo lido (ou escrever)
  2. O setor absoluto leu (ou escrever)

No setor relativo lido nós lemos os setores do disco de acordo com a geometria de CHS (cilindro, principal e setor) do disco. No setor relativo lido o MBR do disco (primeiro setor do disco) está no cilindro 0, na cabeça 0 e no setor 1.

Na leitura absoluta dos setores do disco, nós não necessitamos especificar o cilindro ou os números principais em nosso programa. Os setores absolutos são contados do setor absoluto 0.

Assim se nós estivermos indo ler o MBR do disco (primeiro setor do disco), nós estamos indo ler o setor absoluto 0. É o trabalho do BIOS para converter o número absoluto do setor a seu número correspondente do cilindro, o principal e do setor.

Como na leitura absoluta do setor (ou na escrita), nós temos que calcular somente os setores absolutos dentro do laço nas operações tais como a leitura inteira do disco ou a escrita, visto que em caso da leitura relativa do setor (ou da escrita), nós necessitamos funcionar três laços de cada vez para calcular a leitura/escrita absolutas do setor de CHS conseqüentemente é muito mais rápida do que a leitura/escrita relativas do setor.

Por exemplo, se nós tivermos qualquer disco duro com as 16 cabeças (lados), 12 cilindros e com 63 setores, a tabela dada em seguida, mostras o procedimento e diferença de ambos os métodos e assim mostras da leitura como a aproximação absoluta do setor pode fazer nosso tempo que faz exame de programas (tais como a escrita inteira da leitura do disco ou o disco inteiro que limpam os programas etc.) ao funcionamento muito mais rapidamente:

Leitura relativa dos setores

Leitura absoluta do setor

Cylinder =0, Head =0, Sector = 1

        Absolute Sector = 0

Cylinder =0, Head =0, Sector = 2

        Absolute Sector = 1

Cylinder =0, Head =0, Sector = 3

        Absolute Sector = 2

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cylinder =0, Head =0, Sector = 62

        Absolute Sector = 61

Cylinder =0, Head =0, Sector = 63

        Absolute Sector = 62

Cylinder =0, Head =1, Sector = 1

        Absolute Sector = 63

Cylinder =0, Head =1, Sector = 2

        Absolute Sector = 64

Cylinder =0, Head =1, Sector = 3

        Absolute Sector = 65

Cylinder =0, Head =1, Sector = 4

        Absolute Sector = 66

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cylinder =0, Head =1, Sector = 63

        Absolute Sector = 125

Cylinder =0, Head =2, Sector = 1

        Absolute Sector = 126

Cylinder =0, Head =2, Sector = 2

        Absolute Sector = 127

Cylinder =0, Head =2, Sector = 3

        Absolute Sector = 128

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cylinder =0, Head =15, Sector = 63

        Absolute Sector = 1007

Cylinder =1, Head =0, Sector = 1

        Absolute Sector = 1008

Cylinder =1, Head =0, Sector = 2

        Absolute Sector = 1009

Cylinder =1, Head =0, Sector = 3

        Absolute Sector = 1010

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cylinder =1, Head =0, Sector = 63

        Absolute Sector = 1070

Cylinder =1, Head =1, Sector = 1

        Absolute Sector = 1071

Cylinder =1, Head =1, Sector = 2

        Absolute Sector = 1072

Cylinder =1, Head =1, Sector = 3

        Absolute Sector = 1073

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cylinder =1, Head =15, Sector = 63

        Absolute Sector = 2015

Cylinder =2, Head =0, Sector = 1

        Absolute Sector = 2016

Cylinder =2, Head =0, Sector = 2

        Absolute Sector = 2017

Cylinder =2, Head =0, Sector = 3

        Absolute Sector = 2018

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Cylinder =11, Head =15, Sector = 60

        Absolute Sector = 12092

Cylinder =11, Head =15, Sector = 61

        Absolute Sector = 12093

Cylinder =11, Head =15, Sector = 62

        Absolute Sector = 12094

Cylinder =11, Head =15, Sector = 63

        Absolute Sector = 12095

 

A informação da tabela da divisória de MBR, que é indicado por todo o disco MBR que analisa a ferramenta, foi dada abaixo:

Na informação acima, os números relativos do setor para começar de ambas as divisórias são 63 e 11277630 respectivamente, que estão livres das divisórias e são contadas de acordo com o número dos setores, disponível no 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 | 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