Wie man INTERNE Verlängerungen 13H in programmierendem C, wir kann die Erweiterungsfunktionen INTERNEN 13H mit den gleichen C Funktionen (int86 () verwendet, int86x () etc.) benennen, die wir in den früheren Kapiteln verwendeten. Das folgende Beispiel gibt den Fokus zu den drei Funktionen (die vorhandenen überprüfung Verlängerungen, ausgedehntes gelesen und verlängert schreiben)

Files Recovery Software
Heim Kontakt Details Customer Support Demo herunterladen Produkte  

 
 

Wie man INTERNE Verlängerungen 13H bei der C Programmierung verwendet

Wir können die Erweiterungsfunktionen INTERNEN 13H mit den gleichen C Funktionen (int86 (), int86x () etc.) benennen, die wir in den früheren Kapiteln verwendeten. Uns es durch ein Beispiel erlernen lassen.

Das folgende Beispiel gibt den Fokus zu den drei Funktionen (die vorhandenen überprüfung Verlängerungen, ausgedehntes gelesen und verlängert schreiben). Jedoch gehen wir nicht zum verlängerten Gebrauch schreiben Funktion in dieses Kapitel.

Die des Programms überprüfungen zuerst, wenn Verlängerungen gestützt werden, oder nicht wenn die Verlängerungen für INTERNES 13H anwesend sind, liest es den absoluten Sektor 0 (so MBR) der Scheibe. Die Kodierung des Programms fährt in die folgende Weise fort:

/* Programm, zum der Sektoren über 8.46 GBs hinaus mit INTERNEN 13 BIOS-Verlängerungen zugänglich zu machen */

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

/* It will be written in the same way as read_sectors function, except Function Number, which will be 0x43 in this function. We’ll discuss extended write function in next chapters.

Before Using this Function please check and verify what are you going to do. You should have the proper knowledge of what you are going to do. Use of this function in lack of knowledge or carelessly may destroy your data. */

}

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

 

Anmerkungen zur Kodierung des Programms

typedef weist dem Bezeichner der Datenart so daß typedef nicht unterzeichnetes Putzfrau Byte zu; weist Bezeichner Byte für die Datenart Putzfrau zu. Ähnlich wird Bezeichner Wort internem zugewiesen und DWord wird zugewiesen, um sich zu sehnen.

Die disk_packet Struktur wird in DS geladen: SI und der Befehl (wie ausgedehntes gelesen, verlängert etc. schreiben oder überprüfen), wird durchgeführt. Die Funktionen IBM/MS DER INTERNEN Verlängerungen 13H (die Funktion 41H sehen, zum zu arbeiten 49H) vorher gegeben.

Die check_ext_present () Funktionsüberprüfungen, wenn die Verlängerungen vorhanden/oder nicht gestützt sind. Die Funktion wird benannt mit BX=55AAH (inregs.x.bx=0x55AA;) und wenn Verlängerungen gestützt werden, wird das BX Register auf AA55H eingestellt. (Die Funktion 41H sehen, die vorher gegeben wird)

Die Funktion read_sectors wird verwendet, um den absoluten Sektor der Scheibe zu lesen, spezifiziert durch disk_pack.lba1. In diesem Programm haben wir disk_pack.lba1=0 gegeben, so werden wir den absoluten Sektor 0 lesen (die Anmerkung unten sehen), folglich gehend, das MBR der Scheibe zu lesen.

Die write_sector Funktion ist auch selbe, die die read_sectors arbeiten und in die gleiche Weise aber mit den unterschiedlichen Funktion Wahlen geschrieben werden werden. Wir verwenden sie in den folgenden Kapiteln.

Anmerkung:

Wir lasen die Scheibe Sektoren in den folgenden zwei Weisen:

  1. Relativer Sektor las (oder schreiben)
  2. Absoluter Sektor gelesen (oder schreiben)

Im relativen Sektor, der lasen wir gelesen wurde, die Scheibe Sektoren in übereinstimmung mit CHS (Zylinder, Haupt und Sektor) Geometrie der Scheibe. Im relativen Sektor, der dem MBR der Scheibe gelesen wird (erster Sektor der Scheibe) ist auf Zylinder 0, Kopf 0 und Sektor 1.

Im absoluten Messwert der Scheibe Sektoren, brauchen wir nicht, die Zylinder- oder Spurnummern in unserem Programm zu spezifizieren. Die absoluten Sektoren werden von absolutem Sektor 0 gezählt.

So, wenn wir das MBR der Scheibe (erster Sektor der Scheibe) lesen werden, werden wir absoluten Sektor 0 lesen. Es ist die Arbeit des BIOS, zum der absoluten Sektorzahl in seine entsprechende Zylinder-, Haupt- und Sektorzahl umzuwandeln.

Wie im absoluten Sektormesswert (oder im Schreiben), müssen wir nur die absoluten Sektoren innerhalb der Schleife in den Betrieben wie gesamtem Scheibe Messwert errechnen, oder Schreiben, während im Falle des relativen Sektormesswertes (oder des Schreibens), wir drei Schleifen für CHS absoluten Sektormesswert/-schreiben folglich errechnen hintereinander laufen lassen müssen, ist viel schneller als relativer Sektormesswert/-schreiben.

