Πώς να χρησιμοποιήσουμε τις επεκτάσεις INT 13H στον προγραμματισμό γ, μπορούμε να καλέσουμε τις λειτουργίες επέκτασης του INT 13H με τις ίδιες λειτουργίες γ (int86(), int86x () κ.λπ....) , το οποίο χρησιμοποιούσαμε στα προηγούμενα κεφάλαια. Το ακόλουθο παράδειγμα δίνει τη σημασία στις τρεις λειτουργίες (οι επεκτάσεις ελέγχου παρούσες, εκτεινόμενες διαβασμένος και εκτεταμένες γράφουν)

Files Recovery Software
Σπίτι Στοιχεία Επικοινωνίας Εξυπηρέτηση Πελατών Κατεβάστε το Demo Προϊόντα  

 
 

Πώς να χρησιμοποιήσει τις επεκτάσεις INT 13H στον προγραμματισμό γ

Μπορούμε να καλέσουμε τις λειτουργίες επέκτασης του INT 13H με τις ίδιες λειτουργίες γ (int86(), int86x () κ.λπ....) , το οποίο χρησιμοποιούσαμε στα προηγούμενα κεφάλαια. Το μάθετε από ένα παράδειγμα.

Το ακόλουθο παράδειγμα δίνει τη σημασία στις τρεις λειτουργίες (οι επεκτάσεις ελέγχου παρούσες, εκτεινόμενες διαβασμένος και εκτεταμένες γράφουν). Εντούτοις δεν πρόκειται να χρησιμοποιήσουμε εκτεταμένος γράφουμε τη λειτουργία σε αυτό το κεφάλαιο.

Οι πρώτοι έλεγχοι προγράμματος εάν οι επεκτάσεις υποστηρίζονται ή όχι εάν οι επεκτάσεις είναι παρούσες για το INT 13H, αυτό διαβάζουν τον απόλυτο τομέα 0 (έτσι MBR) του δίσκου. Η κωδικοποίηση του προγράμματος προχωρά με τον ακόλουθο τρόπο:

/* Πρόγραμμα για να προσεγγιστούν οι τομείς πέρα από 8,46 ΜΒ χρησιμοποιώντας τις επεκτάσεις ΖΩΝΤΑΝΟΎ ΟΝΤΟΣ INT 13 */

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

/* Ορίζει το προσδιοριστικό στον τύπο στοιχείων */
typedef unsigned char Byte;
typedef unsigned int Word;
typedef unsigned long DWord;

/* disk_packet structure φορτώνεται σε DS:SI και την εντολή που εκτελούνται */

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

/* Διεύθυνση με το σχήμα :Segment Offset */
Word offset; //offset address
Word segment; //segment address

/* Για να υποστηρίξει το δίσκο ακόμη και της ικανότητας 1152921504.607 GB */

DWord lba1;
DWord lba2;
}disk_pack;

/* Λειτουργία που ελέγχει εάν οι επεκτάσεις υποστηρίζονται */

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)
{
/* Που δεν υποστηρίζεται επέκταση */
printf("\nBios extension not supported");
exit(1);
}

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

/* Επέκταση παρούσα */
printf("\nExtended I/O supported");
}

/* Λειτουργία για να διαβάσει τον τομέα */

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

/* αίτημα για MBR του σκληρού δίσκου 1 */
/* Διαβάστε τον απόλυτο τομέα 0 */

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

/* Require(kanonjka' οδηγούμε < 2,1 T.B) για να θέσουμε μόνο αυτό */

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");
}

//// Γράψτε τη λειτουργία τομέα \\\\

void write_sector()
{

/* Θα γραφτεί με τον ίδιο τρόπο όπως τα read_sectors λειτουργούν, εκτός από τον αριθμό λειτουργίας, ο οποίος θα είναι 0x43 σε αυτήν την λειτουργία. Θα συζητήσουμε εκτεταμένος γράφουμε τη λειτουργία στα επόμενα κεφάλαια.

Πρίν χρησιμοποιεί αυτήν την λειτουργία παρακαλώ ελέγξτε και ελέγξτε αυτό που είναι εσείς που πηγαίνετε να κάνει. Πρέπει να έχετε την κατάλληλη γνώση αυτού που πρόκειται να κάνετε. Η χρήση αυτής της λειτουργίας στην έλλειψη γνώσης ή μπορεί απρόσεκτα να καταστρέψει τα στοιχεία σας. */

}

