Έλεγχος ισχύος στα Windows. Έλεγχος ισχύος στην πορεία απόδοσης των Windows

Οδηγοί λειτουργίας του πυρήνα: Μέρος 1: Βασικές έννοιες - αρχείο wasm.ru

Επισκόπηση της αρχιτεκτονικής

Ο εσωτερικός κόσμος των Windows 2000 χωρίζεται σε δύο μέρη με σαφώς καθορισμένα όρια, τόσο από την άποψη του χώρου διευθύνσεων όσο και από την άποψη των δικαιωμάτων και των καθηκόντων του κώδικα σε αυτόν τον τομέα της διευθύνσεως.

Με τον διαχωρισμό του χώρου διευθύνσεων, όλα είναι εκπληκτικά απλή. Και τα τέσσερα διαθέσιμα στην αρχιτεκτονική 32-bit, τα gigabytes χωρίζονται σε δύο ίσα μέρη (4GT Ram Tuning και η επέκταση φυσικής διεύθυνσης, το οποίο βρίσκεται κάτω από το zczotic). Το κάτω μισό δίνεται στις διαδικασίες λειτουργίας χρήστη, η κορυφή ανήκει στον πυρήνα.

Με τον διαχωρισμό των δικαιωμάτων και των ευθυνών λίγο πιο δύσκολη.

Οι ακόλουθες διαδικασίες περιλαμβάνουν τον χρήστη:

  • Διαδικασίες υποστήριξης συστήματος (διαδικασίες υποστήριξης συστήματος) - για παράδειγμα, η διαδικασία εισόδου στο σύστημα Winlogon (υλοποιείται σε \\% Systemroot% \\ System32 \\ Winlogon.exe);
  • Διαδικασίες υπηρεσιών (διαδικασίες υπηρεσίας) - για παράδειγμα, ένα καρούλι εκτύπωσης;
  • Προσαρμοσμένες εφαρμογές (εφαρμογές χρηστών) - υπάρχουν πέντε τύποι: win32, Windows 3.1, MS-DOS, POSIX και OS / 2.
  • Υποσυστήματα περιβάλλοντος (περιβαλλοντικά υποσυστήματα) - τα τρία υποσυστήματα περιβάλλοντος υποστηρίζονται: Win32 (υλοποιείται σε \\% Systemroot% \\ System32 \\ CSRSS.EXE), POSIX (υλοποιήθηκε σε \\% SystemRoot% \\ System32 \\ psxss.exe), OS / 2 ( Εφαρμόστηκε σε \\% systemroot% \\ system32 \\ os2ss.exe).

Ο πυρήνας αποτελείται από τα ακόλουθα συστατικά:

    Εκτελεστικό σύστημα (εκτελεστικό) - Διαχείριση μνήμης, διαδικασίες και κλωστές κ.λπ.
  • Ο πυρήνας - ο σχεδιασμός ροής, η αποστολή διακοπών και εξαιρέσεων κ.λπ. (υλοποιείται σε \\% systemroot% \\ system32 \\ ntoskrnl.exe);
  • Οδηγοί προγράμματος οδήγησης συσκευών - προγράμματα οδήγησης υλικού, προγράμματα οδήγησης δικτύου, προγράμματα οδήγησης συστήματος αρχείων.
  • Αφηρημένο στρώμα υλικού, HAL - απομονώνει τα τρία συστατικά του παραπάνω συστατικού από τις διαφορές μεταξύ αρχιτεκτονικών υλικού (υλοποιήθηκαν σε \\% systemroot% \\ system32 \\ hal.dll).
  • Σύστημα παραθύρων και γραφικών (γραφική διασύνδεση χρήστη, GUI) (υλοποιείται σε \\% Systemroot% \\ System32 \\ Win32k.sys).

Σύκο. 1-1. Απλοποιημένο σύστημα αρχιτεκτονικής των Windows 2000

Λειτουργία χρήστη και λειτουργία πυρήνα

Αν και οι οικογενειακοί επεξεργαστές της Intel X86 υποστηρίζουν τέσσερα επίπεδα προνομίων (που ονομάζονται δαχτυλίδια προστασίας), μόνο δύο χρησιμοποιούνται στα Windows: 0 OH για τη λειτουργία πυρήνα και 3η για τη λειτουργία χρήστη. Αυτό οφείλεται στην υποστήριξη άλλων επεξεργαστών (άλφα, mips), στα οποία εφαρμόζονται μόνο δύο επίπεδα προνομίων. Οι προηγούμενες εκδόσεις των Windows NT υποστηρίζουν αυτές τις αρχιτεκτονικές, αλλά μόνο η υποστήριξη X86 παρέμεινε στα Windows 2000.

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

Οι διαδικασίες του καθεστώτος χρήστη θεωρούνται δυνητικά επικίνδυνα όσον αφορά τη σταθερότητα του συστήματος. Τα δικαιώματά τους είναι περιορισμένα. Και όλα τα είδη προσπαθειών να προχωρήσουν πέρα \u200b\u200bαπό αυτούς τους περιορισμούς είναι δύσκολο να σταματήσουν.

Τα συστατικά του πυρήνα μοιράζονται ένα χώρο διευθύνσεων, που εκτελούνται στον προνομιούχο τρόπο επεξεργαστή (που ονομάζεται Mode Kernel), μπορεί να εκτελέσει τα πάντα, συμπεριλαμβανομένων των προνομιακών, των εντολών του επεξεργαστή, να έχουν απεριόριστη και άμεση πρόσβαση στα δεδομένα και τον κώδικα συστήματος, ή μέσω Hal, πρόσβαση στον εξοπλισμό.

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

Έτσι, οι εφαρμογές χρηστών διαχωρίζονται από το ίδιο το λειτουργικό σύστημα. Εάν καθορίσετε το στόχο της γραφής για κάποια σοβαρή εφαρμογή, να συνεργαστείτε με τις εσωτερικές λειτουργίες ή τις δομές δεδομένων συστήματος, θα συναντήσετε ένα πλήθος περιορισμών, για να ξεπεράσετε την οποία μπορείτε να διαθέσετε μόνο τον κωδικό σας στον χώρο διεύθυνσης του συστήματος. Από τα τεκμηριωμένα υπάρχει μόνο ένας τρόπος για να γίνει αυτό - εγκαταστήστε το πρόγραμμα οδήγησης συσκευής. Αυτή η μέθοδος είναι σχετικά απλή, αξιόπιστη και κυρίως, εφοδιασμένη πλήρως με την υποστήριξη από το ίδιο το λειτουργικό σύστημα.

Οι οδηγοί των Windows 2000

Το Windows 2000 υποστηρίζει πολλούς τύπους προγραμμάτων οδήγησης συσκευών.

Υπάρχουν δύο βασικοί που έχουν τους εκπροσώπους τους:

  • Οδηγοί λειτουργίας χρήστη: προγράμματα οδήγησης λειτουργίας χρήστη:
    • Τα προγράμματα οδήγησης εικονικής συσκευής, τα VDDs χρησιμοποιούνται για την υποστήριξη προγραμμάτων MS-DOS (δεν πρέπει να συγχέονται με προγράμματα οδήγησης VXD στα Windows 95/98 - αυτά είναι εντελώς διαφορετικά πράγματα, αν και έχουν ένα όνομα).
    • Προγράμματα οδήγησης εκτυπωτή.
  • Προγράμματα οδήγησης Mode Kernel (οδηγοί λειτουργίας πυρήνα):
    • Οδηγοί συστήματος αρχείων (προγράμματα οδήγησης συστήματος αρχείων) - Εφαρμόστε την είσοδο και την έξοδο σε τοπικούς δίσκους και δίσκους δικτύου.
    • Οι οδηγοί κληρονομών - γραμμένοι για προηγούμενες εκδόσεις των Windows NT;
    • Οδηγοί οδήγησης βίντεο - Εφαρμογή γραφικών.
    • Streaming Drivers - Streaming Drivers - Εφαρμογή βίντεο και ήχου I / O
    • WDM Drivers (μοντέλο προγράμματος οδήγησης Windows, WDM) - Υποστήριξη πλατύπου και τεχνολογίας αναπαραγωγής και διαχείριση ενέργειας. Το χαρακτηριστικό τους χαρακτηριστικό είναι η συμβατότητα στο επίπεδο πηγαίου κώδικα μεταξύ των Windows 98, Windows Me και Windows 2000.

Σε διαφορετικές πηγές, μπορείτε να ικανοποιήσετε μια ταξινόμηση ελαφρώς διαφορετική από τα παραπάνω, δεν είναι σημαντικό. Είναι σημαντικό οι οδηγοί που θα γράψουμε δεν εμπίπτουν σε κανένα στοιχείο αυτής της ταξινόμησης. Αυτά δεν είναι ούτε προγράμματα οδήγησης συστήματος αρχείων ούτε κληρονομούνται προγράμματα οδήγησης, ούτε οδηγοί προσαρμογέων βίντεο ή ήχου, ούτε προγράμματα οδήγησης WDM, επειδή Μην υποστηρίζετε το Play "N" και τον έλεγχο ισχύος. Αυτά δεν είναι οδηγοί καθεστώτος χρήστη (δεν είναι καθόλου ενδιαφέρον). Στην πραγματικότητα, γνωρίζει ακριβώς τι είναι, επειδή Το ίδιο το σύστημα σας επιτρέπει να προσθέσετε εύκολα και απλά να προσθέσετε τον κωδικό από μόνο του δεν είναι σαφές για ποια συσκευή και να κάνετε με τίποτα! Αυτός είναι ο τρόπος με τον οποίο αν είχατε έναν εντελώς άγνωστο άνθρωπο τη νύχτα στην πόρτα τη νύχτα, και δεν θα λέγατε μια λέξη για να τον αφήσει τη νύχτα, και θα έβαλα ακόμα στο κρεβάτι μου! Ωστόσο, δεν είναι κάποιο είδος σφάλματος ή μια τρύπα στο σύστημα ασφαλείας. Απλά συστήματα λειτουργεί καθώς λειτουργεί. Διαφορετικά, δεν μπορεί, επειδή Αλληλεπίδραση με το περιβάλλον, το σύστημα αναγκάζεται να παρέχει πρόσβαση. Και αν δεν ήταν έτσι, θα ήταν εντελώς κλειστό και ως εκ τούτου ένα άχρηστο σύστημα.

Όπως προκύπτει από το όνομα, το πρόγραμμα οδήγησης συσκευής είναι ένα πρόγραμμα που έχει σχεδιαστεί για να ελέγχει κάποια συσκευή και η συσκευή δεν χρειάζεται να είναι φυσική. Μπορεί να είναι λογικό ή, όπως στην περίπτωσή μας, εικονική.

Με τη δομή του, ο οδηγός συσκευής είναι οτιδήποτε άλλο ως μορφή PE (φορητό εκτελέσιμο, ΡΕ). Το ίδιο με το συνηθισμένο exe και dll. Μόλις φορτώθηκε και λειτουργεί σε άλλους κανόνες. Οι οδηγοί μπορούν να θεωρηθούν ως το DLL της λειτουργίας του πυρήνα που έχει σχεδιαστεί για να εκτελεί εργασίες που δεν επιλύονται από τη λειτουργία χρήστη. Η κύρια διαφορά εδώ (χωρίς να υπολογίζει το επίπεδο των προνομίων) είναι ότι δεν θα έχουμε άμεση πρόσβαση στον οδηγό, ούτε στον κώδικα, ούτε στα δεδομένα του, ούτε στα δεδομένα του και θα χρησιμοποιήσει τον ειδικό μηχανισμό που παρέχεται από τον αποστολέα I / O (διαχειριστής εισόδου / εξόδου ). Ο αποστολέας I / O παρέχει ένα περιβάλλον για τη λειτουργία των οδηγών και παρέχει επίσης μηχανισμούς λήψης, εκφόρτωσης και διαχείρισης τους.

Ξεκινώντας από την ανάπτυξη των οδηγών του καθεστώτος του πυρήνα, θα αισθανθείτε τον τέλειο νεοφερμένο, επειδή Η όλη προηγούμενη εμπειρία της χρήσης του API δεν θα βοηθήσει εδώ - ο πυρήνας παρέχει ένα εντελώς διαφορετικό σύνολο λειτουργιών. Θα χρειαστεί επίσης να χρησιμοποιήσετε κακή τεκμηρίωση (που ορίζονται μόνο σε αρχεία κεφαλίδας) ή σε όλες τις λειτουργίες χωρίς χαρτιά και δομές δεδομένων.

Μονοι και πολλαπλούς οδηγούς

Οι πιο ελεγχόμενοι οδηγοί φυσικών συσκευών είναι πολυεπίπεδη (στρωματοποιημένα προγράμματα οδήγησης). Η επεξεργασία αιτήματος I / O χωρίζεται μεταξύ πολλαπλών προγραμμάτων οδήγησης. Ο καθένας εκτελεί το μέρος της εργασίας. Για παράδειγμα, ένας αναγνώστης αρχείων μεταδίδεται στο πρόγραμμα οδήγησης του συστήματος αρχείων, το οποίο, έχοντας ολοκληρώσει ορισμένες λειτουργίες (για παράδειγμα, χωρίζοντας ένα ερώτημα σε διάφορα μέρη), το μεταδίδει "παρακάτω" - μονάδα δίσκου, και το ένα, με τη σειρά του, στέλνει ένα Αίτηση στον οδηγό του λεωφορείου. Επιπλέον, μπορεί να προστεθεί οποιοσδήποτε αριθμός προγραμμάτων οδήγησης φίλτρου μεταξύ αυτών των προγραμμάτων οδήγησης (για παράδειγμα, δεδομένα κρυπτογράφησης). Ζητώντας τον οδηγό υποκατάστασης (οδηγός χαμηλότερου επιπέδου) μεταδίδει τα αποτελέσματά του "επάνω" στον υψηλότερο (οδηγό υψηλότερου επιπέδου). Αλλά, ευτυχώς, όλοι θα είμαστε πολύ ευκολότεροι. Οι οδηγοί μας θα είναι πάντα μονό επίπεδο (μονολιθικοί οδηγοί), οι οποίοι θα απλοποιήσουν πολύ ολόκληρη τη διαδικασία γραφής και εντοπισμού αυτών.

Πλαίσιο πλημμύρας