Z.B. wenn wir irgendeine Festplatte mit den 16 Köpfen (Seiten) haben, 12 Zylinder und mit 63 Sektoren, der Tabelle zunächst gegeben, den Erscheinen das Verfahren und Unterschied beider Lesemethoden und folglich -erscheinen, wie absolute Sektorannäherung unsere Zeit bilden kann viel, die schneller nimmt Programme (wie gesamtes Scheibe Leseschreiben oder gesamte Scheibe, die Programme etc. abwischen) zum Durchlauf:

Relatives Sektor-Ablesen

Absoluter Sektormesswert

Zylinder =0, Haupt=0, Sektor = 1

        Absoluter Sektor = 0

Zylinder =0, Haupt=0, Sektor = 2

        Absoluter Sektor = 1

Zylinder =0, Haupt=0, Sektor = 3

        Absoluter Sektor = 2

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Zylinder =0, Haupt=0, Sektor = 62

        Absoluter Sektor = 61

Zylinder =0, Haupt=0, Sektor = 63

        Absoluter Sektor = 62

Zylinder =0, Haupt=1, Sektor = 1

        Absoluter Sektor = 63

Zylinder =0, Haupt=1, Sektor = 2

        Absoluter Sektor = 64

Zylinder =0, Haupt=1, Sektor = 3

        Absoluter Sektor = 65

Zylinder =0, Haupt=1, Sektor = 4

        Absoluter Sektor = 66

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Zylinder =0, Haupt=1, Sektor = 63

        Absoluter Sektor = 125

Zylinder =0, Haupt=2, Sektor = 1

        Absoluter Sektor = 126

Zylinder =0, Haupt=2, Sektor = 2

        Absoluter Sektor = 127

Zylinder =0, Haupt=2, Sektor = 3

        Absoluter Sektor = 128

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Zylinder =0, Haupt=15, Sektor = 63

        Absoluter Sektor = 1007

Zylinder =1, Haupt=0, Sektor = 1

        Absoluter Sektor = 1008

Zylinder =1, Haupt=0, Sektor = 2

        Absoluter Sektor = 1009

Zylinder =1, Haupt=0, Sektor = 3

        Absoluter Sektor = 1010

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Zylinder =1, Haupt=0, Sektor = 63

        Absoluter Sektor = 1070

Zylinder =1, Haupt=1, Sektor = 1

        Absoluter Sektor = 1071

Zylinder =1, Haupt=1, Sektor = 2

        Absoluter Sektor = 1072

Zylinder =1, Haupt=1, Sektor = 3

        Absoluter Sektor = 1073

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Zylinder =1, Haupt=15, Sektor = 63

        Absoluter Sektor = 2015

Zylinder =2, Haupt=0, Sektor = 1

        Absoluter Sektor = 2016

Zylinder =2, Haupt=0, Sektor = 2

        Absoluter Sektor = 2017

Zylinder =2, Haupt=0, Sektor = 3

        Absoluter Sektor = 2018

                  .
                  .
                  .
                  . 

                  .
                  .
                  .
                  . 

Zylinder =11, Haupt=15, Sektor = 60

        Absoluter Sektor = 12092

Zylinder =11, Haupt=15, Sektor = 61

        Absoluter Sektor = 12093

Zylinder =11, Haupt=15, Sektor = 62

        Absoluter Sektor = 12094

Zylinder =11, Haupt=15, Sektor = 63

        Absoluter Sektor = 12095

Die Informationen der Fachtabelle von MBR, das durch jede mögliche Scheibe angezeigt wird MBR, die Werkzeug analysiert, sind unten gegeben worden:

In den oben genannten Informationen sind die relativen Sektorzahlen für das Beginnen beider Fächer 63 und 11277630 beziehungsweise, die von den Fächern frei sind und entsprechend der Zahl Sektoren gezählt, vorhanden in der Scheibe.

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
 
 
Data Recovery-Buch
 
Kapitel 1 Ein überblick über Daten-Wiederaufnahme
Kapitel 2 Einleitung der Festplatten
Kapitel 3 Logische Annäherung an Scheiben und OS
Kapitel 4 Zahlensysteme
Kapitel 5 Einleitung der C Programmierung
Kapitel 6 Einleitung in eine Computer-Grundlagen
Kapitel 7 Notwendige DOS Befehle
Kapitel 8 Scheibe-BIOS Funktionen und Unterbrechungen, die mit C anfassen
Kapitel 9 Behandlung der großen Festplatten
Kapitel 10 Daten-Wiederaufnahme von verdorbenem Floppy-Disc
Kapitel 11 Bilden der Unterstützungen
Kapitel 12 Lesenund änderndes MBR mit der Programmierung
Kapitel 13 Lesenund änderndes DBR mit der Programmierung
Kapitel 14 Programmierung für "Raw File" Wiederaufnahme
Kapitel 15 Programmierung für Daten-Wischer
Kapitel 16 Entwickeln von mehr Dienstprogrammen für Scheiben
Anlage Glossar der Daten-Wiederaufnahme Bezeichnungen
 
 
Pro Data Doctor

Heim

Produkte

Kontakt Details

Customer Support

Demo herunterladen

Allgemeine Geschäftsbedingungen

 
Pro Data Doctor