/// Κύρια λειτουργία \\\\
void main()
{
int i=0;

/* απομονωτής για να κρατήσει MBR */
Byte mbr[512];
clrscr();

/* έλεγχος για την επέκταση ΖΩΝΤΑΝΟΥ ΟΝΤΟΣ παρούσα */
check_ext_present();

/* διαβάστε τον τομέα */
read_sectors(&mbr);

printf("\n\n Data of MBR \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* επιδείξτε τον απομονωτή MBR */
printf("%c",mbr[i]);
}
}

 

Σχόλια στην κωδικοποίηση του προγράμματος

typedef ορίζει το προσδιοριστικό στον τύπο στοιχείων έτσι ώστε typedef ανυπόγραφη ψηφιολέξη προσροφητικών ανθράκων ορίζει την ψηφιολέξη προσδιοριστικών για τον προσροφητικό άνθρακα τύπων στοιχείων. Ομοίως το προσδιοριστικό Word ορίζεται στο INT και DWord ορίζεται πολύ.

Η δομή disk_packet φορτώνεται σε DS:SI και την εντολή (όπως εκτεινόμενος διαβασμένος, εκτεταμένος γράψτε ή ελέγξτε κ.λπ....) εκτελείται. Δείτε τις λειτουργίες των επεκτάσεων της ΙΒΜ/κρατών μελών INT 13H (λειτουργία 41H για να λειτουργήσει 49H) που δίνονται πριν.

Οι check_ext_present έλεγχοι λειτουργίας () εάν οι επεκτάσεις είναι διαθέσιμες/υποστηριγμένες ή όχι. Η λειτουργία καλείται με BX=55AAH (inregs.x.bx=0x55AA) και εάν οι επεκτάσεις υποστηρίζονται ο κατάλογος BX τίθεται AA55H. (Βλ. τη λειτουργία 41H που δίνεται πριν)

Τα read_sectors λειτουργίας χρησιμοποιούνται για να διαβάσουν τον απόλυτο τομέα του δίσκου, καθορισμένο από disk_pack.lba1. Σε αυτό το πρόγραμμα έχουμε δώσει disk_pack.lba1=0, κατά συνέπεια πρόκειται να διαβάσουμε τον απόλυτο τομέα 0 (Δείτε τη σημείωση κατωτέρω) πηγαίνοντας έτσι να διαβάσουμε το MBR του δίσκου.

Η λειτουργία write_sector είναι επίσης ίδια όπως τα read_sectors λειτουργούν και θα γραφτούν με τον ίδιο τρόπο αλλά με τις διαφορετικές επιλογές λειτουργίας. Θα τον χρησιμοποιήσουμε στα επόμενα κεφάλαια.

Note:

Διαβάζουμε τους τομείς των δίσκων με τους ακόλουθους δύο τρόπους:

  1. Σχετικός τομέας που διαβάζεται (ή γράψτε)
  2. Απόλυτος τομέας που διαβάζεται (ή γράψτε)

Στο σχετικό τομέα που διαβάζεται διαβάζουμε τους τομείς των δίσκων σύμφωνα με (κύλινδρος, κεφάλι και τομέας) τη γεωμετρία CHS του δίσκου. Στο σχετικό τομέα που διαβάζεται το MBR του δίσκου (πρώτος τομέας του δίσκου) είναι στον κύλινδρο 0, το κεφάλι 0 και τον τομέα 1.

Στην απόλυτη ανάγνωση των τομέων των δίσκων, δεν πρέπει να διευκρινίσουμε τον κύλινδρο ή τους επικεφαλής αριθμούς στο πρόγραμμά μας. Οι απόλυτοι τομείς μετριούνται από τον απόλυτο τομέα 0.