Δεδομένου ότι, στις περισσότερες περιπτώσεις, έχουμε μόνο έναν επεξεργαστή και οι εφαρμογές που πρέπει να εκτελέσουν πολλά είναι, είναι φυσικό να δημιουργηθεί η ψευδαίσθηση της ταυτόχρονης εκτέλεσης, είναι απαραίτητο να συνδέσετε με συνέπεια αυτές τις εφαρμογές στον επεξεργαστή και πολύ γρήγορα . Αυτή η διαδικασία ονομάζεται πλαίσιο μεταγωγής πλαισίου. Εάν το σύστημα μεταβεί το πλαίσιο των ροών που ανήκουν στην ίδια διαδικασία, τότε είναι απαραίτητο να αποθηκεύσετε την τιμή των μητρώων επεξεργαστών του ρεύματος διακοπής και τη μεταφόρτωση, τις προ-αποθηκευμένες τιμές των καταχωρητών επεξεργαστών plug-in . Και να ενημερώσετε μερικές δομές δεδομένων. Εάν το plug-in ανήκει σε άλλη διαδικασία, τότε είναι απαραίτητο να κάνετε λήψη ενός δείκτη στον κατάλογο σελίδας στο μητρώο CR3 του επεξεργαστή (κατάλογος σελίδων) της διαδικασίας. Δεδομένου ότι κάθε διαδικασία χρήστη παρέχεται με κλειστό χώρο διευθύνσεων, υπάρχουν διαφορετικές διαδικασίες διαστημάτων διευθύνσεων, πράγμα που σημαίνει διαφορετικούς καταλόγους σελίδων και σύνολα σελίδων για τις οποίες ο επεξεργαστής μεταφράζει εικονικές διευθύνσεις σε φυσική. Όλα αυτά δεν σχετίζονται άμεσα με τους οδηγούς προγραμματισμού. Αλλά υπενθυμίζω αυτό σε σχέση με την οποία. Δεδομένου ότι η λειτουργία μεταγωγής περιβάλλοντος δεν είναι τα ταχύτερα, τότε οι οδηγοί, για λόγους καλύτερης απόδοσης, κατά κανόνα, δεν δημιουργούν τα ρεύματα. Αλλά ο κωδικός οδηγού πρέπει να εκτελεστεί ακόμα. Επομένως, για να εξοικονομήσετε χρόνο για να μετατρέψετε τα πλαίσια, οι οδηγοί εκτελούνται σε λειτουργία πυρήνα σε ένα από τα τρία πλαίσια:

  • Στο πλαίσιο της ροής των χρηστών της έναρξης αιτήματος I / O.
  • Στο πλαίσιο της ροής του συστήματος της λειτουργίας του πυρήνα (αυτά τα ρεύματα ανήκουν στη διαδικασία συστήματος).
  • Ως αποτέλεσμα της διακοπής (και συνεπώς όχι στο πλαίσιο μιας διαδικασίας ή ροής, η οποία ήταν ρεύμα κατά τη στιγμή της διακοπής).

Δεν καταλαβαίνω αρκετά πώς μπορείτε να εκτελέσετε κάτι "όχι στο πλαίσιο οποιασδήποτε διαδικασίας ή ροής", αλλά εξετάζοντας την εξουσία των ανθρώπων που έγραψαν (Δ. Σολομών και Μ. Ρώσινβατς), καθώς και αυτό που δεν το χρειαζόμαστε , γιατί. Δεν θα χειριστούμε είτε λογισμικό, δεν διακόπτεται το υλικό, για την τρίτη περίπτωση που μπορείτε να ξεχάσετε αμέσως. Οι δύο πρώτες επιλογές παραμένουν. Εάν ξεκινήσει ένα ερώτημα I / O, τότε στο πλαίσιο της ροής αυτού του αιτήματος ξεκίνησε και αυτό σημαίνει ότι μπορούμε να έχουμε άμεση πρόσβαση στον χώρο διευθύνσεων του οποίου ανήκει αυτό το ρεύμα. Εάν είμαστε στο πλαίσιο της ροής του συστήματος, τότε μπορεί να σχετίζεται άμεσα με οποιαδήποτε διαδικασία χρήστη και μπορούμε πάντα να επικοινωνήσουμε με το σύστημα. Εάν χρειάζεστε από τον οδηγό για να δείτε τι είδους διαδικασία βρίσκεται σε μια τέτοια διαδικασία, θα πρέπει να αλλάξετε το ίδιο το πλαίσιο ή να μεταδίδουν διευθύνσεις στους πίνακες σελίδων.

Διακοπή επιπέδων ερωτήματος

Η διακοπή είναι ένα αναπόσπαστο μέρος οποιουδήποτε λειτουργικού συστήματος. Η διακοπή απαιτεί επεξεργασία, οπότε η εκτέλεση του τρέχοντος κώδικα σταματά και ο έλεγχος μεταδίδεται στον χειριστή διακοπής. Υπάρχουν δύο διακρίσεις υλικού και λογισμικού. Οι διακοπές εξυπηρετούνται σύμφωνα με την προτεραιότητά τους. Το Windows 2000 χρησιμοποιεί τα συστήματα διακοπής προτεραιότητας που είναι γνωστά ως επίπεδα ερωτήματος διακοπής (επίπεδα αιτήματος διακοπής, IRQL). Συνολικά, υπάρχουν 32 επίπεδα, από 0 (παθητικά) που έχουν τη χαμηλότερη προτεραιότητα, 31 (υψηλή), με την υψηλότερη ποιότητα, αντίστοιχα. Επιπλέον, διακόπτει το λογισμικό IRQL \u003d 0 (παθητικό) μέσω IRQL \u003d 2 (DPC \\ dispatch) είναι λογισμικό και διακόπτεται με το IRQL \u003d 3 (συσκευή 1) μέσω IRQL \u003d 31 (υψηλή) είναι το υλικό. Μην συγχέετε τα επίπεδα προτεραιότητας διακοπής με τα επίπεδα προτεραιότητας ροής είναι εντελώς διαφορετικά πράγματα. Η διακοπή με το επίπεδο IRQL \u003d 0, αυστηρά, δεν είναι διακοπή, επειδή Δεν μπορεί να διακόψει τη λειτουργία οποιουδήποτε κώδικα (επειδή για αυτό ο κώδικας θα πρέπει να πραγματοποιηθεί σε ένα ακόμη χαμηλότερο επίπεδο διακοπής, αλλά δεν υπάρχει τέτοιο επίπεδο). Σε αυτό το IRQL, πραγματοποιούνται ρεύματα του καθεστώτος χρήστη. Και ο κώδικας των οδηγών μας θα πραγματοποιηθεί επίσης σε αυτό το IRQL. Αυτό δεν σημαίνει ότι ο κώδικας οποιουδήποτε οδηγού εκτελείται πάντοτε στο επίπεδο "παθητικό". Απλά δεν θα χειριστούμε κανένα λογισμικό, ούτε το πιο διακοπή του υλικού. Και από εδώ, τουλάχιστον δύο πολύ σημαντικές εξόδους.

Πρώτον: Το έργο των οδηγών μας μπορεί να διακοπεί ανά πάσα στιγμή, να επεξεργαστεί τις διακοπές με μεγαλύτερη προτεραιότητα (για παράδειγμα, από το χρονοδιακόπτη, όταν ο προγραμματιστής θα θεωρήσει ότι το ρεύμα μας και τόσο πολύ καιρό έχει έναν επεξεργαστή για μεγάλο χρονικό διάστημα και είναι ωρα για ΧΑΛΑΡΩΣΗ). Επομένως, με αυτή την έννοια, ο κώδικας των οδηγών μας διακόπτεται και μετατοπίζεται (ο επεξεργαστής δίνεται σε ένα άλλο ρεύμα), όπως και ο κώδικας οποιουδήποτε ρεύματος χρήστη. Υπάρχουν λειτουργίες πυρήνων που σας επιτρέπουν να μάθετε το τρέχον επίπεδο διακοπής, καθώς και να αυξήσετε ή να το χαμηλώσετε.

Το δεύτερο σημαντικό σημείο: Στο παθητικό επίπεδο διακοπής, μπορείτε να καλέσετε οποιεσδήποτε λειτουργίες πυρήνα (σε DDK στην περιγραφή κάθε λειτουργίας, είναι απαραίτητο να καθορίσετε σε ποια διακοπή στάθμης μπορεί να ονομαστεί) και επίσης να αποκτήσετε πρόσβαση στις σελίδες μνήμης που πέφτουν στο αρχείο τηλεειδοποίησης. Σε υψηλότερα επίπεδα διακοπής (DPC / DESPART και υψηλότερη), μια προσπάθεια έκκλησης στη σελίδα που λείπει στη φυσική μνήμη οδηγεί στην κατάρρευση του συστήματος, επειδή Ο διαχειριστής μνήμης (Memory Manager) δεν μπορεί να χειριστεί το σφάλμα σελίδων.

"Blue Death Screen"

Νομίζω ότι όλοι, τουλάχιστον μία φορά, είδε μια συναρπαστική εικόνα που ονομάζεται "Blue Death Screen" (μπλε οθόνη του θανάτου, BSOD). Πιθανώς δεν χρειάζεται να εξηγήσετε τι είναι και γιατί συμβαίνει. Είναι σημαντικό εδώ ότι αναπτύσσοντας τα προγράμματα οδήγησης του πυρήνα, προετοιμάζοντας το γεγονός ότι το BSOD θα εμφανιστεί συχνά στην οθόνη της οθόνης σας.

Στο τρίτο δαχτυλίδι, όλα ήταν απλά: σκιαγραφούσε έναν παραδειγματικό κώδικα, έβαλε int3 όπου ήταν απαραίτητο, ξεκίνησα και ... στο πρόγραμμα εντοπισμού σφαλμάτων, έχετε ήδη αποσυναρμολογήσει τι. Αν κάτι είναι λάθος - καρφωμένα, διορθωμένα λάθη, επανασυνδεδεμένα ... και ούτω καθεξής, μέχρι να κερδίσει ο κώδικας όπως θα έπρεπε. Όταν προγραμματίζετε οδηγούς σχετικά με αυτήν την τεχνική μπορείτε να ξεχάσετε. Εδώ το "sapper" είναι λάθος μία φορά. Μια εσφαλμένη κίνηση ... και μπορείτε να κλίνει στο πίσω μέρος της καρέκλας και να χαλαρώσετε για ένα λεπτό.

Για να δείτε το BSOD όσο το δυνατόν περισσότερο, θα πρέπει να κολλήσετε σε έναν πολύ απλό κανόνα: "επτά φορές θα πεθάνει - μια περικοπή" ... με την έννοια "επτά φορές έλεγχος - ένα τρέξιμο". Σίγουρα λέει, αλλά είναι πολύ πιο δύσκολο να γίνει. Αλλά κατά κανόνα, λαμβάνοντας υπόψη το γεγονός ότι η δομή των οδηγών που θα γράψετε (μετά την ανάγνωση αυτών των άρθρων) είναι σχετικά απλή, μπορείτε να αντιμετωπίσετε τα λάθη πριν από την εμφάνιση του BSOD. Αν εμφανιστεί επίμονα πριν από τα μάτια σας και δεν μπορείτε να καταλάβετε τον λόγο, είναι δυνατόν να διευκρινιστεί η κατάσταση είναι η ανάλυση της έκτακτης χωρητικότητας (χωματερή συντριβής). Το γεγονός ότι είναι πώς να το κάνετε και να αναλύσει μπορεί να διαβαστεί στο άρθρο του Mark Russinovich "Ανάλυση των χωματερών μνήμης έκτακτης ανάγκης" http://www.osp.ru/win2000/2001/03/025.htm. Αυτή είναι (ανάλυση) είναι πολύ δύσκολη, αλλά νομίζω ότι δεν θα το φτάσω.

Ο θεωρητής μου είναι ντροπαλός, έτσι ώστε όλα τα παραπάνω να θεωρηθούν ως πολύ βασικές πληροφορίες σχετικά με αυτές τις αρχές που είναι απολύτως απαραίτητες για την κατανόηση. Είναι αδύνατο να αρχίσουμε να αναπτύσσετε τους οδηγούς λειτουργίας του πυρήνα χωρίς να έχετε μια έννοια που ένα τέτοιο επίπεδο ροής, τα επίπεδα διακοπής και οι προτεραιότητες των ροών, του πυρήνα / λειτουργίας χρήστη κ.λπ. και τα λοιπά. Αισθανθείτε σίγουροι για κάποια ερώτηση - ένας κατάλογος αναφορών είναι παρακάτω.

Τώρα φωτίζεται μερικά πιο πρακτικά πράγματα (θα γίνουν αρκετά πρακτικά στα ακόλουθα άρθρα), δηλαδή, τι πρέπει να ενεργοποιήσουμε να εφαρμόσουμε όλη αυτή τη θεωρία.

Κιτ ανάπτυξης οδηγού.

