Κεφάλαιο – 14
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΙΑ ΑΝΑΚΤΗΣΗ ΑΚΑΤΕΡΓΑΣΤΩΝ ΑΡΧΕΙΩΝ
Ανάκτηση ακατέργαστων αρχείων
Υπάρχουν πολλοί συγκεκριμένοι τύποι αρχείων που έχουν μια συγκεκριμένη ακολουθία ή συνδυασμό χαρακτήρων γραμμένο στην αρχή και στο τέλος του αρχείου. Μπορούμε εύκολα να αναλύσουμε αυτούς τους συνδυασμούς χρησιμοποιώντας οποιοδήποτε πρόγραμμα επεξεργασίας δίσκου. Μπορούμε επίσης να χρησιμοποιήσουμε την εντολή EDIT DOS για να εξετάσουμε τη δομή ενός αρχείου ASCII.
Μια συγκεκριμένη ακολουθία ή συνδυασμός χαρακτήρων που υπάρχουν στην αρχή ενός αρχείου ονομάζεται συνήθως κεφαλίδα και μια ακολουθία ή συνδυασμός χαρακτήρων που αποθηκεύεται στο τέλος ενός αρχείου ονομάζεται υποσέλιδο του αρχείου.
Εάν έχουμε χάσει τα δεδομένα μας σε τέτοιου είδους αποτυχία δίσκου που δεν υπάρχουν πληροφορίες FAT ή ριζικού καταλόγου για ανάκτηση δεδομένων, μπορούμε να χρησιμοποιήσουμε κεφαλίδες και υποσέλιδα για να βρούμε αυτούς τους συγκεκριμένους τύπους αρχείων. Η κεφαλίδα υποδεικνύει την αρχή ενός αρχείου αυτού του συγκεκριμένου τύπου αρχείου και το υποσέλιδο υποδεικνύει το τέλος ενός αρχείου αυτού του συγκεκριμένου τύπου αρχείου.
Εδώ χρησιμοποιούμε την ακατέργαστη δομή ενός συγκεκριμένου τύπου αρχείου για την ανάκτηση δεδομένων, επομένως η μέθοδος ανάκτησης ονομάζεται Ανάκτηση ακατέργαστου αρχείου. Η επιφάνεια του δίσκου σαρώνεται ανά τομέα για την εύρεση πληροφοριών κεφαλίδας και υποσέλιδου.
Αν και το Raw File Recovery μπορεί να έχει ένα ευρύ φάσμα εφαρμογών, υπάρχουν ορισμένες ειδικές περιπτώσεις ανάκτησης όπου μπορεί να βοηθήσει πολύ. Για παράδειγμα, κατά λάθος, εάν εκτελέσετε οποιοδήποτε πρόγραμμα διαγραφής δεδομένων σε έναν δίσκο που είχε μερικά σημαντικά αρχεία, αλλά μέχρι να σταματήσετε το πρόγραμμα, όλες οι πληροφορίες MBR, DBR, FAT και ριζικού καταλόγου, συμπεριλαμβανομένων των αρχείων του λειτουργικού συστήματος, θα διαγραφούν.
Σε αυτήν την περίπτωση, ακόμη και τα προγράμματα ανάκτησης μορφοποίησης ενδέχεται να μην σας βοηθήσουν να ανακτήσετε δεδομένα. Εδώ μπορείτε να χρησιμοποιήσετε το Raw file Recovery για να ανακτήσετε αρχεία αυτών των συγκεκριμένων τύπων αρχείων κάνοντας αναζήτηση σε κεφαλίδες και υποσέλιδα.
Όχι μόνο αυτό, μπορείτε ακόμη και να ανακτήσετε δεδομένα σε περιπτώσεις όπου έχετε σκληρό δίσκο όπου έχετε διαγράψει όλα τα λογικά διαμερίσματα της μονάδας δίσκου, έχετε δημιουργήσει εκ νέου διαμερίσματα διαφορετικού μεγέθους από πριν και έχετε εγκαταστήσει ακόμη και ένα λειτουργικό σύστημα.
Τώρα λαμβάνετε τη μνήμη ότι είχατε κάποια σημαντικά δεδομένα στο δίσκο πριν από την κατάτμηση και τη μορφοποίησή του. Εάν μόλις εγκαταστήσατε το λειτουργικό σύστημα, υπάρχει μεγάλη πιθανότητα να ανακτηθεί το αρχείο.
Παράγοντες που επηρεάζουν την απόδοση ανάκτησης πρωτογενών αρχείων είναι τα κατακερματισμένα δεδομένα και ο όγκος των δεδομένων που αντικαθίστανται από άλλα δεδομένα. Ωστόσο, μπορείτε να βρείτε όλο και περισσότερες εφαρμογές για ανάκτηση ακατέργαστων αρχείων μόνοι σας.
Η διαδικασία ή σχεδόν οι κανόνες για την αναζήτηση αρχείων με χρήση λογισμικού ανάκτησης ακατέργαστων αρχείων λαμβάνουν υπόψη τις ακόλουθες συνθήκες:
- Αναζητήστε μια κεφαλίδα αρχείου ή πολλούς τύπους αρχείων ταυτόχρονα σε τομείς δίσκου.
- Εάν βρεθεί κάποια κεφαλίδα τύπου αρχείου, αποθηκεύστε τα δεδομένα στο αρχείο και ελέγξτε τις ακόλουθες τέσσερις συνθήκες για να κλείσετε και να αποθηκεύσετε το αρχείο.
- Βρέθηκε υποσέλιδο αυτού του τύπου αρχείου
- Βρέθηκε άλλη κεφαλίδα του ίδιου τύπου αρχείου.
- Βρέθηκε κεφαλίδα διαφορετικού τύπου αρχείου
- Δεν βρέθηκαν άλλες κεφαλίδες ή υποσέλιδα για ορισμένους τύπους αρχείων στο πρόγραμμα και το μέγεθος αρχείου για το οποίο αποθηκεύετε τα δεδομένα φτάνει το μέγιστο όριο μεγέθους που έχετε ορίσει για το μέγεθος αρχείου στο πρόγραμμά σας.
Οι πληροφορίες πρέπει να αποθηκευτούν στο αρχείο, συμπεριλαμβανομένων των δεδομένων τομέα όπου βρήκατε την κεφαλίδα και το υποσέλιδο του τύπου αρχείου.
Κεφαλίδες και υποσέλιδα ορισμένων σημαντικών τύπων αρχείων
Οι κεφαλίδες και τα υποσέλιδα ορισμένων σημαντικών τύπων αρχείων παρατίθενται στον παρακάτω πίνακα. Τα υποσέλιδα που αναφέρονται στον πίνακα βρίσκονται είτε στο τέλος του αρχείου του καθορισμένου τύπου αρχείου είτε στις τελικές μετατοπίσεις του αρχείου, ώστε να μπορείτε να τα χρησιμοποιήσετε ως υποσέλιδα για την ανάκτηση δεδομένων.
Μπορείτε επίσης να αναζητήσετε μόνοι σας κεφαλίδες και υποσέλιδα εκτός από αυτούς τους τύπους αρχείων χρησιμοποιώντας την εντολή DOS EDIT ή χρησιμοποιώντας οποιοδήποτε εργαλείο επεξεργασίας δίσκου. Χρησιμοποίησα δεκαεξαδικό σύστημα για να αναπαραστήσω τις πληροφορίες για να τις κάνω πιο κατανοητές.
Επέκταση |
Κεφαλίδα (δεκαεξαδική) |
Υποσέλιδο (Hex) |
DOC |
D0 CF 11 E0 A1 B1 1A E1 |
57 6F 72 64 2E 44 6F 63 75 6G 65 6E 74 2E |
XLS |
D0 CF 11 E0 A1 B1 1A E1 |
FE FF FF FF 00 00 00 00 00 00 00 00 57 00 6F 00 72 00 6B 00 62 00 6F 00 6F 00 6B 00 |
PPT |
D0 CF 11 E0 A1 B1 1A E1 |
50 00 6F 00 77 00 65 00 72 00 50 00 6F 00 69 00 6E 00 74 00 20 00 44 00 6F 00 63 00 75 00 65 00 00 65 00 00 |
Ταχυδρομικός κώδικας |
50 4B 03 04 14 |
50 4B 05 06 00 |
JPG |
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 |
D9 ("Καλύτερα να χρησιμοποιήσετε έλεγχο μεγέθους αρχείου") |
GIF |
47 49 46 38 39 61 4E 01 53 00 C4 |
21 00 00 3B 00 |
PDF |
25 50 44 46 2D 31 2E |
25 25 45 4F 46 |
Σύνταξη προγράμματος για την ανάκτηση ακατέργαστων αρχείων
Παρακάτω ακολουθεί η κωδικοποίηση του προγράμματος για την ανάκτηση ακατέργαστων αρχείων των αρχείων Microsoft Word (επέκταση .DOC). Το πρόγραμμα αναζητά αρχεία σε τομείς δίσκων και αποθηκεύει αυτόματα το ανακτημένο αρχείο, δημιουργώντας αυτόματα ένα όνομα αρχείου.
Η διαδρομή που καθορίζεται από τον χρήστη για την αποθήκευση των αρχείων χρησιμοποιείται ως διαδρομή προορισμού για την αποθήκευση των ανακτημένων δεδομένων. Εάν ο κατάλογος προορισμού δεν υπάρχει, το πρόγραμμα μπορεί να τον δημιουργήσει μέχρι ένα επίπεδο καταλόγου.
Το λογισμικό ανάκτησης που παρέχεται εδώ υποστηρίζει ακόμη και μεγάλους δίσκους για αναζήτηση και ανάκτηση δεδομένων. Το πρόγραμμα γράφτηκε για την αναζήτηση δεδομένων σε έναν δεύτερο φυσικό σκληρό δίσκο.
/* Λογισμικό ανάκτησης αρχείων Microsoft Word RAW */
#include<stdio.h>
#include<dos.h>
/* Δομή που χρησιμοποιείται από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, αριθμός συνάρτησης 0x48. */
δομική γεωμετρία
{
ανυπόγραφο μέγεθος int ; /* (κλήση) μέγεθος buffer */
ανυπόγραφες σημαίες int ; /* Σημαίες πληροφοριών */
ανυπόγραφο μακρύ κύλινδρο ; /* Αριθμός φυσικών
Κύλινδροι στον κινητήρα */
ανυπόγραφες μεγάλες κεφαλίδες ;/* Αριθμός φυσικών
Τα κεφάλια στο δίσκο */
ανυπόγραφο long spt ; /* Αριθμός φυσικών
Τομείς ανά κομμάτι */
ανυπόγραφος μακρύς τομέας[2] ; /* Συνολική ποσότητα
Τομείς στο δίσκο */
ανυπόγραφο int bps ; /* Byte ανά τομέα */
} ;
/* Δομή μορφής πακέτου διεύθυνσης δίσκου που χρησιμοποιείται από readabsolutesectors */
δομή πακέτου diskaddr
{
char packets size ; /* Μέγεθος πακέτου, συνήθως 10 H */
σύμβολο δεσμευμένο ; /* Κράτηση (0) */
int blockcount ; /* Αριθμός μπλοκ προς μεταφορά */
char far *bufferaddress ; /* διεύθυνση για μετάδοση
Buffer */
ανυπόγραφος μακρύς αριθμός μπλοκ[2] ; /* Αρχικό απόλυτο
Αριθμός μπλοκ */
} ;
///// Λειτουργία για λήψη παραμέτρων μονάδας δίσκου \\\\\
ανυπόγραφο long getdrivegeometry(intdrive)
{
συνδικαλιστικό REGS i, o ;
δομή SREGS s;
δομική γεωμετρία g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
ihah = 0x48 ; /* Αριθμός συνάρτησης 0x48 */
ihdl = οδηγώ; /* Αριθμός δίσκου */
ixsi = FP_OFF ( (άκυρο μακριά*)&g ) ;
s.ds = FP_SEG ( (κενό μακριά*)&g ) ;
/* Κλήση του καθορισμένου αριθμού συνάρτησης επέκτασης INT 13H με τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s );
printf("\n Κεφαλή = %lu, Τομείς ανά κομμάτι = %lu, Κύλινδρος = %lu\n",
g.head, g.spc, g.cyl);
/* Εάν η λειτουργία λήψης γεωμετρίας δίσκου αποτύχει, εκτυπώστε ένα μήνυμα σφάλματος και πραγματοποιήστε έξοδο από */
if(g.spt==0)
{
printf("\n Η συνάρτηση για τη λήψη της γεωμετρίας της μονάδας δίσκου δεν εκτελέστηκε....");
printf("\n Οι επεκτάσεις δεν υποστηρίζονται, πατήστε οποιοδήποτε πλήκτρο για
Εξοδος...");
getch();
exit(1);
}
επιστροφή *g.sectors; /* Επιστροφή Ο αριθμός των
Τομείς στο Drive */
}
ανυπόγραφο long file_size=0, i=0;
ανυπόγραφο long start_file=0, end_file=0;
ανυπόγραφο long Sectors_in_HDD2=0, loop=0;
char buffer[512], όνομα αρχείου[80], temp[8];
char path[80];
ανυπόγραφο αποτέλεσμα int,num=0;
/* Επικεφαλίδα αρχείων Microsoft Word */
κεφαλίδα χαρακτήρων[10] = {0xD0,0xCF,0x11,0xE0, 0xA1,0xB1,0x1A,0xE1};
/* Υποσέλιδο αρχείων Microsoft Word */
char DOC_footer[14] =
{0x57,0x6F,0x72,0x64, 0x2E,0x44,0x6F,0x63,
0x75,0x6D,0x65,0x6E,0x74};
/// Έναρξη κύριας \\\
void main()
{
clrscr();
/* Εάν ο συνολικός αριθ. των προσαρτημένων σκληρών δίσκων είναι λιγότερος
μετά δύο, Εμφάνιση μηνύματος σφάλματος και Έξοδος. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n Πρέπει να έχετε τουλάχιστον δύο σκληρούς δίσκους
Συνημμένο στον υπολογιστή σας για να το εκτελέσετε");
printf("\n Πρόγραμμα. Αυτό το Πρόγραμμα έχει αναπτυχθεί
για να ανακτήσετε τα δεδομένα του δεύτερου σκληρού δίσκου.");
printf("\n Πατήστε οποιοδήποτε πλήκτρο για έξοδο...");
getch();
exit(1);
}
Sectors_in_HDD2=getdrivegeometry (0x81);
printf("\n Συνολικοί τομείς σε δεύτερο σκληρό δίσκο = %lu",
Sectors_in_HDD2);
printf("\n\n \"Πρέπει να αποθηκεύσετε τα ανακτημένα αρχεία
άλλος σκληρός δίσκος, όχι στον ίδιο δίσκο");
printf("\n στο οποίο αναζητάτε το χαμένο
δεδομένα.\"");
printf("\n\n Εισαγάγετε τη διαδρομή προορισμού για να αποθηκεύσετε το
Ανακτημένα αρχεία...\n ");
παίρνει(διαδρομή);
/* ελέγξτε εάν υπάρχει κατάλογος προορισμού ή όχι */
if(πρόσβαση(διαδρομή, 0) != 0)
{
/* εάν ο κατάλογος Προορισμός δεν υπάρχει, δημιουργήστε
ο κατάλογος μέχρι ένα επίπεδο */
if(mkdir(διαδρομή)!=0)
{
printf("\n Δεν ήταν δυνατή η δημιουργία καταλόγου \"%s\"",
μονοπάτι);
printf("\n Ελέγξτε τη διαδρομή..., πατήστε οποιοδήποτε πλήκτρο για
έξοδος...");
getch();
exit(1);
}
}
strcat(διαδρομή,"\\Ptt");
/* Λειτουργία για απόκρυψη (και εμφάνιση) δρομέα στην οθόνη */
show_hide_cursor ( 32,
gotoxy(15,18);cprintf("[ %d ] Αρχεία ανακτήθηκαν...",
σε);
/* αναζήτηση για τα δεδομένα μέχρι τον τελικό τομέα του δίσκου */
while(loop<Sectors_in_HDD2)
{
/* Διαβάστε έναν τομέα (Αριθμός τομέα = βρόχος) */
readabsolutesectors ( 0x81, βρόχος, 1, buffer );
gotoxy(19,16);cprintf("Αριθμός τομέα σάρωσης = % ld",
βρόχος);
if(kbhit())
{
show_hide_cursor ( 6, 7 ); /* Ανάκτηση του
δρομέα πριν
Έξοδος από το πρόγραμμα
*/
exit(0);
}
/* εάν βρεθεί η καθορισμένη κεφαλίδα */
if((memcmp ( buffer, header,7))==0)
{
/* λογική για την αυτόματη παροχή του ονόματος αρχείου
δημιουργήστε τα αρχεία για να αποθηκεύσετε τα ανακτημένα δεδομένα */
strcpy(όνομα αρχείου, διαδρομή);
itoa (αριθμός, θερμοκρασία, 10);
strcat(όνομα αρχείου, temp);
strcat(όνομα αρχείου,".DOC");
start_file=loop; /* αρχικός τομέας αρχείου */
gotoxy(5,19);cprintf("Βρέθηκε αρχείο..., Αποθήκευση ως %s",
όνομα αρχείου);
num++;
////////////// Συνθήκες κλεισίματος αρχείου \\\\\\\\\\\\\\\\
μέγεθος_αρχείου=0;
ενώ (μέγεθος_αρχείου<5000000)
{
βρόχος++;
file_size+=512;
readabsolutesectors ( 0x81, βρόχος, 1, buffer );
gotoxy(19,16);cprintf("Αριθμός τομέα σάρωσης = % ld" ,
βρόχος);
/* εάν το μέγεθος αρχείου φτάσει το μέγιστο μέγεθος των 5 MB */
if (μέγεθος_αρχείου>=5000000)
{
end_file=loop; /* Τελικός τομέας αρχείου */
Recover_the_file();/* γράψτε τα δεδομένα στο αρχείο */
διακοπή;
}
/* εάν βρεθεί το υποσέλιδο του αρχείου DOC */
for(i=0;i<512;i++)
{
if( memcmp(buffer+i,DOC_footer,12)==0 )
{
end_file=loop; /* Τελικός τομέας αρχείου */
Recover_the_file();/* γράψτε τα δεδομένα στο αρχείο */
διακοπή;
}
}
/* εάν βρεθεί άλλη κεφαλίδα */
if( memcmp(buffer,header,7)==0)
{
loop=loop-1;
end_file=loop; /* Τελικός τομέας αρχείου */
Recover_the_file();/* γράψτε τα δεδομένα στο αρχείο */
διακοπή;
}
if(kbhit())
{
show_hide_cursor ( 6, 7 );
exit(0);
}
}
}
βρόχος++;
}
////////While Loop τελειώνει εδώ
/* εμφάνιση μηνύματος για ολοκλήρωση αναζήτησης και ανάκτησης */ if(loop>=Sectors_in_HDD2 )
{
gotoxy(17,23);cprintf("Η αποθήκευση αρχείων στο δίσκο είναι
Ολοκληρώθηκε !!");
gotoxy(17,24);cprintf("Πατήστε οποιοδήποτε πλήκτρο για έξοδο...");
show_hide_cursor ( 6, 7 );
getch();
}
}
Η γεωμετρία της δομής χρησιμοποιείται από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Function Number 0x48 για να ληφθούν οι διάφορες παραμέτρους του δίσκου.
Η δομή diskaddrpacket είναι για μορφή πακέτου Διεύθυνσης Δίσκου, που θα χρησιμοποιηθεί από τη Συνάρτηση readabsolutesectors.
Η συνάρτηση getdrivegeometry (int drive) είναι η λήψη παραμέτρων μονάδας δίσκου της μονάδας με αριθμό φυσικής μονάδας δίσκου που έχει καθοριστεί.
(char) peekb(0x0040, 0x0075) χρησιμοποιείται για την εύρεση του αριθμού των σκληρών δίσκων που είναι συνδεδεμένοι στον υπολογιστή, που είναι αποθηκευμένοι στη θέση μνήμης που αντιπροσωπεύεται από το τμήμα 0040H:offset 0075H. Εάν ο συνολικός αριθμός των συνδεδεμένων σκληρών δίσκων είναι μικρότερος από δύο Εμφάνιση Μήνυμα Σφάλματος και Έξοδος.
Sectors_in_HDD2=getdrivegeometry (0x81); βρίσκει τις διάφορες παραμέτρους του δεύτερου φυσικού σκληρού δίσκου (0x81) και επιστρέφει τον συνολικό αριθμό τομέων του δίσκου.
Η δήλωση if(access(path, 0) != 0) ελέγχει την προσβασιμότητα της διαδρομής που δίνεται από τον χρήστη. Εάν ο κατάλογος προορισμού δεν υπάρχει, ο προορισμός δημιουργείται μέχρι ένα επίπεδο και εάν η δεδομένη διαδρομή ελέγχεται από τη συνθήκη if(mkdir(path)!=0) είναι παράνομη, εμφανίζεται μήνυμα σφάλματος.
Τα ονόματα αρχείων των αρχείων που δημιουργούνται αυτόματα για την αποθήκευση των ανακτημένων δεδομένων δημιουργούνται έτσι ώστε στους τρεις πρώτους χαρακτήρες των αρχείων να δίνονται PTT από το strcat(path,"\\Ptt"); λειτουργία. Αυτό γίνεται για να αποφευχθούν τα διπλά ονόματα αρχείων στον κατάλογο προορισμού. Επομένως, τα ονόματα αρχείων των ανακτημένων αρχείων δίνονται σε μορφή "PTTxxxxx.DOC"
Η συνάρτηση show_hide_cursor ( 32, 0 ); χρησιμοποιείται για την Απόκρυψη του Δρομέα από την οθόνη όπου show_hide_cursor ( 6, 7 ); ανακτά τον κέρσορα πίσω στην οθόνη.
Η συνάρτηση readabsolutesectors (0x81, βρόχος, 1, buffer); Διαβάζει έναν τομέα του δεύτερου φυσικού σκληρού δίσκου που καθορίζεται από τον βρόχο αριθμού τομέα.
Εάν βρεθεί η κεφαλίδα του αρχείου, start_file = βρόχος; ορίζει το αρχείο start_file στον αρχικό αριθμό τομέα του αρχείου που πρόκειται να ανακτηθεί. Το πρόγραμμα ακολουθεί τις τρεις συνθήκες που δίνονται στη συνέχεια, για να βρει τον τελικό τομέα του αρχείου:
- Εάν το μέγεθος του αρχείου φτάσει το μέγιστο μέγεθος των 5 MB
- Εάν βρεθεί το υποσέλιδο του αρχείου DOC
- Εάν βρεθεί άλλη κεφαλίδα
Ο μεγάλος ακέραιος end_file ορίζεται στον τελικό τομέα του αρχείου από το end_file=loop. εάν ικανοποιείται μία από τις τρεις προϋποθέσεις. Τώρα τα δεδομένα των τομέων, ξεκινώντας από τον αριθμό τομέα start_file μέχρι τον αριθμό τομέα end_file αποθηκεύονται στο αρχείο με τη συνάρτηση Recover_the_file( ).
Η κωδικοποίηση της συνάρτησης Recover_the_file( ) έχει δοθεί παρακάτω:
/* Λειτουργία αποθήκευσης των δεδομένων των τομέων ξεκινώντας από τον αριθμό τομέα start_file έως τον αριθμό τομέα end_file */
Recover_the_file()
{
ΑΡΧΕΙΟ *fp;
if((fp=fopen(όνομα αρχείου, "wb"))==NULL)
{
gotoxy(10,23);printf("Σφάλμα κατά το άνοιγμα του αρχείου %s",
όνομα αρχείου);
getch();
exit(1);
}
for(i=start_file;i<=end_file;i++)
{
gotoxy(19,16);cprintf("Αριθμός τομέα σάρωσης =
%ld", i);
readabsolutesectors ( 0x81, i, 1, buffer );
fwrite(buffer,512,1, fp);
}
fclose(fp);
gotoxy(15,18);cprintf("[ %d ] Αρχεία ανακτήθηκαν...",αριθμός);
gotoxy(5,19);cprintf(" ");
απόδοση;
}
Η κωδικοποίηση της συνάρτησης readabsolutesectors έχει δοθεί στη συνέχεια. Η συνάρτηση χρησιμοποιεί την επέκταση INT 13H και τον αριθμό συνάρτησης 42H για την ανάγνωση των τομέων.
Για τη λεπτομερή περιγραφή της λειτουργίας, ανατρέξτε στο κεφάλαιο «Δημιουργία αντιγράφων ασφαλείας» που συζητήθηκε νωρίτερα σε αυτό το βιβλίο. Η κωδικοποίηση της συνάρτησης είναι η εξής:
//// Συνάρτηση ανάγνωσης απόλυτων τομέων \\\\
int readabsolutesectors (int drive,
ανυπόγραφος μακρύς αριθμός τομέα,
int numofsectors,
void *buffer )
{
ένωση REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* μέγεθος πακέτου = 10H */
pp.reserved = 0 ; /* Κράτηση = 0 */
pp.blockcount = numofsectors ; /* Αριθμός τομέων
να διαβάσω */
/* για προσωρινή μνήμη δεδομένων */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = αριθμός τομέα ; /* Αριθμός τομέα
να διαβάσω */
pp.blocknumber[1] = 0 ; /* Αριθμός μπλοκ */
ihah = 0x42 ; /* Αριθμός συνάρτησης*/
ihdl = drive ; /* Αριθμός φυσικής μονάδας */
/* ds:si για παραμέτρους buffer */
ixsi = FP_OFF ( (κενό μακριά*)&pp ) ;
/* ds:si για παραμέτρους buffer */
s.ds = FP_SEG ( (κενό μακριά*)&pp ) ;
/* Κλήση της καθορισμένης συνάρτησης του INT 13H με
τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s );
αν ( oxcflag==1)
επιστροφή 0 ; //αποτυχία
αλλού
επιστροφή 1 ; // επιτυχία
}
Η παρακάτω λειτουργία χρησιμοποιείται για την απόκρυψη ή εμφάνιση του δρομέα στην οθόνη. Η συνάρτηση χρησιμοποιεί διακοπή 10H, συνάρτηση 01H για να ορίσει τον τύπο του δρομέα. Η κωδικοποίηση έχει ως εξής:
show_hide_cursor (ssl, esl)
ακέραιοι αριθμοί ssl, esl ;
{
συνδικαλιστικό REGS i, o ;
αύξηση = 1 ;
ihch = ssl ;
ihcl = esl ;
ihbh = 0 ;
int86 ( 16, &i, &o ) ;
Γύρνα πίσω;
}
Το show_hide_cursor( 32, 0 ) αποκρύπτει τον κέρσορα και το show_hide_cursor ( 6, 7 ) επαναφέρει τον δρομέα. Η ssl είναι η γραμμή έναρξης για τον κέρσορα και η esl είναι η γραμμή τέλους για τον κέρσορα.
Μια σύντομη περιγραφή της συνάρτησης 01H INT 10H έχει ως εξής:
INT 10H (16 ή 0x10)
Συνάρτηση 01H (ή 0x01) --> Ορισμός τύπου δρομέα
Κλήση από: AH = 01H
Bits 0-4 CH = Γραμμή έναρξης για τον κέρσορα
CL bits 0-4 = τελική γραμμή για τον κέρσορα
Επιστροφή: τίποτα.
Σχόλια:
Η λειτουργία χρησιμοποιείται για να ορίσετε τον τύπο του δρομέα επιλέγοντας τις γραμμές έναρξης και τέλους για τον δρομέα υλικού που αναβοσβήνει στη λειτουργία εμφάνισης κειμένου. Ο δρομέας υλικού δεν είναι διαθέσιμος σε λειτουργίες γραφικών.