Κατά συνέπεια εάν πρόκειται να διαβάσουμε το MBR του δίσκου (πρώτος τομέας του δίσκου), πρόκειται να διαβάσουμε τον απόλυτο τομέα 0. Είναι η εργασία του ΖΩΝΤΑΝΟΥ ΟΝΤΟΣ για να μετατρέψει τον απόλυτο αριθμό τομέα στον αντίστοιχους κύλινδρο, το κεφάλι και τον αριθμό τομέα του.

Όπως στην απόλυτη ανάγνωση τομέα (ή γράψιμο), πρέπει να υπολογίσουμε μόνο τους απόλυτους τομείς μέσα στο βρόχο στις διαδικασίες όπως η ολόκληρη ανάγνωση δίσκων ή γράφοντας, ενώ σε περίπτωση σχετικής ανάγνωσης τομέα (ή γράψιμο), πρέπει να τρέξουμε τρεις βρόχους τη φορά για τον υπολογισμό CHS επομένως η απόλυτη ανάγνωση τομέα/το γράψιμο είναι πολύ γρηγορότερες από τη σχετική ανάγνωση τομέα/γράψιμο.

Παραδείγματος χάριν, εάν έχουμε οποιοδήποτε σκληρό δίσκο με τα 16 κεφάλια (πλευρές), 12 κύλινδροι και με 63 τομείς, ο πίνακας που δίνεται έπειτα, παρουσιάζουν τη διαδικασία και διαφορά και των μεθόδων ανάγνωσης και επιδεικνύουν έτσι πώς η απόλυτη προσέγγιση τομέα μπορεί να βρεί το χρόνο μας που παίρνει τα προγράμματα (όπως η ολόκληρο ανάγνωση δίσκων/το γράψιμο ή τα ολόκληρα προγράμματα σκουπίσματος δίσκων κ.λπ....) για να τρέξει πολύ γρηγορότερα:

Σχετική ανάγνωση τομέων

Απόλυτη ανάγνωση τομέα

Κύλινδρος = 0, κεφάλι = 0, τομέας = 1

Απόλυτος τομέας = 0

Κύλινδρος = 0, κεφάλι = 0, τομέας = 2

Απόλυτος τομέας = 1

Κύλινδρος = 0, κεφάλι = 0, τομέας = 3

Απόλυτος τομέας = 2

.
.
.
.

.
.
.
.

Κύλινδρος = 0, κεφάλι = 0, τομέας = 62

Απόλυτος τομέας = 61

Κύλινδρος = 0, κεφάλι = 0, τομέας = 63

Απόλυτος τομέας = 62

Κύλινδρος = 0, κεφάλι = 1, τομέας = 1

Απόλυτος τομέας = 63

Κύλινδρος = 0, κεφάλι = 1, τομέας = 2

Απόλυτος τομέας = 64

Κύλινδρος = 0, κεφάλι = 1, τομέας = 3

Απόλυτος τομέας = 65

Κύλινδρος = 0, κεφάλι = 1, τομέας = 4

Απόλυτος τομέας = 66

.
.
.
.

.
.
.
.

Κύλινδρος = 0, κεφάλι = 1, τομέας = 63

Απόλυτος τομέας = 125

Κύλινδρος = 0, κεφάλι = 2, τομέας = 1

Απόλυτος τομέας = 126

Κύλινδρος = 0, κεφάλι = 2, τομέας = 2

Απόλυτος τομέας = 127

Κύλινδρος = 0, κεφάλι = 2, τομέας = 3

Απόλυτος τομέας = 128

.
.
.
.

.
.
.
.

Κύλινδρος = 0, κεφάλι = 15, τομέας = 63

Απόλυτος τομέας = 1007

Κύλινδρος = 1, κεφάλι = 0, τομέας = 1

Απόλυτος τομέας = 1008

Κύλινδρος = 1, κεφάλι = 0, τομέας = 2

Απόλυτος τομέας = 1009

Κύλινδρος = 1, κεφάλι = 0, τομέας = 3

Απόλυτος τομέας = 1010