Το πρώτο είναι φυσικά ένα σύνολο κιτ ανάπτυξης προγραμμάτων οδήγησης συσκευών (κιτ ανάπτυξης προγραμμάτων οδήγησης Windows 2000, 2KDDK), η οποία μπορεί να μεταφορτωθεί ελεύθερα από τη Microsoft (σε κάθε περίπτωση, το συγχωνεύθηκε εντελώς δωρεάν από εδώ: http://www.microsoft. com / ddk /). Αυτό το πακέτο περιλαμβάνει τεκμηρίωση που είναι μια πλούσια πηγή πληροφοριών σχετικά με τις εσωτερικές δομές δεδομένων και τις λειτουργίες ενδομειυστήματος που χρησιμοποιούνται από τους οδηγούς συσκευών.

Εκτός από την τεκμηρίωση στο DDK, ένα σύνολο αρχείων βιβλιοθήκης (* .lib), η οποία θα είναι απολύτως απαραίτητη κατά τη διάταξη. Το DDK περιλαμβάνει δύο σύνολα αυτών των αρχείων: για την τελική έκδοση των Windows (που ονομάζεται ελεύθερη κατασκευή). Και για σφαλμάτωση (που ονομάζεται απελευθέρωση ελέγχου (ελεγμένη κατασκευή)). Αυτά τα αρχεία είναι στους καταλόγους% DDK% \\ libfre \\ i386 και% DDK% \\ libchk \\ i386, αντίστοιχα. Η έκδοση εντοπισμού σφαλμάτων χαρακτηρίζεται από έναν πιο αυστηρό έλεγχο σφαλμάτων. Πρέπει να χρησιμοποιήσετε αρχεία που αντιστοιχούν στην έκδοση του συστήματος τοποθετώντας τα στο κατάλογο \\ masm32 \\ lib \\ lib \\ w2k.

Τα αρχεία περιλαμβάνουν

Θα χρειαστούμε επίσης τα αρχεία (*. CANC) με ορισμούς των πρωτοτύπων λειτουργιών. Θα πρέπει επίσης να τα κάνουμε (με μεγαλύτερη ακρίβεια σε μένα). Δοκίμασα πολλά διαφορετικά βοηθητικά προγράμματα που μετατρέπουν * .lib -\u003e *. Εγκατάσταση, και οι δύο περιλαμβάνονται στο MASM32 από το πακέτο Hutch, και συγχωνεύθηκε μαζί μου σε διαφορετικούς χρόνους με ατελείωτη διαδίκτυο. Από όλα όσα έχω στο απόθεμα, μόνο protoize.exe από f0dder αντιμετώπισαν με το καθήκον μου, και σχεδόν δεν έπρεπε να κυβερνήσω τίποτα με τα χέρια μου. Αυτή η υπέροχη tulza θα βρίσκεται στο \\ εργαλεία \\ κατάλογο πρωτοτύπων. Ιστοσελίδα του συγγραφέα: http://f0dder.didjitalyphrozen.com/. Μόνο εσείς δεν θα το βρείτε εκεί. Το F0dder έχει στείλει αυτό το βοηθητικό πρόγραμμα αρκετές φορές στη διάσκεψη http://board.win32asmcommunity.net/. Περιλαμβάνει θα βρίσκεται στον κατάλογο \\ περιλαμβάνει \\ w2k κατάλογο. Θα πρέπει να τοποθετούνται στο \\ masm32 \\ συμπεριλαμβάνουν τον κατάλογο \\ w2k. * .Lib χρησιμοποιήθηκε για μετατροπή για δωρεάν απελευθέρωση των Windows 2000, αφού έχω ακριβώς αυτή την επιλογή (και πιθανότατα, πάρα πολύ).

Το επόμενο πρόβλημα είναι πιο σοβαρό. Είναι σχεδόν η πλήρης απουσία αρχείων που περιλαμβάνονται στους ορισμούς των απαραίτητων δομών, συμβολικών σταθερών και μακροεντολών. Δεν μπορείτε να βρείτε κάτι καθαρό στο δίχτυ - δύσκολα μπορείτε να είστε πολύ εξωτικοί αυτό το μάθημα - να γράψετε τους οδηγούς λειτουργίας του πυρήνα στον συναρμολογητή. Κάτι μπορεί να βρεθεί στο Elicz http://www.anticracking.sk/elicz/. Κάτι στο Y0da http://mitgied.lycos.de/yoda2k/index.htm (μερικώς κατασκευασμένο από τον εαυτό του, μερικώς ληφθεί από το ίδιο elicz). Αλλά αυτό γίνεται από το χέρι άσχημα (με όλο το βαθύ σεβασμό μου για τους Σλοβακικούς και Γερμανούς συναδέλφους μας): τα ονόματα των μελών πολλών δομών διαφέρουν από εκείνους που ορίζονται στα αρχικά αρχεία κεφαλίδας από DDK. Οι ένθετες δομές και οι αλληλοσύνδεσης δεν έχουν ονόματα. Αν και στο πρωτότυπο καλούνται. Και γενικά, όλα είναι σε κάποια διαταραχή και όταν η προβολή προκαλεί μια καταθλιπτική εντύπωση. Δεν είναι κακό μόνο ntstatus.inc. Εν μέρει, αυτό εξηγείται από το γεγονός ότι η Elicz άρχισε να δημιουργεί τανταχτερά του ακόμα απουσία DDK (όπως λέει ο ίδιος). Σε κάθε περίπτωση, δεν σας συμβουλεύω να τα χρησιμοποιήσετε, τουλάχιστον χωρίς προσεκτικό έλεγχο. Κάτι, σε μια στιγμή, έλαμψε στη διάσκεψη http://board.win32asmcommunity.net/, αλλά η ποιότητα δεν είναι επίσης πολύ εντυπωσιακή. Εν ολίγοις, η μόνη σωστή λύση σε αυτή την κατάσταση είναι να κάνετε τα πάντα μόνοι σας και χειροκίνητα, αφού οποιαδήποτε εργαλεία που σας επιτρέπουν να αυτοματοποιήσετε αυτή τη διαδικασία, δεν ξέρω. Εάν ξαφνικά, συναντήσετε κάτι που αξίζει τον κόπο, μην σκεφτείτε για δουλειά - ενημερώστε με.

Debugging Drivers

Χρειαζόμαστε επίσης ένα debugger και, επειδή ο κωδικός πυρήνα θα πρέπει να διορθώσει, τότε το πρόγραμμα εντοπισμού σφαλμάτων χρειάζεται το κατάλληλο. Η καλύτερη επιλογή θα είναι μαλακτική. Ή μπορείτε να χρησιμοποιήσετε το τμήμα εντοπισμού σφαλμάτων του πυρήνα του DDK. Αυτό το εντελώς εντοπισμό απαιτεί δύο υπολογιστές - το μόλυβδο και οδηγείται, κάτι που δεν μπορεί να αντέξει οικονομικά. Mark Russinovich (Mark Russinovich, http://www.sysinternals.com/) Έγραψε ένα βοηθητικό πρόγραμμα LIVEKD που σας επιτρέπει να χρησιμοποιήσετε το Filelugger του πυρήνα χωρίς να συνδέσετε τον δεύτερο υπολογιστή. Δεν ξέρω αν βρίσκεται στον ιστότοπο (δεν έχει ελεγχθεί), αλλά στο δίσκο στο βιβλίο "η εσωτερική συσκευή Microsoft Windows 2000" είναι διαθέσιμη. Επίσης, αυτό το debugger είναι εξαιρετικά χρήσιμο για τη μελέτη του εσωτερικού συστήματος του συστήματος, υπό την προϋπόθεση ότι έχετε επιλέξει χαρακτήρες που μπορείτε (ή ήταν δυνατή) ελεύθερα λήψη από τη Microsoft.

  • David Solomon, Mark Russinovich, "Εσωτερικά Microsoft Windows 2000", Ed. "Πέτρος", 2001.

    Παρόλο που δεν υπάρχει μια μόνο γραμμή πηγαίου κώδικα σε αυτό το βιβλίο, είναι κυρίως για προγραμματιστές.

  • Sven Shreiber, "Χαρακτηριστικά χωρίς χαρτιά των Windows 2000", Ed. "Πέτρος", 2002.

    Ένα καθαρά πρακτικό βιβλίο στο οποίο αποκαλύπτεται πολλά μυστικά των Windows 2000.

  • Walter ONEY, "Προγραμματισμός του Microsoft Driver Model", Microsoft Press, 1999

    Σε αυτό το βιβλίο, η στάση γίνεται στα προγράμματα οδήγησης Play "n", αλλά αυτό δεν κάνει καθόλου τα πλεονεκτήματα του, επειδή Βασικές αρχές για την ανάπτυξη οδηγών είναι καθολική.

  • Jeffrey Richter, "Windows για επαγγελματίες: Δημιουργία αποτελεσματικών εφαρμογών Win32, λαμβάνοντας υπόψη τις ιδιαιτερότητες της έκδοσης 64-bit των Windows", Ed. "Πέτρος", 2000.

    Αυτό το βιβλίο δεν έχει άμεση στάση απέναντι στους οδηγούς προγραμματισμού, αλλά και πολύ ενδιαφέρον ;-)

    Ο κατάλογος αυτός δεν διεκδικεί σε καμία περίπτωση. Πολύ, ειδικά στα αγγλικά, μπορούν να βρεθούν στο Διαδίκτυο (εκτός από το Shreiber, όλα τα βιβλία είναι στην ηλεκτρονική έκδοση). Σε σχέση με τα βιβλία θέλω να πω και πάλι ότι όλοι από την κατηγορία "πρέπει να έχουν". Δείτε - Αγορά χωρίς να ψάχνετε. Όλα εκτός από τον Walter "και το Oney μεταφράζεται στο" μεγάλο και ισχυρό μας ".

    Και ΤΕΛΕΥΤΑΙΟ. Δεν είμαι ένας μεγάλος ειδικός στην ανάπτυξη των οδηγών, έτσι ώστε τα λάθη ή τις ανακρίβειες, τόσο σε αυτό όσο και σε όλα τα επόμενα άρθρα, είναι πολύ πιθανό. Θα βρείτε - με τόλμη τη μύτη σας. Θα σας πω ευχαριστώ.

  • Κέντρο ασφαλείας Windows Defender, συμπεριλαμβανομένου ενός νέου τμήματος ασφαλείας συσκευών, το οποίο προσφέρει ενισχυμένα εργαλεία ασφαλείας, όπως η μόνωση του πυρήνα.

    Η απομόνωση του πυρήνα είναι μια τεχνολογία ασφαλείας που βασίζεται στην εικονικοποίηση, η οποία παρέχει ένα πρόσθετο επίπεδο προστασίας από τις ευφυείς επιθέσεις. Η ακεραιότητα της μνήμης είναι ένα από τα συστατικά της τεχνολογίας μόνωσης του πυρήνα - η λειτουργία προορίζεται να αποτρέψει την εισαγωγή κακόβουλου κώδικα σε διαδικασίες υψηλής ασφάλειας. Προστασία εξασφαλίζεται λόγω του γεγονότος ότι η σελίδα εικονικής μνήμης του πυρήνα ξεκινά μόνο μετά την επιτυχή μετάβαση του ελέγχου ακεραιότητας.

    Εξετάστε το πώς να ενεργοποιήσετε τη λειτουργία "Integrity Memory" στα Windows 10 Απριλίου 2018 ενημέρωση για την ενίσχυση της ασφάλειας των υπολογιστών.

    Ενεργοποιήστε την ακεραιότητα μνήμης

    • Ανοίξτε το Κέντρο Ασφαλείας των Windows Defender.
    • Επιλέξτε την ενότητα "Ασφάλεια συσκευής".
    • Στην ενότητα "Τμήμα μόνωσης του πυρήνα", κάντε κλικ στο σύνδεσμο "Πληροφορίες μόνωσης πυρήνα".
    • Μετακινήστε το διακόπτη ακεραιότητας μνήμης στην ενεργή θέση.

    Μετά την ολοκλήρωση αυτών των ενεργειών, πρέπει να κάνετε επανεκκίνηση του υπολογιστή έτσι ώστε να ισχύουν οι αλλαγές.

    Σημείωση: Για να λειτουργήσετε αυτή τη λειτουργία, ο επεξεργαστής σας πρέπει να υποστηρίξει τις τεχνολογίες εικονικοποίησης. Επιπλέον, η εικονικοποίηση πρέπει να είναι ενεργοποιημένη στο BIOS ή UEFI. Διαφορετικά, η λειτουργία δεν θα είναι διαθέσιμη.

    Διόρθωση προβλημάτων μόνωσης πυρήνα

    Σε ορισμένες περιπτώσεις, μπορείτε να αντιμετωπίσετε προβλήματα συμβατότητας σε ορισμένες εφαρμογές, εάν η απομόνωση του πυρήνα είναι ενεργοποιημένη. Για να διορθώσετε τα προβλήματα θα πρέπει να απενεργοποιήσετε τη λειτουργία.

    Εάν προσπαθείτε να απενεργοποιήσετε την ακεραιότητα μνήμης στο Κέντρο Ασφαλείας του Windows Defender, αλλά η επιλογή έχει γίνει ανενεργή και το μήνυμα εμφανίζεται. "Αυτή η παράμετρος οδηγεί το διαχειριστή σας", τότε μπορείτε ακόμα να απενεργοποιήσετε τη λειτουργία χρησιμοποιώντας το μητρώο συστήματος.

    Σημείωση: Η εσφαλμένη αλλαγή μητρώου μπορεί να οδηγήσει σε σοβαρά προβλήματα. Συνιστάται να δημιουργήσετε ένα αντίγραφο ασφαλείας του μητρώου των Windows πριν εκτελέσετε αυτά τα βήματα. Στο μενού Επεξεργαστή μητρώου, επιλέξτε Αρχείο\u003e Εξαγωγή για να αποθηκεύσετε το αντίγραφο ασφαλείας.

    • Πατήστε το συνδυασμό πλήκτρων Windows + R για να εμφανιστεί το παράθυρο "Εκτέλεση".
    • Εισαγάγετε το regedit και κάντε κλικ στο OK για να ξεκινήσετε τον επεξεργαστή μητρώου.
    • Πηγαίνετε στον επόμενο τρόπο:
    HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlset \\ Control \\ DeviceGoard \\ Σενάρια \\ Hypervisorenforcedcodeigrity
    • Διπλό κλικ Ενεργοποιημένη..
    • Αλλάξτε την τιμή από 1 έως 0.
    • Κάντε κλικ στο OK.

    Για να απενεργοποιήσετε, μπορείτε επίσης να χρησιμοποιήσετε το έτοιμο

    Στείλτε την καλή δουλειά σας στη βάση γνώσεων είναι απλή. Χρησιμοποιήστε την παρακάτω φόρμα

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

    Δημοσιεύτηκε στη διεύθυνση http://www.allbest.ru/

    1. Θεωρητικές πληροφορίες

    1.1 Ανάπτυξη προγραμμάτων οδήγησης πυρήνων των Windows

    Σύντομες θεωρητικές πληροφορίες

    Ανάπτυξη οδηγών πυρήνα

    Ο οδηγός (από τον αγγλικό πρόγραμμα οδήγησης) είναι ένα πρόγραμμα ηλεκτρονικών υπολογιστών με το οποίο ένα άλλο πρόγραμμα (συνήθως λειτουργικό σύστημα) αποκτά πρόσβαση στο τυποποιημένο πρότυπο υλικού.

    Σχηματικά, να δείξει πόσο διαφορετικοί τύποι οδηγών λειτουργούν:

    Βολικά χωρισμένο σε 2 τύπους:

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

    Απαιτούνται προγράμματα οδήγησης συσκευών για να αλληλεπιδρούν μεταξύ του προγράμματος του χρήστη και της συσκευής, δηλαδή, να μεταδίδουν δεδομένα μεταξύ τους, να ελέγχουν τη συσκευή. Επιπλέον, οι συσκευές μπορούν να είναι πραγματικές και εικονικές). Ο οδηγός δεν χρειάζεται να διαχειρίζεται καμία φυσική συσκευή. Ορισμένο λειτουργικό σύστημα καθιστά δυνατή τη δημιουργία προγραμμάτων οδών εικονικών συσκευών - αντικειμένων που συμπεριφέρονται παρόμοια με / έξω συσκευές, αλλά δεν ανταποκρίνονται σε καμία φυσική συσκευή.

    Τα συστατικά του πυρήνα εκτελούνται στη λειτουργία προνομιακού επεξεργαστή (που ονομάζεται Mode Kernel), μπορεί να εκτελέσει τα πάντα, δηλαδή:

    - Μπορούν να εκτελέσουν εντολές προνομιακού επεξεργαστή (για παράδειγμα, LGDT),

    - μπορεί να έχει πρόσβαση στα δεδομένα συστήματος και τον κώδικα,

    - έχουν άμεση πρόσβαση στον εξοπλισμό, όπως οι λιμένες

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

    Εάν πρέπει να γράψετε σε κάποια σοβαρή εφαρμογή, να εργαστείτε με την πρόσβαση σε εσωτερικές λειτουργίες ή δομές δεδομένων συστήματος, μπορείτε να αντιμετωπίσετε ένα πλήθος περιορισμών, για να ξεπεραστούν οι οποίες μόνο οι εκπομπές του κώδικα σας στο χώρο διεύθυνσης του συστήματος. Από τα τεκμηριωμένα υπάρχει μόνο ένας τρόπος για να γίνει αυτό - να εγκαταστήσετε τον οδηγό. Αυτή η μέθοδος είναι σχετικά απλή, αξιόπιστη και κυρίως, εφοδιασμένη πλήρως με την υποστήριξη από το ίδιο το λειτουργικό σύστημα.

    Ο κωδικός πυρήνα (στην πραγματικότητα αυτό είναι το ίδιο το σύστημα) θεωρείται ότι είναι εντελώς αξιόπιστη. Επομένως, η φόρτωση στο χώρο διεύθυνσης του συστήματος, ο οδηγός γίνεται μέρος του συστήματος και οι περιορισμοί δεν υπερτίθενται σε αυτό. Στα Windows, είναι σχεδόν ο μόνος τρόπος να γράψετε προγραμματιστές OS για να γράψετε συστατικά συστήματος του πυρήνα.

    Το DDK (κιτ ανάπτυξης συσκευών) χρησιμοποιείται για να γράψει και να διερευνήσει μεθόδους ανάπτυξης οδηγών - το σύστημα ανάπτυξης οδηγών.

    Εκτός από την τεκμηρίωση στο DDK, περιλαμβάνεται ένα σύνολο από αρχεία που περιλαμβάνονται (*. Εσωμαντικό) και αρχεία βιβλιοθήκης (* .lib).

    Έτσι, τα Windows υποστηρίζουν διάφορα είδη προγραμμάτων οδήγησης συσκευών, αλλά, επιπλέον, υπάρχουν προγράμματα οδήγησης που δεν είναι προγράμματα οδήγησης συσκευών, αλλά απλά σας επιτρέπουν να δημιουργείτε προγράμματα που θα λειτουργούν στα Windows στη λειτουργία πυρήνα, δηλ. Στο επίπεδο των προνομίων. Ταυτόχρονα, έχουν πρόσβαση πλήρως στο λειτουργικό σύστημα και τον εξοπλισμό.

    Εξετάστε το πιο απλό οδηγό λειτουργίας του πυρήνα.

    #Περιλαμβάνω.

    int driverentry (

    Στο pdriver_object pdiverobject,

    Στο pusregisticistrypath) (

    }

    Το σημείο εισόδου είναι η οδήγηση, η οποία είναι διακοσμημένη με τη μορφή μιας διαδικασίας που φιλοξενεί δύο παραμέτρους:

    pDRiverObject - δείκτης στο αντικείμενο μόλις δημιουργήθηκε οδηγός. Με τη λήψη του προγράμματος οδήγησης, το σύστημα δημιουργεί το αντικείμενο οδηγού (αντικείμενο οδηγού), που αντιπροσωπεύει την εικόνα του προγράμματος οδήγησης στη μνήμη. Μέσω αυτού του αντικειμένου, το σύστημα ελέγχει το πρόγραμμα οδήγησης. Ο οδηγός είναι μια συνηθισμένη δομή δεδομένων τύπου Driver_Object.

    pUSregistrypath - δείκτης στο κλειδί μητρώου που περιέχει επιλογές αρχικοποίησης οδηγού.

    Αυτός ο πρώτος οδηγός μας είναι απλώς φορτωμένος στο σύστημα και αμέσως εκφορτωθεί.

    Τώρα εξετάστε το πρόγραμμα προτύπου που θα χρειαστεί να χρησιμοποιηθεί για την ανάπτυξη ενός προγράμματος στο πρώτο βήμα της λειτουργίας του μαθήματος (οδηγός της λειτουργίας του πυρήνα του Beeper.sys).

    Το έργο αυτού του οδηγού είναι να εκτελέσει μια σημείωση στο σύστημα δυναμικά στην πρώτη οκτάβα. Για να το κάνετε αυτό, ο οδηγός χρησιμοποιεί τις οδηγίες του επεξεργαστή μέσα και έξω, αναφερόμενοι στις αντίστοιχες θύρες I / O. Είναι γνωστό ότι η πρόσβαση στις θύρες I / O είναι ένας ιερός προστατευμένος πόρος συστήματος των Windows. Η προσπάθεια προσφυγής σε οποιοδήποτε από αυτά, τόσο η είσοδος όσο και η παραγωγή, από τη λειτουργία χρήστη, αναπόφευκτα οδηγεί σε εξαίρεση.

    Στο παράδειγμά μας, ο ομιλητής θα λειτουργήσει (για αυτό, χρησιμοποιείται, ειδικότερα, θύρα 61h, 0 και 1 bits, θύρα 43h και 42h).

    Στην αρχή του οδηγού ορίστηκε και τις 12 σημειώσεις.

    Θα χρειαστεί να μην ενεργοποιήσετε απλά το ηχείο, αλλά να ρυθμίσετε τη συχνότητα ήχου. Αυτό χρησιμοποιεί ένα υποσύστημα χρονοδιακόπτη που λειτουργεί ανεξάρτητα από τον επεξεργαστή και έχει 3 κανάλια. Η έξοδος του καναλιού 2 σχετίζεται με το ηχείο, το οποίο χρησιμοποιείται για τη δημιουργία του ήχου διαφορετικής συχνότητας. Εύρος ήχου ακοής - 30Hz-6000Hz.

    Για να ορίσετε τη συχνότητα ήχου στη θύρα 43h (Εγγραφή χρονοδιακόπτη) 0BH Έλεγχος Word:

    mov Al, 0bh

    out 43h, Al

    Αυτή η τιμή καθορίζει τον αριθμό καναλιού που θα διαχειριστούμε, τον τύπο λειτουργίας, τη λειτουργία καναλιού και τη μορφή μετρητή.

    Στη συνέχεια, η επανυπολογισμένη συχνότητα ήχου (1193167 / συχνότητα (Hz)) αποστέλλεται στη θύρα 42h (1193167 / συχνότητα (Hz) (το νεότερο μέρος είναι πρώτο, τότε το παλαιότερο).

    Για παράδειγμα, θέλουμε να έχουμε τη συχνότητα ήχου των 100 Hz. Επανυπολογίστε τη συχνότητα

    1193167/100 = 11931

    Επειτα:

    mOV AX, 11931

    out 42h, Al

    mov Al, Ah

    out 42h, Al

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

    Συχνά, στα καθήκοντα που χρειάζεστε για να ορίσετε διαφορετικές διάρκειες. Για να το κάνετε αυτό, είναι βολικό να χρησιμοποιήσετε τη διαδικασία do_delay, περνώντας το έμμεσα μια συγκεκριμένη παράμετρο "ήχου".

    Για να γίνει βολικό να διορθώσετε ένα πρόγραμμα οδήγησης, υπάρχουν διάφορα μέσα. Το απλούστερο είναι να ολοκληρωθεί με τις απαραίτητες πληροφορίες στο ειδικό παράθυρο της χρησιμότητας προβολής εντοπισμού σφαλμάτων. Προηγουμένως, το πρόγραμμα αυτό ξεκινά, διαμορφωμένο ώστε να παρεμποδίζει μηνύματα από τον πυρήνα. Για να εμφανίσετε το πρόγραμμα, η λειτουργία DBGPRINT καλείται, με μια παράμετρο - την έξοδο της συμβολοσειράς. Μετά την εκκίνηση του προγράμματος οδήγησης στο παράθυρο προβολής εντοπισμού σφαλμάτων, εμφανίζεται ολόκληρη η έξοδος.

    Υπάρχουν διάφοροι τρόποι εγκατάστασης του οδηγού στον πυρήνα. Δεδομένου ότι ο οδηγός μας, στην πραγματικότητα, δεν είναι απαραίτητος, το σύστημα δεν είναι απαραίτητο (δεν οδηγεί οποιαδήποτε συσκευή), τότε θα συνδέσουμε προσωρινά το πρόγραμμα οδήγησης στο σύστημα και στη συνέχεια θα το διαγράψετε.

    Για να το κάνετε αυτό, πρέπει να δημιουργήσετε μια εφαρμογή που θα εκτελέσει τον οδηγό. Πως? Ο οδηγός είναι η υπηρεσία επιπέδου πυρήνα. Επομένως, η εφαρμογή θα χρησιμοποιήσει τον διαχειριστή ελέγχου SCM - Service (Manager Control Manager), ο οποίος περιλαμβάνεται στα Windows και λειτουργεί στο επίπεδο χρήστη.

    Έτσι, είναι απαραίτητο να οικοδομηθεί μια λύση από δύο έργα: εφαρμογή κονσόλας και οδηγός.

    Για να αναπτύξετε προγράμματα οδήγησης μαζί σας πρέπει να είναι προ-:

    - μέσο DDK,

    - Εγκαταστήστε τη μεταβλητή περιβάλλοντος WNNBASE (PATH PATH PATH, για παράδειγμα, π.χ., E: \\ WINDDK \\ 3790.1830).

    Το έργο με τον οδηγό πρέπει να είναι ένας τύπος μακιγιάζ.

    Κάντε τις ρυθμίσεις του έργου χρησιμοποιώντας τις ρυθμίσεις εφαρμογής και στο πεδίο Build Command Line για να καταγράψετε μια συμβολοσειρά

    ddkbuild -wnetxp chk. -CEZ.

    Τι κάνει η πρόκληση ενός ειδικού σεναρίου για την επικοινωνία VC με το DDK

    Ο τρέχων φάκελος του έργου πρέπει να περιέχει αρχεία:

    Πηγές, makefile, ddkbuild.cmd (script), πρόγραμμα οδήγησης αρχείου πηγής.C

    Μετά την οικοδόμηση ενός έργου, ο οδηγός πρέπει να έχει επέκταση. SYS.

    Η εφαρμογή εγκαινιάζει το πρόγραμμα οδήγησης Beeper.sys, δηλ. Το καθορίζει στο μητρώο και εγκαινιάζει την εργασία. Στη συνέχεια, μετά την ολοκλήρωση, αφαιρεί από το μητρώο.

    Για την εφαρμογή του οδηγού, μετά την οικοδόμηση μιας λύσης που αποτελείται από δύο έργα - εφαρμογές και οδηγούς, πρέπει να τοποθετήσετε το εκτελέσιμο αρχείο εφαρμογής και τον οδηγό σε ένα φάκελο και, στη συνέχεια, να ξεκινήσετε την εφαρμογή.

    Οι οδηγοί είναι πολύ δύσκολο να εντοπιστούν. Σε περίπτωση σφαλμάτων στη λειτουργία, η λειτουργία είναι πιο συχνά κατάψυξη και απαιτείται επανεκκίνηση. Και για τον οδηγό μας, μετά την επανεκκίνηση, πρέπει επίσης να διαγράψετε την υπηρεσία Beeper06 από το μητρώο χρησιμοποιώντας το REGEDIT (HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentConlset \\ Services \\) και, στη συνέχεια, επανεκκίνηση.

    1.2 Οδηγοί εικονικής συσκευής Windows

    Μέχρι τώρα, έχουμε αναπτύξει έναν οδηγό λειτουργίας πυρήνα που μπορεί να κάνει ό, τι δεν μπορεί να βρίσκεται στο επίπεδο του χρήστη, ειδικότερα, να συνεργαστεί με τις θύρες / εξόδου. Ένας τέτοιος οδηγός ονομάζεται οδηγός πυρήνα, αλλά όχι οδηγός συσκευής, επειδή τα δεδομένα μεταξύ του προγράμματος χρήστη και της συσκευής δεν μεταδίδονται (μετά από όλα, το πρόγραμμα οδήγησης είναι συνήθως απαραίτητο; Για να οργανώσετε την ανταλλαγή δεδομένων μεταξύ της εφαρμογής χρήστη και συσκευής).

    Τώρα θα αναπτύξουμε οδηγούς συσκευών που μεταδίδουν δεδομένα και πίσω μεταξύ της εφαρμογής χρήστη και της συσκευής.

    Όταν η εφαρμογή απαιτεί λειτουργία A / OUT, ο οδηγός απευθύνεται. Για να το κάνετε αυτό, η εφαρμογή μπορεί να δώσει ένα αίτημα για ανάγνωση δεδομένων από τη συσκευή ή να καταγράψει δεδομένα στη συσκευή. Και αν απαιτείται κάποια άλλη ενέργεια, για παράδειγμα, μια έρευνα ή έλεγχος της συσκευής, ή κάτι άλλο, το λεγόμενο χρησιμοποιείται για αυτό. IOCTL Interface (Control in-out).

    Θα εξετάσουμε αυτή τη συγκεκριμένη περίπτωση για εικονικές συσκευές, επειδή συνήθως, γιατί χρειάζεστε μια εικονική συσκευή στον οδηγό; Έτσι ώστε να μπορείτε να μεταφέρετε τα δεδομένα της που ο οδηγός μπορεί με κάποιο τρόπο να επεξεργάζεται (όπως είναι αδύνατο στην εφαρμογή) και να επιστρέψει το αποτέλεσμα στην εφαρμογή. Θυμηθείτε ότι ο συνηθισμένος οδηγός πυρήνα, που συζητήθηκε νωρίτερα, δεν πήρε τίποτα από την εφαρμογή και δεν επέστησε τίποτα εκεί, αλλά απλά έκανε δράσεις απρόσιτες για την εφαρμογή.

    Όταν η εφαρμογή απαιτεί λειτουργία A / OUT, ο οδηγός απευθύνεται. Αυτό μπορεί να χρησιμοποιηθεί από το λεγόμενο. IOCTL Interface (Control in-out).

    Η εφαρμογή κλήσης εκτελεί τις ακόλουθες ενέργειες:

    1) Άνοιγμα του αρχείου και τη λήψη του περιγραφέα πληροφορικής:

    Generic_read + generic_write, 0, , open_existing, 0, null

    Ως αποτέλεσμα, αν όλα συμβαίνουν με επιτυχία, λαμβάνουμε έναν περιγραφέα συσκευής.

    2) Αποστολή οδηγού κίνησης εγκυρότητας (τι πρέπει να κάνετε, ο οδηγός μπορεί να υλοποιήσει πολλές διαφορετικές ενέργειες):

    Επισημαίνει το DecomeioControl, τον περιγραφέα, τον κωδικό δράσης, τη διεύθυνση buffer, το μέγεθος των δεδομένων εισόδου, το μέγεθος των δεδομένων εισόδου, τη διεύθυνση απομόνωσης εξόδου, το μέγεθος της εξόδου, τη διεύθυνση buffer για έναν πραγματικό αριθμό bytes

    3) Κλείσιμο του αρχείου και, κατά συνέπεια, η απελευθέρωση του περιγραφέα.

    Επισημαίνει τον περιγραφέα συσκευής CloseHandle

    Για τη μετάδοση δεδομένων, οι μονάδες (εφαρμογή και οδηγός) πρέπει να συμφωνήσουν στο πρωτόκολλο αλληλεπίδρασης (κωδικοί δράσης, τη δομή των ρυθμιστικών διαλύματος - εισόδου και εξόδου).

    Ο ίδιος κωδικός δράσης χρησιμοποιείται επίσης στην εφαρμογή και στον οδηγό.

    Ένας κωδικός δράσης στην εφαρμογή και στον οδηγό μπορεί να καταγραφεί σε μια 16-πτυσσόμενη μορφή και μπορείτε να χρησιμοποιήσετε τη μακροεντολή CTL_CODE, όπως γίνεται στο παράδειγμα του εργαστηρίου. Λειτουργεί στο αρχείο COUND.IC.

    Εξετάστε ένα παράδειγμα ενός κώδικα δράσης από έναν οδηγό εικονικής συσκευής, το οποίο χρησιμοποιείται σε εργαστηριακή εργασία. Όνομα - ioctl_get.

    Στην περίπτωση μιας εικονικής συσκευής, η σημαία αρχείου είναι 0.

    Τύπος συσκευής - File_device_unknown \u003d 22 ώρες

    Δικαιώματα πρόσβασης - file_read_access + file_write_access \u003d 1 + 2 \u003d 3 \u003d 11b

    Λειτουργικός κώδικας - στην περιοχή από 800h έως fffh. Έχουμε 800h.

    Μέθοδος συμπλέγματος - Μέθοδος μεταφοράς δεδομένων μεταξύ της εφαρμογής και του οδηγού (τρεις):

    Για μια μικρή ποσότητα δεδομένων, χρησιμοποιείται συνήθως μέθοδος_Buffered (00b) - ένα επιπλέον ρυθμιστικό επισημαίνεται σε επαρκή μνήμη, επαρκή για την τοποθέτηση του ρυθμιστικού διαλύματος εισόδου και εξόδου. Η διεύθυνση αυτού του ρυθμιστικού διαλύματος βρίσκεται στο IRP στο πεδίο Antondirpp.Systembuffer. Ο ίδιος ο αποστολέας I / O αναλαμβάνει τη λειτουργία των δεδομένων επανεγγραφής μεταξύ του χρήστη και του πρόσθετου ρυθμιστικού διαλύματος.

    Άμεση πρόσβαση δεδομένων (χωρίς buffer) - Μέθοδος_out_direct (2) - Για έξοδο είτε Metod_IN_Direct (1) - για είσοδο. Πεδίο από IRP - Mdladdress. Αυτή είναι μια άμεση κλήση - ο διαχειριστής / εξόδου καθορίζει τις φυσικές σελίδες που περιέχουν το ρυθμιστικό μέσου χρήστη. Ταυτόχρονα, δημιουργεί μια βοηθητική δομή του MDL (λίστα περιγραφών μνήμης) για να περιγράψει σταθερές σελίδες. Και ο προγραμματιστής οδηγών λειτουργεί με το MDL.

    Πρόσβαση μέσω ρυθμιστικού διαλύματος επιπέδου χρήστη - Μέθοδος_Δεν, (3). Πεδίο από IRP - Systembuffer. Ο αποστολέας I / OFF στέλνει την εικονική διεύθυνση της λειτουργίας χρήστη στο πρόγραμμα οδήγησης. Και στον οδηγό πρέπει να εργαστείτε πολύ προσεκτικά, επειδή ο οδηγός σε αυτή την περίπτωση θα πρέπει να λειτουργεί μόνο στο πλαίσιο του καλούντος.

    Όταν η εφαρμογή στέλνει τον οδηγό κώδικα δράσης, ξεκινά ο αποστολέας I / O. Είναι υπεύθυνο για τη δημιουργία ενός πακέτου ερωτήματος I / O (πακέτο αιτήματος I / O, IRP) και την αποστολή του στον οδηγό για περαιτέρω επεξεργασία.

    Θα εξετάσουμε 3 τύπους αιτήσεων:

    IRP_MJ_Create - θα μεταφερθεί με δημιουργία δημιουργίας,

    IRP_MJ_DEVICE_CONTROL - θα μεταδοθεί με DecomonioControl

    Ipr_mj_close - με closeHandle

    Το πακέτο IRP αποτελείται από μια κεφαλίδα και στοίβες τοποθέτησης A / OUT. Ο / ο διαχειριστής εξόδου δημιουργεί τον αριθμό των ακτινοβολούμενων κυττάρων στοίβας ίσο με τον αριθμό των οδηγών που εμπλέκονται στην επεξεργασία αιτήσεων. Κάθε οδηγός επιτρέπεται πρόσβαση στο δικό του κελί στοίβας. Όταν ο οδηγός μεταδίδει το πακέτο IRP του οδηγού χαμηλότερου επιπέδου, ο δείκτης προς το κύτταρο στοίβας μετακινείται στο κύτταρο που είναι απαραίτητο για αυτό το πρόγραμμα οδήγησης. Και, αντίθετα, μετά την επεξεργασία του ερωτήματος, ο δείκτης ανεβαίνει στο κύτταρο κίνησης του υψηλότερου επιπέδου. Να πάρει έναν δείκτη χρησιμοποιώντας τη λειτουργία iogetcurrentStackLocation ().

    Σε κάθε στοίβα τοποθέτησης υπάρχει ένας δείκτης στο αντικείμενο DeviceObject και στο αντικείμενο FileObject για το οποίο ξεκινάει το ερώτημα. Τα πακέτα IRP αποθηκεύονται πάντοτε σε αφόρητη μνήμη.

    Τα παρακάτω αντικείμενα δημιουργούνται για τη λειτουργία του προγράμματος οδήγησης και ισχύουν:

    Αντικείμενο οδηγού?

    Συσκευές αντικειμένων.

    Στάδια λειτουργίας του οδηγού.

    1) Δημιουργία αντικειμένου οδηγού. Δημιουργήθηκε κατά τη φόρτωση του οδηγού στο στάδιο έναρξης. Αυτή τη στιγμή, η λειτουργία Drivereentry ξεκινά και η διάταξη της διαύκλισης γεμίζεται, καθώς και ένας δείκτης στο αντικείμενο της συσκευής και την πλάτη.

    Η συσκευή περιλαμβάνει:

    Τύπος συσκευής.

    2) Δημιουργία συμβολικού συνδέσμου στη συσκευή. Προκειμένου το αντικείμενο "συσκευής" να είναι διαθέσιμο στον κωδικό λειτουργίας χρήστη, το πρόγραμμα οδήγησης πρέπει να δημιουργεί στον κατάλογο προσβάσιμων λειτουργιών χρήστη (λειτουργία χρήστη) "\\" Ένα άλλο αντικείμενο είναι ένας συμβολικός σύνδεσμος (συμβολικός σύνδεσμος). Το πρόγραμμα οδήγησης Shablon.sys δημιουργεί τη συμβολική σύνδεση Slshabloon στη συσκευή του "Devshablon" στον κατάλογο "\\ \\", η τιμή της οποίας είναι η συμβολοσειρά "\\ \\ \\ devshablow".

    Έτσι, ήδη κατά τη φόρτωση του προγράμματος οδήγησης (στην περίπτωσή μας, στο στάδιο λήψης του OS), έχουμε τρία αντικείμενα στη μνήμη: οδηγός "\\ driver \\ shablon", συσκευή "\\ device \\ shablon" και ένας συμβολικός σύνδεσμος στη συσκευή " \\ Slshoblon ".

    3) Άνοιγμα. Περαιτέρω, όταν ξεκινήσει η εφαρμογή, καλείται δημιουργία. Υπάρχει ένας σύνδεσμος προς τη συσκευή. Από τη δομή της συσκευής συσκευής_Object, οι πληροφορίες ανακτώνται πληροφορίες σχετικά με τη μονάδα συντήρησης. Ο αποστολέας I / O σχηματίζει το IRP I / O Package Package Package IRP_MJ_Create και το κατευθύνει για να οδηγεί. Έτσι ο οδηγός μαθαίνει ότι ο κωδικός λειτουργίας χρήστη προσπαθεί να έχει πρόσβαση στη συσκευή του. Εάν ο οδηγός δεν έχει τίποτα έναντι, τότε επιστρέφει τον κώδικα επιτυχίας. Ο οδηγός μας έχει μια ειδική διαδικασία αποστολής που ανταποκρίνεται σε αυτό το IRP - DispatchCreSeclose (υπάρχει μια συνδυασμένη διαδικασία για το άνοιγμα και το κλείσιμο της συσκευής). Στο πεδίο io.status.status μεταδίδεται από το status_success, και στο io.status.information - 0, επειδή Σε αυτή την περίπτωση, τίποτα δεν χρειάζεται να μεταδοθεί. Μια τέτοια απάντηση από τον οδηγό είναι ένα σήμα στον αποστολέα αντικειμένων για τη δημιουργία ενός εικονικού αρχείου. Ταυτόχρονα, δημιουργείται ένα νέο στοιχείο με δείκτη στο αντικείμενο "αρχείου" στον πίνακα περιγραφικού (πίνακας χειρισμού) και ένας νέος περιγραφέας επιστρέφεται στη λειτουργία χρήστη.

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

    4) Λειτουργίες καπακιού. Τώρα έχουμε την ευκαιρία να διαχειριστούμε τη λειτουργία αυτής της συσκευής, καλώντας τις λειτουργίες DomonuiooControl. Δεδομένου ότι ο οδηγός της συσκευής μπορεί, κατ 'αρχήν, να εκτελέσει πολλά διαφορετικά καθήκοντα, είναι απαραίτητο να διαφοροποιηθούν με κάποιο τρόπο να διαφοροποιηθούν. Για το σκοπό αυτό, η δεύτερη παράμετρος dwiocontrolcode προορίζεται, ονομάζεται κωδικός ελέγχου κώδικα ελέγχου I / O (κωδικός ελέγχου I / O), ο οποίος είναι κατασκευασμένος σύμφωνα με ορισμένους κανόνες.

    Χρησιμοποιώντας τον περιγραφέα της συσκευής, η αποστολή I / O θα λάβει πληροφορίες σχετικά με το πρόγραμμα οδήγησης εξυπηρέτησης, θα σχηματίσει ένα πακέτο ρώτησης I / O τύπου IRP_MJ_DEVICE_Control και το κατευθύνει για να οδηγήσει. Ο οδηγός θα προκληθεί από την αντίστοιχη διαδικασία DispatchControl, την οποία μεταδίδονται οι κωδικοί δράσης και οι πληροφορίες σχετικά με τις διευθύνσεις και το μέγεθος του ρυθμιστικού διαλύματος εισόδου και εξόδου ως παράμετροι. Όλα αυτά μεταδίδονται μέσω IRP. Η διαδικασία IRP λαμβάνει τις απαραίτητες πληροφορίες: ένας κωδικός δράσης, μια διεύθυνση buffer δεδομένων.

    Η διαδικασία DispatchControl εκτελεί τις απαραίτητες ενέργειες, στην περίπτωσή μας, η διεύθυνση πακέτου IRP από το μητρώο ESI στη συνέχεια μεταδίδει το αποτέλεσμα μέσω του ρυθμιστικού εξόδου στην εφαρμογή.

    Παρόμοια με την προηγούμενη διαδικασία, περνούν μέσω της κατάστασης τερματισμού του IRP και τον αριθμό των bytes που μεταδίδονται από τον οδηγό.

    Στην εφαρμογή, αυτά τα δεδομένα είναι μορφοποιημένα και έξοδο.

    5) κλείσιμο. Δεδομένου ότι θα πρέπει να αντιμετωπίζεται με περιγραφείς, τα οποία δεν χρειάζονται πλέον, καλώντας τη λειτουργία closeHandle, κλείνοντας τον περιγραφέα της συσκευής.

    6) Εκφόρτωση οδηγού. Διαγράψτε έναν συμβολικό σύνδεσμο και διαγράψτε το αντικείμενο της συσκευής.

    Το συγκρότημα (2) αποτελείται από δύο προγράμματα:

    Η εφαρμογή που αναφέρεται στον οδηγό πίσω από τη διεύθυνση IRP και, στη συνέχεια, αυτή η διεύθυνση εμφανίζει τα Windows στο πρότυπο παράθυρο.

    Shablon.sys - οδηγός.

    Ο οδηγός Shablon δεν κάνει στο επίπεδο του χρήστη, στην περίπτωση αυτή ορίζει τα περιεχόμενα του μητρώου ESI κατά τη διάρκεια του προγράμματος οδήγησης.

    Η εφαρμογή στο Buffer Output λαμβάνει τα περιεχόμενα του ESI, το μετατρέπει στην έξοδο σε δεκαεξαδικό και εμφανίζει τα Windows στο πρότυπο παράθυρο.

    Εάν πρέπει να λαμβάνετε πληροφορίες από την CMOS στον οδηγό, τότε απαιτείται:

    Στείλτε στο Port 70h Offset στο CMOS, το οποίο μας ενδιαφέρει.

    Χαμηλή καθυστέρηση.

    Πάρτε από τις πληροφορίες του λιμένα 71h στο al.

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

    Και στην εφαρμογή πρέπει να λάβετε πληροφορίες από το buffer output, εάν χρειάζεται, να το μετατρέψετε και να εμφανίσετε ή να αναλύσετε και, ανάλογα με το αποτέλεσμα, εμφανίστε το απαραίτητο κείμενο στο πρότυπο παράθυρο.

    Σε αυτή την εργαστηριακή εργασία θεωρείται ότι ο οδηγός είναι εγκατεστημένος συνεχώς στα Windows χρησιμοποιώντας το αρχείο .inf Το αρχείο χρησιμοποιώντας το στοιχείο για να εγκαταστήσετε τον εξοπλισμό από τον πίνακα ελέγχου: Προσθήκη νέας συσκευής, Εγκατάσταση από το δίσκο, επιλέξτε όλες τις συσκευές, file.inf (Ο οδηγός πρέπει να είναι στον ίδιο φάκελο).

    Για να βεβαιωθείτε ότι ο οδηγός έχει οριστεί, επιλέξτε το σύστημα, τον εξοπλισμό, τον διαχειριστή συσκευών στον πίνακα ελέγχου.

    1.3 Πρόσβαση σε υπάρχοντες οδηγούς από εφαρμογές του καθεστώτος χρήστη

    Ο αλγόριθμος της εφαρμογής του οδηγού που συνεργάζεται με τον οδηγό

    Για να συνεργαστείτε με τον οδηγό του οδηγού, πρέπει να πάρετε ένα πρόγραμμα οδήγησης χειρισμού (λαβή). Αυτός ο χειριστής μπορεί να ληφθεί χρησιμοποιώντας τη λειτουργία Createfile ή Createfilea API που λειτουργεί με χαρακτήρες ASCII. Περαιτέρω χρησιμοποιεί τη λειτουργία API DomumonioControl, η οποία, ως μία από τις παραμέτρους, ο κωδικός IOCTL μεταδίδεται. Ο κωδικός IOCTL είναι ένας κώδικας διαχείρισης με τον οποίο ο οδηγός θα μάθει σχετικά με τη λειτουργία, η εκτέλεση του οποίου ζητά την εφαρμογή, τη μέθοδο των παραμέτρων μετάδοσης και τα δικαιώματα πρόσβασης που απαιτείται η εφαρμογή αυτής της λειτουργίας. Μετά την προκληθείσα εφαρμογή

    Το DroperioControl Drive αποστέλλεται IRP_MJ_DEVICE_CONTROL. Μετά την ολοκλήρωση της επεξεργασίας, οι αιτήσεις εφαρμογής επιστρέφουν τη διαχείριση και η εφαρμογή παραμένει η ανάλυση της απόκρισης του οδηγού και των στενών ανοικτών περιγραφών.

    Παράδειγμα

    Στο παρακάτω παράδειγμα, η εφαρμογή λειτουργίας χρήστη στέλνει το πρόγραμμα οδήγησης συστήματος του συστήματος ioctl_disk_get_partition_info_ex query_ex, αναλύει τις πληροφορίες που λαμβάνει και εμφανίζει τη μορφή του διαμερίσματος σκληρού δίσκου.

    #Περιλαμβάνω.

    #Περιλαμβάνω.

    int _tmain (int ARGC, _TCHAR * ARGV)

    Dword dwbytesreturned \u003d 0;

    char cpartitionstyle \u003d (0);

    Partition_information_ex pipartitionInfo;

    Χειριστείτε hdevice \u003d createfilea (

    /*1*/"\\\\\\\\\\\\\\

    / * 2 * / generic_read | Generic_write

    / * 3 * / file_share_read | File_share_write,

    / * 5 * / open_existing,

    αν (hdevice \u003d\u003d invalid_handle_value)

    MessageBoxa (NULL, "Createfilea Error!", "Σφάλμα", 0).

    αν (DecomoniooControl (

    / * 1 * / (λαβή) hdevice,

    / * 5 * / & PipartitionInfo,

    / * 6 * / Μέγεθος (PipartitionInfo),

    / * 7 * / & dwbytesreturned,

    αν (PipartitionInfo.PartitionStyle \u003d\u003d partition_style_mbr)

    Messageboxa (, "partition_style_mbr", "λεζάντα", 0);

    Αλλιώς εάν (PipartitionInfo.PartitionStyle \u003d\u003d partition_style_gpt)

    Messageboxa (, "partition_style_gpt", "λεζάντα", 0).

    Messageboxa (, "partition_style_raw", "λεζάντα", 0).

    MessageBoxa (NULL, "Σφάλμα DecomonioControl", "Σφάλμα", 0).

    CloseHandle (hdevice);

    Τοποθετήστε ένα παράδειγμα

    Οι μεταβλητές που απαιτούνται για την εφαρμογή ανακοινώνονται. Το Partition_information_ex είναι μια δομή που περιγράφει τις πληροφορίες σχετικά με το τμήμα σκληρού δίσκου.

    typedef struct (

    ) Partition_information_ex;

    Σε αυτό το μέρος του προγράμματος, η λειτουργία Createfilea καλείται να λάβει έναν χειριστή, το οποίο είναι γραμμένο στη μεταβλητή Hdevice.

    Η λειτουργία DecomonioConLol ονομάζεται συγχρονισμένος. Μεταδίδεται:

    Συσκευή περιγραφής;

    Ioctl κωδικός ioctl_disk_get_partition_info_ex;

    δείκτης στο buffer εισόδου, null στην περίπτωσή μας.

    Μέγεθος ρυθμιστικού διαλύματος εισόδου.

    Δείκτης στο ρυθμιστικό εξόδου.

    Μέγεθος ρυθμιστικού εξόδου.

    Δείκτης στη μεταβλητή τύπου DWORD στην οποία θα αποθηκευτεί ο αριθμός των επιστροφών Bytes.

    Ο δείκτης στην επικαλυπτόμενη δομή, η οποία χρησιμοποιείται για μια ασύγχρονη κλήση λειτουργίας.

    Μετά την επιστροφή του ελέγχου, σε περίπτωση επιτυχούς ολοκλήρωσης της λειτουργίας, στη δομή Partition_information_ex, το τμήμα αποθηκεύεται.

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

    2. Εκτέλεση μαθημάτων

    2.1 Βήμα 1.

    Το έργο: 1. Αναπτύξτε έναν οδηγό πυρήνα με πρόσβαση σε θύρες, εκτελώντας ενέργειες σύμφωνα με μια επιλογή και πληροφορίες εξόδου στο παράθυρο View Debug (προαιρετικό), καθώς και μια εφαρμογή που εκτελεί τον οδηγό.

    Καταχώρηση kurs_test.cpp.

    #Include "stdafx.h"

    #Include "Windows.h"

    #include "stdlib.h"

    Sc_handle hscmanager?

    Sc_handle hservice;

    char acdriverpath;

    αν (HSCManager! \u003d 0) (

    // Εγγραφή του παίκτη στον πίνακα αποστολής Scmanager

    αν (hservice! \u003d 0) (

    // Διαγραφή εγγραφής οδηγού

    Deleteservice (hservice);

    CloseserviceHandle (HService).

    Επιστροφή 0;

    }

    Καταχώρηση beeper.sys

    #Περιλαμβάνω.

    #Define timer_frequency 1193167 // 1,193,167 Hz

    #Define pitch_c 523 // 523,25 Hz

    #Define pitch_cs 554 // 554,37 Hz

    #Define pitch_d 587 // 587,33 Hz

    #Define pitch_ds 622 // 622,25 Hz

    #Define pitch_e 659 // 659,25 Hz

    #Define pitch_f 698 // 698,46 Hz

    #Define pitch_fs 740 // 739,99 Hz

    #Define pitch_g 784 // 783,99 Hz

    #Define pitch_gs 831 // 830,61 Hz

    #Define pitch_a 880 // 880.00 Hz

    #Define pitch_as 988 // 987,77 Hz

    void do_delay (Ώρα INT) (

    Μακρύς, j;

    για (i \u003d 0; i<=time*0xfffff; i++) {}

    }

    void do_big_delay (Ώρα INT) (

    Do_delay (2 * ώρα);

    }

    Κενό ξυλόφωνο (int npitch) (

    int ntone \u003d timer_frequency / npitch

    _asm (

    mOV AL, 10110110B; // Εγγραφή μιας λέξης ελέγχου στο 43h

    Έξω 43h, al; // κανάλι ελέγχου ήχου - λογικό διάγραμμα χρησιμοποιώντας χρονοδιακόπτη τόνου και ελεγχόμενο λογισμικό θύρας συστήματος συστήματος

    mOV EAX, NTONE; // Εγγραφή από την εγγραφή συχνότητας στο 42

    out 42h, al; // senior

    mov Al, Ah; // Junior

    out 42h, Al

    Στο al, 61h; // αλλάξτε την ακολουθία ελέγχου - ο μετασχηματισμός των τελευταίων δυαδικών ψηφίων ανά μονάδα

    · // bit 0 - άδεια χρήσης ομιλητών

    · // Bit 1 - Χρονόμετρο άδειας σύνδεσης-2 στο ηχείο

    ή al, 00000011b; Ομιλητής.

    out 61h, al

    }

    Do_delay (0x7f);

    _asm (

    σε al, 61h

    και al, 11111100b; Απενεργοποιημένο ηχείο.

    out 61h, al

    }

    }

    Xylophone (Pitch_c);

    Xylophone (Pitch_s);

    Xylophone (Pitch_s);

    Xylophone (Pitch_s);

    Xylophone (Pitch_s);

    Xylophone (Pitch_s);

    Xylophone (Pitch_s);

    Επιστροφή status_device_configuration_error;

    }

    2.2 Βήμα 2.

    Αναπτύξτε ένα πρόγραμμα οδήγησης εικονικής συσκευής που σας επιτρέπει να εκτελέσετε ενέργειες διαθέσιμες μόνο στο μηδενικό επίπεδο των προνομίων (σύμφωνα με την επιλογή) και, στη συνέχεια, μεταφέρετε τα αποτελέσματα στην εφαρμογή σε 3 επίπεδα προνομίων για να τις εμφανίσετε στην οθόνη.

    Η εφαρμογή εμφανίζει το αποτέλεσμα στο πρότυπο παράθυρο των Windows.

    Listing Shablon.c.

    #Περιλαμβάνω. // Διάφοροι ορισμοί NT

    #Περιλαμβάνω.

    Unicode_string g_usdevicename;

    Unicode_string g_ussymboliklinkname?

    Κενό οδήγησης (στο pdriver_object pdiverobject) (

    IodeletesymboliclinkLink (& g_ussymboliclinkname);

    IODELETEDEVIE (PDRIVEROBJECT-\u003e DEVICEOBJECT);

    }

    NTSTATUS DispatchCreSeclose (Pdevice_Object PdeviceObject, PIRP PIRP) (// MJ_Create MJ_CLOSE Επεξεργασία

    piRP-\u003e iostatus.status \u003d status_success;

    pIRP-\u003e iostatus.information \u003d 0;

    IOCULLETEREREQUEST (PIRP, IO_NO_INCRENT);

    Επιστρέψτε το status_success;

    }

    Ntstatus dispatchcontrol (pdevice_object pdeviceobject, pip piPP) (// επεξεργασία IRP_MJ_Devicecontrol

    Κατάσταση ntstatus;

    iNT REGESI.

    // Πάρτε ένα δείκτη στο io_stack_location, σε αυτό στο iocontrolcode

    Εάν (PIRP-\u003e TAIL.OVERLAY.CURRENTSCACELOCATECH-\u003e PARAMETERS.DEVICEICONTROL.IOCONTROLCODE \u003d\u003d iOCTL_GET) (

    // Συγκρίνετε τον κώδικα της ενέργειας και αν είναι ο πελάτης μας, τότε:

    _asm (

    mOV EAX, 0

    mov Al, 10h

    out 70h, al

    στο al, 71h

    cbw.

    cwde.

    mOV REGESI, EAX

    }

    // Αυτή είναι η λειτουργικότητά μας - παίρνουμε το περιεχόμενο του μητρώου ESI

    // γράψτε το στο buffer του συστήματος

    * ((INT *) PIRP-\u003e AN αριθμού) \u003d regesi;

    pIRP-\u003e iostatus.Information \u003d 4; // και ορίστε το μέγεθος του αποτελέσματος

    Κατάσταση \u003d status_success;

    ) Αλλιώς κατάσταση \u003d status_invalid_device_request;

    pIRP-\u003e iostatus.status \u003d κατάσταση;

    IOCULLETEREREQUEST (PIRP, IO_NO_INCRENT);

    Επιστροφή (κατάσταση);

    }

    int Drowerentry (στο Pdriver_Object PdriverObject, στο Pusricode_string Pusregistrypath) (

    Κατάσταση ntstatus;

    Pdevice_object pdeviceobject;

    // Αρχικοποιήστε τις γραμμές Unicode

    Rtlinitunicodestring (& g_usdevicename, l "\\\\ συσκευή \\\\ devget");

    Rtlineiticodestring (& g_ussymboliklinkname, l "\\\\ \\\\ sldevget");

    // Συμπληρώστε το αντικείμενο του οδηγού - εξηγήστε πλέον κατανοητά τον οδηγό που διαθέτει τις διαδικασίες

    pdriverObject-\u003e Driverununload \u003d

    pDRiverObject-\u003e Μεγέθυνση \u003d

    pDRiverObject-\u003e Μεγέθυνση \u003d

    pDRiverObject-\u003e Μεγέθυνση \u003d

    // Δημιουργήστε ένα λογικό αντικείμενο μιας εικονικής συσκευής

    Κατάσταση \u003d iocreAseedevice (PDViverObject, 0, & G_USDEVICENAME, File_device_unknown, 0, False & PdeviceObject);

    Αν (! Nt_success (κατάσταση)) (κατάσταση επιστροφής;)

    // Δημιουργήστε έναν συμβολικό σύνδεσμο στη συσκευή

    Κατάσταση \u003d iocreaSymbolicLink (& g_ussymboliclinkname, & g_usdevicename);

    Αν (! Nt_success (κατάσταση)) (

    Iodeletevice (pdeviceobject);

    Κατάσταση επιστροφής.

    }

    Κατάσταση επιστροφής.

    }

    Καταχωρίστε το μάθημα2.CPP

    #Include "stdafx.h"

    #Include "Windows.h"

    #include "stdlib.h"

    #Define ioctl_get ctl_code (file_device_unknown, 0x800, method_buffered, file_read_access + file_write_access)

    int _tmain (int argc, _tchar * agnv) (

    Χειριστείτε το hdevice.

    Bool devcontrol;

    Dword dwnetesrentured?

    char stroka;

    /*

    Παράμετροι:

    lpfilename τη διεύθυνση της συμβολοσειράς μηδενικού σκορ που ορίζει το όνομα του αντικειμένου για να το δημιουργήσει ή να ανοίξει.

    dwdesiedaccess είδος εμπορευμάτων στο αντικείμενο. Αυτή η παράμετρος μπορεί να πάρει οποιοδήποτε συνδυασμό των ακόλουθων τιμών:

    Σημασία: Περιγραφή:

    0 Καθορίζει ένα αίτημα για τη διαθεσιμότητα ενός αντικειμένου στην καθορισμένη συσκευή. Η εφαρμογή μπορεί να ζητήσει τα χαρακτηριστικά της συσκευής, χωρίς πρόσβαση σε αυτήν.

    Generic_read ορίζει την πρόσβαση ανάγνωσης από το αντικείμενο. Τα δεδομένα μπορούν να διαβαστούν από το αρχείο και ο δείκτης αρχείου μπορεί να μετακινηθεί. Συνδυάστε με generic_write για πρόσβαση στην ανάγνωση-εγγραφή.

    Generic_write ορίζει την πρόσβαση σε ένα αντικείμενο. Τα δεδομένα μπορούν να εγγραφούν σε ένα αρχείο και μπορεί να μετακινηθεί ένας δείκτης αρχείου. Συνδυάστε με το Generic_Read για να αποκτήσετε πρόσβαση σε Read-Write.

    demsharemode ο τρόπος κοινόχρηστης πρόσβασης στο αντικείμενο. Με μηδενικές τιμές, το αντικείμενο δεν μπορεί να χρησιμοποιηθεί με πολλά προγράμματα. Όλες οι επακόλουθες λειτουργίες του αντικειμένου θα αποτύχουν έως ότου κλείσει ο περιγραφέας του αντικειμένου. Για να μοιραστείτε το αντικείμενο, χρησιμοποιήστε ένα συνδυασμό των ακόλουθων τιμών:

    Σημασία: Περιγραφή:

    Το File_share_delete επιτρέπει μια ακολουθία αντικειμένων ανοιχτού λειτουργιών για να ζητήσει πρόσβαση στην κατάργηση.

    Το αρχείο_share_read επιτρέπει μια ακολουθία λειτουργιών ανοίγματος για να ζητήσει την πρόσβαση ανάγνωσης.

    Το αρχείο_share_write επιτρέπει μια ακολουθία λειτουργιών ανοίγματος για να ζητήσει μια καταχώρηση

    lpsecurityattributes τη διεύθυνση της δομής ασφαλείας_attributes, η οποία καθορίζει εάν ο περιγραφέας που επιστρέφεται από τη λειτουργία πρέπει να κληρονομείται από μια παιδική διαδικασία.

    Εάν το lpsecurityttributes είναι ίσο με το , ο περιγραφέας δεν μπορεί να κληρονομηθεί.

    Νίκη

    Σημασία: Περιγραφή:

    Το Create_always δημιουργεί ένα νέο αρχείο, πάντα.

    Εάν υπάρχει το αρχείο, η λειτουργία αντικαθιστά το αρχείο.

    Create_new δημιουργεί ένα νέο αρχείο. Η λειτουργία θα ολοκληρωθεί με σφάλμα αν υπάρχει το αρχείο.

    Open_always ανοιχτό αρχείο, πάντα. Εάν το αρχείο δεν υπάρχει, η συνάρτηση το δημιουργεί με τον ίδιο τρόπο αν η κατοικία θα είναι creative_new.

    Το Open_Existing ανοίγει το αρχείο. Η λειτουργία θα ολοκληρωθεί με σφάλμα εάν το αρχείο δεν υπάρχει.

    Το Truncate_existing ανοίγει το αρχείο και το κόβει στο μηδενικό μέγεθος. Η λειτουργία θα ολοκληρωθεί με σφάλμα εάν το αρχείο δεν υπάρχει.

    dwflagsandattributes Σημαίες και χαρακτηριστικά αρχείων.

    Όταν ανοίγει ένα υπάρχον αρχείο, ο Createfile αγνοεί το αρχείο προτύπου.

    Επιστροφή τιμών:

    Εάν η λειτουργία είναι επιτυχής, η ανοιχτή λαβή του καθορισμένου αρχείου επιστρέφεται. Εάν το καθορισμένο αρχείο υπάρχει πριν καλέσετε τη λειτουργία και η παράμετρος της νάξας είναι ίση με τη δημιουργία_always ή open_always, η κλήση GetLasterRor θα επιστρέψει το ERROR_ALREADY_EXISTS, ακόμα και αν η λειτουργία είναι επιτυχής. Εάν το αρχείο δεν υπάρχει πριν από την κλήση, ο Getlastterterror θα επιστρέψει 0 (μηδέν).

    Σε περίπτωση σφάλματος, η λειτουργία θα επιστρέψει Invalid_Handle_Value. Για περισσότερες πληροφορίες σφάλματος, καλέστε το GetLastterRor.

    */

    αν (hdevice! \u003d 0) (

    /*

    Η Hdevice είναι μια λαβή, έχτισε το δημιουργικό "ohm".

    Το dwiocontrolcode είναι μια τιμή που καθορίζει το αδιαφανές που πρέπει να εκτελεστεί.

    Το Lpinbuffer είναι ένα συγκολλητικό bouffer, το οποίο παρέχεται από τα δεδομένα που απαιτούνται για την εκτέλεση της λειτουργίας που καθορίζεται στο dwiocontrolcode. Εάν η οπωρώνα δεν αμαυρώνει τα δεδομένα, μπορείτε να μετακινήσετε το NULL.

    Το Ninbuffersize είναι ένα pazmp στα δεδομένα bytes στο μπουκέτο, το οποίο ο Lpinbuffer καθορίζει πάνω στους οποίους.

    Το Lpoutbuffer είναι ένα συγκολλητικό bouffer, το οποίο θα απελευθερωθεί από την έξοδο όταν το The Wavend είναι επιτυχημένο. Εάν η οπαδός δεν καθορίζει την έξοδο, αυτό το πεδίο θα πρέπει να είναι null "y.

    Το Noutbuffersiz είναι ένα Pazmp στις bytes του κάδου, το οποίο lpoutbuffer δείχνει σε ποια.

    lPBYTESETURENED - ADPES ενός DWWWRED DWORD PEDIGREE, το οποίο θα λάβει δεδομένα σχετικά με τα δεδομένα που περιλαμβάνονται στο Lpoutbuffer.

    Το LpoverLapped είναι ένα Overapad Strupp, αν θέλετε η λειτουργία να είναι ασύγχρονη. Εάν θέλετε να περιμένετε μέχρι να εκτελεστεί το OP, τοποθετήστε το NULL σε αυτό το πεδίο.

    */

    wSPRINTF ((LPSTR) Stroka, "% Χ", Adwoutbuffer); // Εγγραφή συμβολοσειράς στο Buffer (Adwoutbuffer -\u003e Stroka)

    CloseHandle (hdevice);

    Επιστροφή 0;

    }

    Πρόγραμμα υπολογιστών πυρήνα οδηγού

    2.3 Βήμα 3.

    Καταχώρηση μαθήματος.CPP

    #Περιλαμβάνω.

    #Περιλαμβάνω.

    #Περιλαμβάνω.

    {

    DWORD Junk?

    0, // Χαρακτηριστικά αρχείου

    Επιστροφή (FALSE).

    }

    0, // Μέγεθος του ρυθμιστικού διαλύματος εισόδου

    CloseHandle (hdevice);

    Επιστροφή (Bresult).

    }

    iNT MAIN (INT ARGC, Char * ARGV)

    {

    /*

    typedef struct (

    Partition_style partitystyle? // μορφή ενότητας

    Large_integer εκκίνηση. // μετατόπιση του τμήματος έναρξης

    Large_integer διαχωριστικό μήκος? // τμήμα μεγέθους

    Dwwword partitionnumber. // αριθμός ενότητας

    Boolean RewritePartition; // Εάν η ενότητα αντικατασταθεί αλήθεια

    Ένωση (

    Partition_information_mrb mbr; // Πρόσθετες πληροφορίες Τμήμα στυλ MBR

    Partition_information_gpt GPT; // Πρόσθετες πληροφορίες GPT διαμέρισμα στυλ

    };

    ) Partition_information_ex;

    */

    Bool bresult?

    ("Παύση").

    Επιστροφή ((int) bresult).

    }

    2.4 Βήμα 4.

    1) Συνδυάστε όλες τις λειτουργίες που έχουν σχεδιαστεί στα βήματα 1-3, σε ένα σύμπλεγμα προγράμματος.

    Το τελικό συγκρότημα πρέπει να μοιάζει με αυτό:

    - Ο οδηγός μας είναι ενσωματωμένος στο σύστημα και φορτώνεται στο στάδιο εκκίνησης των Windows.

    - Η αίτηση ζητά τον οδηγό για τον οδηγό (που καθορίζεται στο βήμα 2) πληροφορίες, ο οδηγός μεταδίδει αυτές τις πληροφορίες και το ηχείο ενεργοποιείται επίσης για λίγο και η μελωδία αναπαράγεται (που καθορίζεται στο βήμα 1). Στη συνέχεια, η εφαρμογή απαιτεί πρόγραμμα οδήγησης σε ένα υπάρχον στο σύστημα (σύμφωνα με την επιλογή στο βήμα 3).

    2) Να γίνει επεξηγηματική σημείωση στην οποία πρέπει να περιγραφούν και τα 4 στάδια, καθώς και θεωρητικές πληροφορίες για κάθε στάδιο.

    #Include "stdafx.h"

    #Include "Windows.h"

    #include "stdlib.h"

    #Define ioctl_get ctl_code (file_device_unknown, 0x800, method_buffered, file_read_access + file_write_access)

    Bool getpartitionnumber (partition_information_ex * pex)

    {

    Χειριστείτε το hdevice. // Περιγραφέας της συσκευής που ελέγχεται

    Bool bresult? // πλαίσιο ελέγχου

    DWORD Junk?

    hDEVICE \u003d Createfile (κείμενο ("\\\\\\\\\\ \\\\ C:"), // Ανοιχτή συσκευή

    Generic_read | Generic_write, // Πρόσβαση στη συσκευή

    File_share_read | file_share_write, // Λειτουργία κοινής χρήσης

    Null, // Χαρακτηριστικά ασφαλείας από προεπιλογή

    Open_existing, // Θέση

    0, // Χαρακτηριστικά αρχείου

    Μηδενικό); // Μην αντιγράφετε χαρακτηριστικά αρχείου

    αν (hdevice \u003d\u003d invalid_handle_value) (// δεν μπορεί να ανοίξει τη συσκευή

    printf ("Createfile () απέτυχε! \\ N");

    Επιστροφή (FALSE).

    }

    bresult \u003d DeviceioControl (HDEvice, // Dealthed Device

    Ioctl_disk_get_partition_info_ex, // λειτουργία

    Null, // δείκτης στο buffer εισόδου

    0, // Μέγεθος του ρυθμιστικού διαλύματος εισόδου

    pEX, μέγεθος (* pex), // buffer εξόδου

    & junk, // αριθμός επιστρεφόμενων bytes

    (Lpoverlapped) null) · // Συγχρονισμός I / O (I / O)

    CloseHandle (hdevice);

    Επιστροφή (Bresult).

    }

    int _tmain (int argc, _tchar * agnv) (

    Sc_handle hscmanager?

    Sc_handle hservice;

    char acdriverpath;

    Χειριστείτε το hdevice.

    Bool devcontrol;

    Dword dwnetesrentured?

    Lpvoid adwinbuffer, adwoutbuffer?

    char stroka;

    Partition_information_ex pex; // Δομή συσκευής

    Bool bresult?

    hdevice \u003d createfile ("\\\\\\\\\\ \\\\ sldevget", generic_read + generic_write, 0, , open_existing, 0, null);

    αν (hdevice! \u003d 0) (

    Devcontrol \u003d DeviceioControl (Hdevice, ioctl_get, & adwinbuffer, μέγεθος (adwinbuffer), & adwoutbuffer, μέγεθος (adwoutbuffer), & dwbytesretured, null);

    αν ((Devcontrol! \u003d 0) && (dwbytesreturned! \u003d 0)) (

    wSPRINTF ((LPSTR) Stroka, "% Χ", Adwoutbuffer); // Εγγραφή συμβολοσειράς στο Buffer (Adwoutbuffer -\u003e Stroka)

    Εάν (Stroka \u003d\u003d "00000100") Messagebox (NULL, "Βρέθηκε 1,44 MB", "Yermakov FDD Scaner", MB_OK).

    Άλλοι μηνύματα (NULL, "δεν βρέθηκε", "Yermakov FDD Scaner", MB_OK).

    hscmanager \u003d openscmanager (, , sc_manager_create_service);

    αν (HSCManager! \u003d 0) (

    Getfullpathname ("beeper.sys", μέγεθος acdriverpath, acdriverpath, null);

    // Εγγραφή του μουσικού σε πίνακες SCM

    hSRVICE \u003d CreateService (HSCManager, "Beeper11", "Ωραίο Melody Beeper11,

    Service_start + delete, service_kernel_driver, service_demand_start,

    Service_error_ignore, acdriverpath, , , , , null);

    αν (hservice! \u003d 0) (

    StartService (HService, 0, Null).

    Deleteservice (hservice);

    CloseserviceHandle (HService).

    ) Αλλιώς το MessageBox (NULL, "μπορεί" Τ Εγγραφείτε πρόγραμμα οδήγησης ", NULL, MB_ICONSTOP).

    CloseserviceHandle (HSCManager).

    ) ELSTEDBOX (NULL, "μπορεί να συνδεθεί με το SCManager", Null, MB_IConstop).

    ) ELSEDBOX (NULL, "μπορεί" t να στείλει τον κωδικό ελέγχου ", , mb_ok);

    CloseHandle (hdevice);

    ) ELSEDBOX (NULL, "DEV δεν είναι παρόν", Null, MB_IConstop).

    bresult \u003d getpartitionnumber (& pex);

    αν (Bresult) (Prints ("PartitionNumber \u003d% D \\ N", Pex.PartitionNumber);

    ) Αλλιώς (Printf ("GetPartitionNumber () απέτυχε. Σφάλμα% d. \\ N", GetLasterRor ());).

    ("Παύση").

    Επιστροφή ((int) bresult).

    }

    3. Αίτηση εργασίας

    Εικόνα 3.1. Οδηγός από το βήμα 2

    Εικόνα 3.2. Βήμα 3 οδηγός

    Δημοσιεύτηκε στο Allbest.ru.

    Παρόμοια έγγραφα

      Μηχανισμοί αλληλεπίδρασης της λειτουργίας του πυρήνα και της εφαρμογής χρήστη: Αρχιτεκτονική πολλαπλών στροφών, Αλγόριθμος αλγορίθμου, Αλγόριθμος οδηγού και εφαρμογής, διεπαφή χρήστη για πρόσβαση αρχείων σε αρχεία.

      Εργασία μαθημάτων, προστέθηκαν 06/23/2009

      Windows NT I / O Αρχιτεκτονική. Εσωτερική οργάνωση λεωφορείου USB. Βασικά χαρακτηριστικά του μοντέλου οδήγησης WDM. Σημεία σύνδεσης του ανεπτυγμένου οδηγού, τοποθέτηση κώδικα στη μνήμη, εγκατάσταση του οδηγού στο σύστημα. Εφαρμογή του κωδικού οδηγού στο C.

      Το μάθημα προστέθηκε 09/27/2014

      Η δομή του τρόπου χρήσης που παρέχει τη δυνατότητα χρήσης του χρήστη για να αλληλεπιδράσει με το σύστημα. Περιγραφή της λειτουργίας του πυρήνα, η οποία εξασφαλίζει ασφαλή εκτέλεση εφαρμογών (προγράμματα) του χρήστη. Αφαίρεση υλικού Windows NT.

      Παρουσίαση, πρόσθεσε 23.10.2013

      Ο πυρήνας των Windows 98. Ο ρόλος των μονάδων πυρήνα 16 bit. Προβλήματα απόδοσης. Συνεταιρισμός και εκτοπιστική πολλαπλών εργασιών. Βελτιωμένη χρήση πόρων στα Windows 98. Χρήση του WordArt. MS Outlook Express: Δημιουργία και αποστολή μηνυμάτων.

      Εξέταση, προστέθηκε 14.04.2005

      Η κοινή λειτουργία όλων των συσκευών υπολογιστών και η πρόσβαση στους πόρους της. Η έννοια και η λειτουργία του λειτουργικού συστήματος γραφικών των Windows. Γραφείο βοήθειας των Windows. Διαχείριση συστήματος αρχείων. Τεχνολογία "Plug and Play". Windows Γραφική διεπαφή.

      Εργασίες δοκιμής, προστέθηκαν 01/22/2011

      Χαρακτηριστικά του λειτουργικού συστήματος. Την ιστορία της ανάπτυξης των Windows. Συγκριτική έκδοση των εκδόσεων των Windows. Στοιχεία και εργαλεία των Windows XP. Προγράμματα εφαρμογής στα Windows XP. Εργασία επιφάνειας εργασίας και φορητοί υπολογιστές που εκτελούν παράθυρα.

      Έκθεση, προστέθηκαν 10/16/2011

      Χρησιμοποιώντας τον οδηγό λειτουργίας του πυρήνα και την εφαρμογή ελέγχου για τη δημιουργία σπειρωμάτων συστήματος. Απομίμηση επεξεργασίας δεδομένων και διοργάνωση καθυστερήσεων. Αναπτύξτε έναν οδηγό στο C ++. Διαμόρφωση του πάγκου δοκιμής. Ακρίβεια αλλαγής καθυστερήσεων και λειτουργίας χρονοδιακόπτη.

      Εργασία μαθήματος, πρόσθεσε 24.06.2009

      Διευθυντής εσωτερικών παραθύρων δομής των Windows. Αρχιτεκτονική NT είναι δομή πυρήνα. Μέθοδοι ανακατασκευής του Funkii στο καθεστώς του πυρήνα του Κρύου καθεστώς. Υποτιμά στον οδηγό. Πακέτο εισόδου-Villode. Otsіnka stab_lnosti tu beepes συστήματα των Windows.

      Μαθήματα, προστέθηκαν 02.01.2014

      Έννοια, τύποι και εργασία τείχους προστασίας. Ενσωματωμένο τείχος προστασίας των Windows. Windows XP SP2, πρόσβαση στις ρυθμίσεις του τείχους προστασίας των Windows XP Service Pack 2. Windows Vista, επιτρέπεται η κυκλοφορία. Windows 7, Ρυθμίσεις για ενεργά προφίλ. Προσωπικό τείχος προστασίας, επίπεδα δοκιμών.

      Περίληψη, προστέθηκαν 11/19/2010

      Γνωριμία με τα τεχνικά χαρακτηριστικά ενός προσωπικού υπολογιστή. Εγκατάσταση του λειτουργικού συστήματος και των προγραμμάτων οδήγησης των Windows 7. Οι μέθοδοι καθαρισμού των Windows XP Professional SP3. Μέθοδοι αποκατάστασης του λειτουργικού συστήματος. Κάνοντας το Microsoft Office 2010.

    Η Microsoft στο λειτουργικό σύστημα των Windows 10 δίνει ιδιαίτερη προσοχή στην ασφάλεια. Ένα από τα σημαντικά στοιχεία του συστήματος είναι ο "υπερασπιστής των Windows", αλλά μπορεί να αντιμετωπίσει όχι με όλες τις απειλές. Ειδικότερα, κερδίζει πρόσφατα μια ειδική επικράτηση των ιών Ransomware, οι πιο διάσημες μετενσάρκωση των οποίων είναι κακόβουλες προγράμματα PETYA και. Η Microsoft έχει εφαρμόσει στα Windows 10 την απομόνωση του πυρήνα και την ακεραιότητα της μνήμης που αποσκοπούν στην καταπολέμηση των ιών rlansomware. Από προεπιλογή, είναι απενεργοποιημένα.

    Πίνακας περιεχομένων:

    Τι είναι η μόνωση του πυρήνα και η ακεραιότητα της μνήμης

    Απομόνωση του πυρήνα - Πρόκειται για μια πρόσθετη διαδικασία προστασίας, η οποία παρέχεται από τη μέθοδο περίφραξης των διαδικασιών του υπολογιστή από το λειτουργικό σύστημα και τη συσκευή. Λόγω αυτών των ενεργειών, είναι δυνατόν να αποφευχθεί η υπονόμευση της λειτουργίας του λειτουργικού συστήματος όταν οι ιοί στον υπολογιστή χτύπησαν.

    Ακεραιότητα μνήμης - Πρόκειται για μια ταυτόχρονη απομόνωση της λειτουργίας προστασίας του πυρήνα, η οποία αποσκοπεί στον περιορισμό της πρόσβασης από άγνωστα δυνητικά επικίνδυνα προγράμματα σε διαδικασίες υψηλού επιπέδου.

    Σημαντικό: Η λειτουργία απομόνωσης του πυρήνα μπορεί να λειτουργήσει μόνο εάν υπάρχουν επαρκείς προϋποθέσεις για αυτό στο τμήμα του υλικού του υπολογιστή. Στις ρυθμίσεις του BIOS, η τεχνολογία Virtualization θα πρέπει να είναι ενεργή, σε βάρος του οποίου ο υπολογιστής των Windows 10 μπορεί να εκτελέσει διάφορες εφαρμογές σε ένα εικονικό δοχείο, περιορίζοντας την πρόσβαση από τα βασικά συστατικά του συστήματος.

    Πώς να ενεργοποιήσετε τη μόνωση του πυρήνα και την ακεραιότητα της μνήμης

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


    Όπως σημειώθηκε παραπάνω, εάν το στοιχείο υλικού του υπολογιστή δεν υποστηρίζει τη δυνατότητα εικονικοποίησης, αυτή η λειτουργία δεν θα λειτουργήσει. Όταν ενεργοποιήσετε το χρήστη, θα δείτε το μήνυμα στην κάτω δεξιά γωνία. "Δεν είναι δυνατή η εξασφάλιση της ακεραιότητας της μνήμης. Πιθανή ασυμβατότητα. " Εάν εμφανιστεί αυτό το μήνυμα, συνιστάται να μεταβείτε στο BIOS και να δείτε αν η λειτουργία ασφαλούς εκκίνησης είναι ενεργοποιημένη (λειτουργία εκκίνησης).

    Πώς να απενεργοποιήσετε τη μόνωση του πυρήνα και την ακεραιότητα της μνήμης

    Νέα χαρακτηριστικά στο λειτουργικό σύστημα που επηρεάζουν σοβαρά το έργο του, ο διακινδυνεύει πάντα η αιτία των προβλημάτων κατά την εργασία. Δεν υπάρχει εξαίρεση και λειτουργία της απομόνωσης του πυρήνα. Οι χρήστες που έχουν ήδη δοκιμάσει, γιορτάζουν στα φόρουμ της Microsoft, οι οποίες αντιμετωπίζουν προβλήματα κατά τη λειτουργία ενός αριθμού παιχνιδιών και προγραμμάτων. Ο μόνος τρόπος για την επίλυση αυτού του προβλήματος είναι να απενεργοποιήσετε τη λειτουργία μόνωσης του πυρήνα και την ακεραιότητα της μνήμης. Ίσως στις μελλοντικές ενημερώσεις, οι προγραμματιστές εφαρμογών ή η Microsoft θα διορθώσουν αυτή την ασυμβατότητα.

    Υπάρχουν 3 τρόποι για να απενεργοποιήσετε τη μόνωση του πυρήνα και την ακεραιότητα της μνήμης:


    Διευθυντής Power Manager (Manager Power) Το μάτι δεν κατεβαίνει από τη χρήση της ηλεκτρικής ενέργειας σε όλο το σύστημα. Ιστορικά, η διαχείριση κατανάλωσης ενέργειας συνίστατο στην αποσύνδεση της οθόνης και η διακοπή της περιστροφής των δίσκων. Αλλά αυτό το πρόβλημα γίνεται γρήγορα πιο δύσκολο - λόγω των απαιτήσεων για την αύξηση της διάρκειας των φορητών υπολογιστών από τις μπαταρίες, καθώς και τις εκτιμήσεις της εξοικονόμησης ενέργειας στους επιτραπέζιους υπολογιστές (οι οποίοι επιτρέπονται μόνιμα) και υψηλό κόστος με ηλεκτρική ενέργεια που καταναλώνεται διακομιστή εκμεταλλεύσεις.

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

    Τα Windows υποστηρίζουν μια ειδική λειτουργία τερματισμού που ονομάζεται Hibernation (Hybernation), στην οποία αντιγράφεται ολόκληρη η φυσική μνήμη στο δίσκο και στη συνέχεια η κατανάλωση ενέργειας μειώνεται στο ελάχιστο (στο σύστημα φορητών υπολογιστών αδρανοποίησης μπορεί να λειτουργήσει για εβδομάδες), ενώ η μπαταρία χρεώνεται ελάχιστο. Δεδομένου ότι ολόκληρη η κατάσταση μνήμης καταγράφεται στο δίσκο, μπορείτε ακόμη και να αντικαταστήσετε τη μπαταρία του φορητού υπολογιστή (ενώ βρίσκεται σε αδρανοποίηση). Όταν το σύστημα συνεχίσει την εργασία του, αφήνοντας την αδρανοποίηση, αποκαθιστά την αποθηκευμένη κατάσταση μνήμης (και επανεκτιμοποιεί τις συσκευές). Αυτό φέρνει τον υπολογιστή στην ίδια κατάσταση στην οποία βρισκόταν μπροστά στην αδρανοποίηση (χωρίς να χρειάζεται να καταχωρεί και να εκτελέσει όλες τις εφαρμογές και τις υπηρεσίες που εκτελέστηκαν. Τα Windows προσπαθούν να βελτιστοποιήσουν αυτή τη διαδικασία, αγνοώντας τις μη τροποποιημένες σελίδες (έχοντας πλεονασμό δίσκου) και Συμπίεσε τις σελίδες μνήμης ανάπαυσης για να μειώσει τον απαιτούμενο αλγόριθμο I / O. Ο αλγόριθμος αδρανοποίησης παρέχει αυτόματο εύρος ζώνης του εύρους ζώνης και του συστήματος επεξεργαστή. έτσι ώστε με ένα υψηλότερο εύρος ζώνης επεξεργαστή, να μειώσει την ανάγκη για μια απόδοση συστήματος I / O, χρησιμοποιείται περισσότερη εντατική σε πόρους, αλλά πιο αποτελεσματικά χρησιμοποιείται. Συμπίεση δεδομένων. Ένα επαρκές εύρος ζώνης του συστήματος εισόδου / εξόδου σάς επιτρέπει να αποφύγετε τη συμπίεση κατά τη μετάβαση στη λειτουργία αδρανοποίησης. Όταν χρησιμοποιείτε τους πολυπροπόρους της τελευταίας γενιάς, την είσοδο στην κατάσταση αδρανοποίησης και το η έξοδος από αυτό μπορεί να είναι μόνο λίγα δευτερόλεπτα, ακόμη και αν η επιχειρησιακή μπορεί να είναι Τα συστήματα έχουν μεγάλο όγκο.

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

    Παρά τη διαθεσιμότητα της αδρανοποίησης και της προσδοκίας, πολλοί χρήστες δεν ξεφορτώνουν τη συνήθεια να στρέφουν τον προσωπικό τους υπολογιστή στο τέλος της εργασίας.

    Η αδρανοποίηση χρησιμοποιείται στα Windows για την εφαρμογή των ψευδο-shudders της έναρξης, που ονομάζεται Hiberboot, η οποία πραγματοποιείται πολύ ταχύτερα από το συνηθισμένο κλείσιμο και εκτόξευση. Όταν ο χρήστης δίνει το σύστημα για να απενεργοποιηθεί, η Hiberboot εμφανίζει το χρήστη από το σύστημα και στη συνέχεια μεταφράζει την στην κατάσταση αδρανοποίησης σε αυτό το σημείο με το οποίο θα είναι δυνατόν να συνδεθείτε ξανά. Αργότερα, όταν ο χρήστης ενεργοποιεί ξανά το σύστημα, η Hiberboot θα επαναλάβει τη λειτουργία του συστήματος από το σημείο εισόδου του χρήστη. Για έναν χρήστη, όλα αυτά μοιάζουν με πολύ γρήγορο τερματισμό, καθώς τα περισσότερα από τα βήματα αρχικοποίησης του συστήματος παραλείπονται. Φυσικά, μερικές φορές το σύστημα πρέπει να απενεργοποιηθεί πραγματικά για να εξαλείψει τα προβλήματα ή να ορίσετε την ενημέρωση του πυρήνα. Εάν το σύστημα λάβει μια εντολή επανεκκίνησης και όχι το κλείσιμο, μεταφέρει αυτό το κλείσιμο και εκτελεί το συνηθισμένο φορτίο.

    Αναμένεται ότι οι υπολογιστικές συσκευές σε τηλέφωνα και υπολογιστές tablet, καθώς και σε νέες γενιές φορητών υπολογιστών, θα καταναλώνουν πάντα μια μικρή ποσότητα ηλεκτρικής ενέργειας. Για να εξασφαλίσετε μια τέτοια λειτουργία, στα σύγχρονα παράθυρα εφάρμοσε μια ειδική έκδοση της διαχείρισης ενέργειας, η οποία ονομάζεται CS (συνδεδεμένη αναμονή - αναμονή για λειτουργία σύνδεσης). Το CS είναι δυνατό σε συστήματα με ειδικό εξοπλισμό σύνδεσης δικτύου ικανό να παρακολουθεί την κυκλοφορία σε ένα μικρό σύνολο συνδέσεων, χρησιμοποιώντας πολύ λιγότερη ενέργεια από ό, τι όταν ο κεντρικός επεξεργαστής λειτουργεί. Αποδεικνύεται ότι το σύστημα CS είναι πάντα ενεργοποιημένο, η έξοδος από το CS πραγματοποιείται αμέσως μόλις ο χρήστης έχει ενεργοποιηθεί στην οθόνη. Η αναμονή σε λειτουργία σύνδεσης είναι διαφορετική από τη συνήθη κατάσταση αναμονής, επειδή το σύστημα CS θα βγεί επίσης από την προσδοκία όταν λαμβάνει ένα πακέτο από την παρακολούθηση σύνδεσης. Αφού αρχίσει να καθίσει η μπαταρία, το σύστημα CS μεταβαίνει στην κατάσταση αδρανοποίησης για να αποφύγει την πλήρη απόρριψη της μπαταρίας και την πιθανή απώλεια δεδομένων χρηστών.

    Η επίτευξη του έργου της μπαταρίας απαιτεί όχι μόνο τόσο συχνά από τον επεξεργαστή. Είναι επίσης σημαντικό όσο το δυνατόν περισσότερο η συγκράτηση του επεξεργαστή στην κατάσταση εκτός λειτουργίας. Ο εξοπλισμός δικτύου συστήματος CS επιτρέπει στους επεξεργαστές να παραμείνουν εκτός λειτουργίας πριν από την παραλαβή των δεδομένων, αλλά η πρόσληψη του επεξεργαστή μπορεί να προκληθεί από άλλα συμβάντα. Τα προγράμματα οδήγησης συσκευών Windows που βασίζονται στα Windows, οι υπηρεσίες συστήματος και οι ίδιοι οι ίδιοι συχνά ξεκινούν χωρίς ειδικό λόγο, μόνο για να ελέγξουν την κατάσταση των περιπτώσεων. Μια τέτοια δραστηριότητα έρευνας βασίζεται συνήθως σε ρυθμίσεις χρονοδιακόπτη για περιοδικό κώδικα εκκίνησης στο σύστημα ή εφαρμογή. Μια έρευνα βασισμένη σε σήματα χρονοδιακόπτη μπορεί να κάνει μια εργασία σε εκδηλώσεις, συμπεριλαμβανομένου ενός επεξεργαστή. Για να αποφύγετε αυτό στα σύγχρονα παράθυρα από τέτοιους χρονομετρητές, πρέπει να καθορίσετε την παράμετρο σφάλματος που επιτρέπει στο λειτουργικό σύστημα να συνδυάζει τα συμβάντα χρονοδιακόπτη και να μειώσει τον αριθμό των μεμονωμένων βάσεων για να ενεργοποιηθεί ο επεξεργαστής. Τα παράθυρα καταρτίζονται επίσης τις συνθήκες υπό τις οποίες η εφαρμογή που δεν βρίσκεται στο στάδιο της ενεργού εκτέλεσης μπορεί να εκτελέσει τον κώδικα στο παρασκήνιο. Λειτουργίες όπως οι έλεγχο ενημερώσεων ή αναζωογονητικού περιεχομένου δεν μπορούν να εκτελεστούν μόνο στην αρχή της λήξης του χρονοδιακόπτη. Η εφαρμογή πρέπει να υπακούει στο λειτουργικό σύστημα σε θέματα αυτής της δραστηριότητας του φόντου. Για παράδειγμα, ο έλεγχος για ενημερώσεις πρέπει να εμφανίζεται μόνο μία φορά την ημέρα ή την επόμενη φορά που θα εμφανιστεί η μπαταρία στη συσκευή. Ένα σύνολο διαμεσολαβητών συστήματος παρέχει διάφορες συνθήκες που μπορούν να χρησιμοποιηθούν για τον περιορισμό της δραστηριότητας υποβάθρου. Εάν η εργασία φόντου απαιτεί πρόσβαση σε φτηνό δίκτυο ή προσαρμοσμένες δυνάμεις, οι μεσάζοντες δεν θα εκτελέσουν την εργασία μέχρι να προκύψουν οι απαραίτητες προϋποθέσεις.

    Σήμερα, πολλές εφαρμογές εφαρμόζονται τόσο με έναν τοπικό κώδικα όσο και με υπηρεσίες στο σύννεφο. Τα Windows παρέχουν υπηρεσία ειδοποιήσεων των Windows (υπηρεσία ειδοποιήσεων των Windows (WNS), επιτρέποντας τις υπηρεσίες τρίτων μερών να ωθήσουν τις ειδοποιήσεις στη συσκευή των Windows στο CS χωρίς να απαιτείται ειδικά εξοπλισμός δικτύου CS ειδικά πακέτα από διακομιστές τρίτων. Οι ειδοποιήσεις WNS ενδέχεται να ειδοποιήσουν τα θερμά κρίσιμα συμβάντα, όπως ένα μήνυμα κειμένου ή μια κλήση VoIP. Όταν παραληφθεί το πακέτο WNS, ο επεξεργαστής θα πρέπει να ενεργοποιήσει για επεξεργασία, αλλά ο εξοπλισμός του δικτύου CS έχει τη δυνατότητα να διακρίνει μεταξύ της κυκλοφορίας διαφορετικών συνδέσεων, πράγμα που σημαίνει ότι ο επεξεργαστής δεν πρέπει να συμπεριληφθεί σε απάντηση σε κάθε αυθαίρετο πακέτο που προέρχονται από τη διεπαφή δικτύου.