.
.
.
.

.
.
.
.

Κύλινδρος = 1, κεφάλι = 0, τομέας = 63

Απόλυτος τομέας = 1070

Κύλινδρος = 1, κεφάλι = 1, τομέας = 1

Απόλυτος τομέας = 1071

Κύλινδρος = 1, κεφάλι = 1, τομέας = 2

Απόλυτος τομέας = 1072

Κύλινδρος = 1, κεφάλι = 1, τομέας = 3

Απόλυτος τομέας = 1073

.
.
.
.

.
.
.
.

Κύλινδρος = 1, κεφάλι = 15, τομέας = 63

Απόλυτος τομέας = 2015

Κύλινδρος = 2, κεφάλι = 0, τομέας = 1

Απόλυτος τομέας = 2016

Κύλινδρος = 2, κεφάλι = 0, τομέας = 2

Απόλυτος τομέας = 2017

Κύλινδρος = 2, κεφάλι = 0, τομέας = 3

Απόλυτος τομέας = 2018

.
.
.
.

.
.
.
.

Κύλινδρος = 11, κεφάλι = 15, τομέας = 60

Απόλυτος τομέας = 12092

Κύλινδρος = 11, κεφάλι = 15, τομέας = 61

Απόλυτος τομέας = 12093

Κύλινδρος = 11, κεφάλι = 15, τομέας = 62

Απόλυτος τομέας = 12094

Κύλινδρος = 11, κεφάλι = 15, τομέας = 63

Απόλυτος τομέας = 12095

 

Οι πληροφορίες του πίνακα χωρισμάτων MBR, που επιδεικνύεται από οποιοδήποτε δίσκο MBR που αναλύει το εργαλείο, έχουν δοθεί κατωτέρω:

Στις ανωτέρω πληροφορίες, οι σχετικοί αριθμοί τομέα για την έναρξη και των δύο χωρισμάτων είναι 63 και 11277630 αντίστοιχα, τα οποία είναι απαλλαγμένα από τα χωρίσματα και μετριούνται σύμφωνα με τον αριθμό τομέων, διαθέσιμος στο δίσκο.


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


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

Next page

 
 
Data Recovery Book
 
Κεφάλαιο 1 Μια επισκόπηση της αποκατάστασης στοιχείων
Κεφάλαιο 2 Εισαγωγή των σκληρών δίσκων
Κεφάλαιο 3 Λογική προσέγγιση στους δίσκους και το OS
Κεφάλαιο 4 Συστήματα αριθμού
Κεφάλαιο 5 Εισαγωγή του προγραμματισμού γ
Κεφάλαιο 6 Εισαγωγή στα βασικά υπολογιστών
Κεφάλαιο 7 Απαραίτητες εντολές DOS
Κεφάλαιο 8 Δίσκος-ζωντανό ον λειτουργεί και διακόπτει το χειρισμό με το γ
Κεφάλαιο 9 Διαχειριζόμενοι μεγάλοι σκληροί δίσκοι
Κεφάλαιο 10 Αποκατάσταση στοιχείων από την αλλοιωμένη δισκέτα
Κεφάλαιο 11 Παραγωγή των στηριγμάτων
Κεφάλαιο 12 Ανάγνωση και τροποποίηση MBR με τον προγραμματισμό
Κεφάλαιο 13 Ανάγνωση και τροποποίηση DBR με τον προγραμματισμό
Κεφάλαιο 14 Προγραμματισμός για την αποκατάσταση "ακατέργαστων αρχείων"
Κεφάλαιο 15 Προγραμματισμός για τις ψήκτρες στοιχείων
Κεφάλαιο 16 Ανάπτυξη περισσότερων χρησιμοτήτων για τους δίσκους
Προσάρτημα Γλωσσάριο όρων αποκατάστασης στοιχείων
 
 
Pro Data Doctor

Σπίτι

Προϊόντα

Στοιχεία Επικοινωνίας

Εξυπηρέτηση Πελατών

Κατεβάστε το Demo

Όροι και Προϋποθέσεις

 
Pro Data Doctor