Gestionarea energiei în Windows. Gestionarea energiei în Windows Powercfg apelant kernel moștenit

Centrul de securitate Windows Defender, inclusiv noua sectiune Device Security, care oferă gestionarea instrumentelor avansate de securitate, cum ar fi Kernel Isolation.

Core Isolation este o tehnologie de securitate bazată pe virtualizare care oferă nivel suplimentar protecție împotriva atacurilor inteligente. Integritatea memoriei este unul dintre elementele de bază ale tehnologiei de izolare a nucleului - o funcție concepută pentru a preveni inserarea cod rău intenționatîn procese cu securitate ridicată. Protecția este asigurată prin asigurarea faptului că pagina de memorie virtuală a nucleului începe să se execute numai după ce a trecut cu succes verificarea de consistență.

Să aruncăm o privire la cum să activați Integritatea memoriei în Actualizarea Windows 10 aprilie 2018 pentru a vă face computerul mai sigur.

Activarea integrității memoriei

  • Deschideți Centrul de securitate Windows Defender.
  • Selectați secțiunea „Securitate dispozitiv”.
  • În secțiunea „Izolare kernel”, faceți clic pe link-ul „Informații privind izolarea nucleului”.
  • Puneți comutatorul de integritate a memoriei în poziția activă.

După parcurgerea acestor pași, trebuie să reporniți computerul pentru ca modificările să intre în vigoare.

Notă: procesorul dumneavoastră trebuie să accepte tehnologii de virtualizare pentru ca această caracteristică să funcționeze. În plus, virtualizarea trebuie să fie activată în BIOS sau UEFI. În caz contrar, funcția va fi indisponibilă.

Corectarea problemelor legate de izolarea nucleului

În unele cazuri, este posibil să întâmpinați probleme de compatibilitate în unele aplicații dacă izolarea nucleului este activată. Pentru a remedia problema, va trebui să dezactivați funcția.

Dacă încercați să dezactivați Integritatea memoriei în Centrul de securitate Windows Defender, dar opțiunea a devenit gri și este afișat mesajul „Această setare este controlată de administratorul dvs.”, puteți dezactiva în continuare funcția utilizând registrul de sistem.

Notă: Modificarea incorect a registrului poate cauza probleme serioase. Se recomandă crearea backup registru Windowsînainte de a continua cu acești pași. Din meniul Registry Editor, selectați Fișier> Export pentru a salva copia de rezervă.

  • Apăsați combinație Tastele Windows+ R pentru a afișa fereastra Run.
  • Tastați regedit și faceți clic pe OK pentru a lansa Editorul de registru.
  • Mergeți pe următoarea cale:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ DeviceGuard \ Scenarios \ HypervisorEnforcedCodeIntegrity
  • Faceți dublu clic pe intrare Activat.
  • Modificați valoarea de la 1 la 0.
  • Faceți clic pe OK.

Pentru a dezactiva, puteți folosi și cele gata făcute

Întrebare: Când muncă îndelungată computer sau trezirea din modul de repaus fontul se pierde în meniul de pornire


Când computerul rulează mult timp sau când iese din modul de repaus, meniul Start devine astfel.

Cum repar asta? Ajuta-ma te rog..

Răspuns: sistem de operare reinstalat deja și actualizat (

Întrebare: Cum îmi pun computerul în modul de repaus S1 („Stand by”)?


Nu pe calculator desktop, nici pe un laptop nu îmi pot da seama cum să pun computerul în hibernare de tip S1.

Rezultatul executării „powercfg / a”

Următoarele stări de hibernare sunt disponibile pe acest sistem:
Standby (S3)

Următoarele stări de hibernare nu sunt disponibile pe acest sistem:
Standby (S1)

Standby (S2)
Firmware-ul sistemului nu acceptă standby.

Hibernare
Hibernarea nu este activată.

Standby (conectat)
Firmware-ul sistemului nu acceptă standby.

Mod de repaus hibrid

Pornire rapidă
Hibernarea nu este disponibilă.

Răspuns: Lăsați computerul să stea inactiv timp de câteva minute, apoi puneți-l în repaus și treziți-l.

În jurnalul de evenimente:
Acțiune => creați vizualizare personalizată
În elementul dată, setați, de exemplu, un interval de două minute și vedeți ce s-a întâmplat.

nu mai am idei.

Ei bine, verificați driverele și dispozitivele conectate la computer

Întrebare: Se trezește la 4 dimineața


Aproape în fiecare noapte, computerul se trezește și mă trezește.
în managerul de dispozitive, adaptoare de rețea, a debifat caseta de selectare „Trezește-te cu pachete magice”.
a dezactivat cronometrele de trezire din setările de putere.
v Linie de comanda comanda powercfg / waketimers arată acest lucru.

c: \> powercfg / waketimers
Cronometrul setat de Legacy Kernel Caller este valabil până la 4:14:46 pe 01.09.2016.
Cauză:

Ajutor. Cine este de vină și ce să facă?

Răspuns:în cele din urmă a vindecat această boală:

Panou de control -> Securitate și întreținere -> Întreținere -> Întreținere automată -> Modificați setările de întreținere -> debifați „Permite ca sarcina de întreținere să-mi trezească computerul...”

Întrebare: Computerul se pornește spontan noaptea


Ultima dată (aproximativ 1 ... 2 luni), la aproximativ 30 ... 60 de minute după ce computerul a fost pus în modul de repaus (pentru a putea continua să lucrezi dimineața din momentul în care a fost întrerupt), se pornește spontan. Termin de lucru pe la 12 noaptea, adică. pornirea are loc la 0:30 ... 1:00 am. Cu toate acestea, monitorul rămâne întunecat. Ma dau jos din pat, misc mouse-ul - se aprinde monitorul, intru in profil in modul normal, il pun din nou in modul sleep - nu se mai aprinde in seara asta.

Pe un computer Win7, există un antivirus rezident MS Cecurity Essentials. Am rulat de mai multe ori utilitarele de vindecare topice (proaspăt descărcate) mbar și DrWeb Cureit - au dat peste câteva byak, dar încă a rămas activarea spontană. Pare un virus care conectează computerul meu la atacuri DDOS. Mai mult, din când în când Google blochează accesul din cauza traficului suspect care vine de la IP-ul meu. Acest lucru se întâmplă de mult timp (mai mult de un an), dar am observat o pornire spontană a computerului abia recent.

De fapt, întrebarea este: dacă problema este cunoscută și este relativ ușor de tratat, atunci descarc software-ul recomandat, îl scanez și îl postez. Dacă problema este mai complicată, atunci nu mă voi păcăli pe mine sau pe guru local și nu voi rearanja sistemul stupid.

Răspuns: Falconist, ceva ce nu prea am inteles...

mesaj de la Falconist

după ce ai pus computerul în modul de repaus... se pornește spontan

Somnul și hibernarea la 7 sunt lucruri complet diferite. Pentru a-l pune în modul de repaus, trebuie doar să apăsați butonul Repaus de pe tastatură. Dacă dați clic pe Start și treceți mouse-ul peste săgeata de lângă Shutdown, va apărea un meniu în care există și Hibernare. și Hibernare. În timpul hibernarii, computerul este deconectat de la sursa de alimentare în același mod ca atunci când închideți, dar când porniți computerul, puteți începe să lucrați în același mod ca după modul de repaus.
Dar ai întrebat despre altceva. Ați verificat Task Scheduler?

Întrebare: Computerul se trezește noaptea din modul de repaus


Bună ziua tuturor. Această problemă m-a prins deja. De la sine, computerul iese din modul de repaus noaptea, este Windows 10, înainte era 7, nu exista o astfel de problemă, așa că am ales această secțiune anume.
Ce s-a făcut deja acum 2 zile:
1. În vizualizatorul de evenimente, am găsit motivul: Timer - Sarcina programată „NT TASK \ Microsoft \ Windows \ UpdateOrchestrator \ Reboot” va fi executată, solicitând computerului să se trezească din modul de repaus.
Am mers la Task Scheduler, am găsit această sarcină și am eliminat caseta de selectare din elementul: Condiții - Treziți computerul pentru a finaliza sarcina.
2. Am accesat powercfg.cpl - Setări schema de alimentare - Modificare Opțiuni suplimentare Alimentare - Repaus - Permite cronometre de trezire - DEZACTIVAT.

În această seară situația s-a repetat, dar în vizionarea evenimentelor am găsit doar:

Sistemul a ieșit din starea de hibernare.

Timp de somn: 2016-10-29T21: 38: 38.657073700Z
Ora de trezire: 2016-10-29T21: 58: 34.625754700Z

Sursă de ieșire: fără date

3. În managerul de dispozitive, am eliminat caseta de selectare „permite acestui dispozitiv să trezească computerul din modul standby” de pe mouse, tastatură, placa de rețea și oriunde l-am găsit...

Ajută la rezolvare această problemă, nu mai stiu unde sa sape...

Răspuns:

mesaj de la GoLeMjkeee

Costă zilnic la 2-00

Schimbați la zi.

mesaj de la GoLeMjkeee

dar o căpușă....nu merită.

E așa, cu caracter.

Întrebare: Cum să eliminați ecranul cu butonul „Autentificare” când ieșiți din modul de repaus?


Windows 10 Pro 1607.
Când ieși din modul de repaus, Windows vă cere să apăsați „Enter”. La trezire apare ecran albastru cu inscrierea numelui de utilizator si sub acesta butonul „Autentificare”. Parola nu este setată, utilizatorul este singurul din sistem cu drepturi de administrator. La încărcare, totul este bine, fără ecrane și clicuri pe butoane, doar un desktop.

În Opțiuni- Conturi- Opțiuni de conectare nu există niciun element „Autentificare necesară”.
În fereastra Conturi de utilizator, în fila Utilizatori, caseta de selectare „Solicită nume de utilizator și parolă” este debifată.
Nu există niciun element „Solicită parola la trezire” în setările planului de alimentare.

Cum pot elimina butonul „Autentificare” când ies din modul de repaus, astfel încât computerul să pornească automat desktopul ocolind această fereastră?

Răspuns: eliminați hibernarea

Întrebare: Windows 8.1 se oprește în modul de repaus


Buna ziua.
Am o problema cu hibernarea. Computerul se oprește complet în timpul somnului. Acestea. puterea dispare complet. Anterior, un bec de pe unitatea de sistem clipea în dormitor, acum și mouse-ul este complet „decolorat” cu usb, tastatura se stinge și poate fi aprinsă doar cu butonul de pornire și bineînțeles că toate infa nu sunt salvate.
Am citit multe subiecte pe Internet, dar nici o singură problemă nu seamănă cu a mea.
Voi scrie imediat caracteristicile PC-ului: placa de baza ASUS p8h67, radeon video HD7850 (asus), intel i5 2550k, 8gb RAM, SSD Puterea siliconului s55 120gb, HDD WD 500gb.
Windows 8.1 instalat, a fost în picioare de foarte mult timp și hibernarea a funcționat așa cum ar trebui. Odată ce a încetat să funcționeze, nici nu știu exact de ce și după ce (oarecare acțiune) a încetat să funcționeze. Nu am instalat așa ceva, nu mi se părea că actualizez driverul.
De multe ori din obișnuință, în loc să-l opresc, apăs pe butonul de somn și odată a funcționat și a funcționat câteva zile, dar cu timpul a încetat să funcționeze.
Am încercat să actualizez sau să dezinstalez driverele. Am încercat să mă deconectez de la computer dispozitive suplimentare(Ei bine, nu se știe niciodată). Am oprit diverse programe înainte de culcare. Nimic nu a ajutat.
Pe Internet, am găsit singura informație care este exact ca a mea (punctul 8):

Desigur, nu am putut instala driverele, diferite platforme. Nu am putut găsi același lucru pentru mine.

Nu vreau să reinstalez sistemul de operare. totul (cu excepția celui de dormit) funcționează bine.
Aveți idei ce ar putea fi în neregulă?

Adăugat după 17 minute
Am uitat să scriu ce resetă și actualizează BIOS-ul.

Răspuns: verifica apoi fie BP, fie mama. Am configurat programatic sleep și hibernare powercfg / h on.

O altă opțiune este verificarea (înlocuirea). hiberfil.sys - este responsabil pentru hibernare.

Întrebare: Hibernați în Windows 8


după ce a părăsit dormitul modul Windows 8 începe să repornească și după Windows boot următorul mesaj decolează
spune-mi cum sa ma descurc?

Răspuns:

mesaj de la azat145

după ieșirea din hibernare, Windows 8 începe să repornească

Primul.
Mai tarziu.

Întrebare: somn hibrid sau hibernare? Ce este de preferat pe desktop?


În general, întrebarea este în titlu. După cum am înțeles din motorul de căutare, sau mai bine zis, din același articol copiat pe toate site-urile, avantajul modului Hybrid sleep este doar în viteza de pornire, de trezire, s-ar putea spune. Și dacă vreau să folosesc modul Hibernare pe desktopul meu Windows 7 x64, există roci subacvatice? Trebuie doar să opresc alimentarea și este mai bine să nu fac asta în modul Hybrid Sleep. Mulțumesc tuturor celor care răspund

Răspuns: L-am citit azi. Bine, în opinia mea, nu există alt răspuns la întrebarea mea decât un scurt briefing de la Microsoft. Apoi voi împărtăși descoperirile mele (pentru cei care se încadrează în acest subiect la o întrebare similară).
Asa de:

pro Modul de repaus hibrid: 1. Pornire rapidă, nu este nevoie să închideți complet computerul;
Minusuri: 1. Încărcături HDD(conform unui moderator din secțiunea Windows 7 de pe forumul nostru); 2. Nu se oprește complet, continuă să consume curent, deși puțin (deși pentru unii acest articol este un plus)

Pe scurt, Hibernarea este necesară dacă doriți să vă opriți în mod constant din rețea, dar nu doriți să încărcați/închideți sistemul de operare pentru o perioadă lungă de timp.
Modul de repaus hibrid - pentru cei care sunt mulțumiți de un computer care se află în mod constant în rețea.

Întrebare: Anterior, laptopul se opri la pornire, acum în modul de repaus


Ale mele Laptop DELL INSPIRON 3521 cu Windows 8.1 era dezactivat la pornire (a apărut sigla DELL - dezactivare - reactivare și funcționare normală). Am actualizat sistemul pentru 10k, nu a ajutat. L-am purtat la un centru de servicii montane, faimos în oraș și lăudat - acolo laptopul s-a odihnit în siguranță timp de 2 săptămâni de atenția umană. Luând-o, am rezolvat problema prin deconectare încărcare rapidăși, pentru a sărbători, am revenit la 8.1.
A trecut o lună, iar acum, când închid capacul laptopului, acesta intră în modul de repaus (ca în setări), dar după 20 de minute sau puțin mai mult se oprește complet (nu era cazul înainte și setările de putere nu s-au schimbat). La pornire, situația pe care am descris-o mai sus: pornire - logo - oprire. Funcționare normală după repornire. Toți șoferii sunt la zi. Care ar putea fi problema și cum să o rezolvi? Este păcat pentru bietul om - un an și jumătate în total, dar am o diplomă și certificate de stat - nu pot să o duc în jurul maeștrilor acum ...

Răspuns: Cum vrei să funcționeze? Personal, folosesc hibernarea, nu hibernarea, trecerea la hibernare este activată și când este inactiv, setări în atașament

Transferul setărilor de putere

Trimiteți-vă munca bună în baza de cunoștințe este simplu. Utilizați formularul de mai jos

Studenții, studenții absolvenți, tinerii oameni de știință care folosesc baza de cunoștințe în studiile și munca lor vă vor fi foarte recunoscători.

Postat pe http://www.allbest.ru/

1. Informații teoretice

1.1 Dezvoltarea driverelor Windows Kernel

Informații teoretice scurte

Dezvoltarea driverului de kernel

Un driver este un program de calculator prin care un alt program (de obicei un sistem de operare) accesează hardware-ul într-un mod standard.

Schiță pentru a arăta cum funcționează diferite tipuri de drivere:

Este convenabil să se împartă în 2 tipuri:

- Drivere kernel (funcționează la nivelul de privilegiu 0, dar nu interacționează în niciun fel nici cu programul utilizatorului, nici cu dispozitivul. Cu ele vom începe (sunt mai simple și pot fi și utile).

Driverele de dispozitiv sunt necesare pentru a interacționa între programul utilizatorului și dispozitiv, și anume, pentru a transfera date între ele, pentru a controla dispozitivul. Mai mult, dispozitivele pot fi atât reale, cât și virtuale). Șoferul nu trebuie să controleze niciunul dispozitiv fizic... Unele sisteme de operare vă permit, de asemenea, să creați drivere pentru dispozitive virtuale - obiecte care se comportă ca dispozitive I/O, dar nu corespund niciunui dispozitiv fizic.

Componentele kernelului rulează în modul procesor privilegiat (numit mod kernel), pot face totul, și anume:

- pot executa comenzi privilegiate ale procesorului (cum ar fi lgdt),

- poate avea acces la datele și codul sistemului,

- au acces direct la echipamente, de exemplu, prin porturi

- au acces la celulele de memorie; driverul nu poate manipula memoria fizică în mod direct, totuși poate obține o adresă virtuală pentru orice memorie fizică și o poate manipula.

Dacă trebuie să scrieți orice aplicație serioasă care necesită acces la funcțiile interne sau structurile de date ale sistemului, atunci vă puteți confrunta cu multe limitări, care pot fi depășite doar prin plasarea codului în spațiul de adrese ale sistemului. Singura modalitate documentată de a face acest lucru este instalarea driverului. Această metodă este relativ simplă, fiabilă și, cel mai important, este pe deplin susținută de sistemul de operare în sine.

Codul nucleului (de fapt, acesta este sistemul în sine) este considerat ca fiind complet de încredere. Prin urmare, fiind încărcat în spațiul de adrese ale sistemului, driverul devine parte a sistemului și nu este supus niciunei restricții. În Windows, aceasta este practic singura modalitate prin care dezvoltatorii non-OS pot scrie componente de sistem la nivel de kernel.

Pentru a scrie și a studia modalități de dezvoltare a driverelor, aceștia folosesc DDK (Device Development Kit) - un sistem pentru dezvoltarea driverelor.

În plus față de documentație, DDK include un set de fișiere include (* .inc) și fișiere de bibliotecă (* .lib).

Astfel, Windows acceptă diverse tipuri de drivere de dispozitiv, dar în plus, există drivere care nu sunt drivere de dispozitiv, ci pur și simplu vă permit să creați programe care vor rula în modul kernel Windows, adică. la 0 nivel de privilegii. Procedând astfel, au acces deplin la sistemul de operare și la hardware.

Să aruncăm o privire la cel mai simplu driver în modul kernel.

#include

int DriverEntry (

ÎN PDRIVER_OBJECT pDriverObject,

ÎN PUNICODE_STRING pusRegistryPath) (

}

Punctul de intrare este DriverEntry, care este structurat ca o procedură care ia doi parametri:

pDriverObject Pointer către obiectul driver nou creat. La încărcarea unui driver, sistemul creează un obiect driver care reprezintă imaginea din memorie a driverului pentru acesta. Sistemul controlează șoferul prin acest obiect. Obiectul driver este o structură de date obișnuită de tip DRIVER_OBJECT.

pusRegistryPath Pointer către o cheie de registry care conține parametrii de inițializare a driverului.

Acesta este primul nostru driver doar încărcat în sistem și descărcat imediat.

Acum să ne uităm la programul șablon care va trebui utilizat pentru a dezvolta programul în primul pas al cursului (driverul beeper.sys pentru modul kernel).

Sarcina acestui driver este să cânte o notă până la prima octavă pe dinamica sistemului. Pentru a face acest lucru, driverul folosește instrucțiunile procesorului de intrare și de ieșire, referindu-se la porturile I/O corespunzătoare. Este cunoscut faptul că accesul la porturile I/O este păzit cu sfințenie. sistem Windows resursă. O încercare de a accesa oricare dintre ele, atât la intrare cât și la ieșire, din modul utilizator, duce inevitabil la o excepție.

În exemplul nostru, difuzorul va funcționa (pentru aceasta, în special, se utilizează portul 61h, 0 și 1 biți, portul 43h și 42h).

La începutul șoferului, toate cele 12 note sunt definite.

Va fi necesar nu numai să porniți difuzorul, ci și să setați frecvența sunetului. Pentru aceasta se folosește un subsistem timer, care funcționează independent de procesor și are 3 canale. Ieșirea canalului 2 este conectată la un difuzor, care este folosit pentru a genera sunet de diferite frecvențe. Gama audibilă a sunetului este de 30Hz-6000Hz.

Pentru a seta frecvența sunetului, cuvântul de control 0Bh este trimis la portul 43h (registru de comandă a temporizatorului):

mov al, 0Bh

afară 43h, al

Această valoare determină numărul canalului pe care îl vom controla, tipul de operare, modul canalului și formatul contorului.

Apoi frecvența sunetului recalculată (1193167 / frecvență (Hz)) este trimisă la portul 42h în două porțiuni (întâi partea de ordin inferioară, apoi cea de ordin înalt).

De exemplu, dorim să obținem o frecvență a sunetului de 100 Hz. Recalculăm frecvența,

1193167/100 = 11931

Atunci:

mov ax, 11931

afară 42h, al

mov al, ah

afară 42h, al

La prima etapă a lucrării de curs este necesară schimbarea programului astfel încât să producă alte sunete muzicale (fiecare are o variantă).

Misiunile trebuie adesea să stabilească durate diferite. Pentru aceasta, este convenabil să folosiți procedura DO_DELAY prin trecerea în ea a unui parametru „timp de sunet” definit indirect.

Pentru a facilita depanarea driverului, există diverse instrumente. Cel mai simplu lucru este să afișați informațiile necesare într-o fereastră specială a utilitarului Debug View. Acest program este lansat preliminar și configurat pentru a intercepta mesajele de la nivelul nucleului. Pentru ieșire, programul apelează funcția DbgPrint, care are un parametru - șirul de ieșire. După pornirea driverului, toate rezultatele sunt afișate în fereastra Vizualizare depanare.

Există diferite moduri de a instala un driver în nucleu. Deoarece driverul nostru, de fapt, nu este nevoie de sistem (nu controlează niciun dispozitiv), vom conecta temporar driverul la sistem și apoi îl vom șterge.

Pentru a face acest lucru, trebuie să creați o aplicație care va lansa driverul. Cum? Un driver este un serviciu la nivel de kernel. Prin urmare, aplicația va folosi SCM - Service Control Manager, care este inclus cu Windows și rulează la nivel de utilizator.

Astfel, trebuie să construiți o soluție din două proiecte: o aplicație consolă și un driver.

Pentru a dezvolta drivere în C, trebuie mai întâi:

- instalați DDK,

- setați variabila de mediu WNETBASE (valoarea este calea către DDK, de exemplu, e: \ winddk \ 3790.1830).

Proiectul driverului trebuie să fie de tip MakeFile.

Efectuați setările proiectului utilizând Setările aplicației și scrieți linia în câmpul Build Command Line

ddkbuild -WNETXP chk. -ceZ

ceea ce înseamnă apelarea unui script special pentru a lega VC cu DDK

Fișierele trebuie să fie prezente în folderul actual al proiectului:

surse, makefile, ddkbuild.cmd (script), driver source file.c

După construirea proiectului, driverul trebuie să aibă extensia sys.

Aplicația lansează driverul beeper.sys, adică. îl înregistrează în registru și îl rulează. Apoi, când a terminat, îl șterge din registru.

Pentru ca o aplicație să ruleze driverul, după construirea unei soluții care constă din două proiecte - o aplicație și un driver, trebuie să plasați fișierul executabil al aplicației și driverul în același folder și apoi să lansați aplicația.

Driverele sunt foarte greu de depanat. În cazul unor erori în funcționarea sistemului de operare, acesta se blochează adesea și necesită o repornire. Și pentru șoferul nostru, după repornire, trebuie să ștergeți serviciul beeper06 din registru folosind regedit (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \), apoi să reporniți din nou.

1.2 Drivere pentru dispozitive virtuale Windows

Până acum, am dezvoltat un driver în modul kernel care poate face lucruri care nu pot fi făcute la nivel de utilizator, în special, să lucreze cu porturi I/O. Un astfel de driver se numește driver kernel, dar nu driver de dispozitiv, deoarece datele nu sunt transferate între programul utilizatorului și dispozitiv (la urma urmei, de ce este nevoie de obicei de un driver? Pentru a organiza schimbul de date între o aplicație utilizator și un dispozitiv).

Vom dezvolta acum drivere de dispozitiv care transmit date înainte și înapoi între o aplicație de utilizator și un dispozitiv.

Când o aplicație necesită o operație I/O, are loc un apel către șofer. Pentru a face acest lucru, aplicația poate face o solicitare de a citi date de pe dispozitiv sau de a scrie date pe dispozitiv. Și dacă este necesară o altă acțiune, de exemplu, sondarea sau controlul unui dispozitiv sau altceva, atunci așa-numita. Interfață IOCTL (Device In-Out Control).

Vom lua în considerare doar un astfel de caz pentru dispozitivele virtuale, deoarece, de cele mai multe ori, de ce avem nevoie de un dispozitiv virtual într-un driver? Astfel încât să puteți transfera date în acesta, pe care șoferul le poate procesa cumva (ca imposibil în aplicație) și returnează rezultatul în aplicație. Amintiți-vă că driverul obișnuit de kernel discutat mai devreme nu a luat nimic din aplicație și nu a returnat nimic acolo, ci pur și simplu a făcut acțiuni care nu erau disponibile pentru aplicație.

Când o aplicație necesită o operație I/O, are loc un apel către șofer. Pentru aceasta, așa-numitul. Interfață IOCTL (Device In-Out Control).

Aplicația de apelare face următoarele:

1) Deschiderea unui fișier și obținerea descriptorului acestuia:

GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL

Drept urmare, dacă totul s-a întâmplat cu succes, obținem descriptorul dispozitivului.

2) Trimiterea unui cod de acțiune către șofer (ce trebuie să facă, șoferul poate implementa multe acțiuni diferite):

invocați DeviceIoControl, descriptor, cod de acțiune, adresa tampon de intrare, dimensiunea datelor de intrare, adresa tamponului de ieșire, dimensiunea datelor de ieșire, adresa tamponului pentru numărul real de octeți

3) Închiderea fișierului și, în consecință, eliberarea descriptorului.

invocați mânerul dispozitivului CloseHandle

Pentru a transfera date, modulele (aplicație și driver) trebuie să convină asupra unui protocol de interacțiune (coduri de acțiune, structura bufferelor - intrare și ieșire).

Același cod de acțiune este utilizat atât în ​​aplicație, cât și în driver.

Codul de acțiune din aplicație și din driver poate fi scris în formă hexazecimală sau puteți utiliza macro-ul CTL_CODE, așa cum se face în exemplul de laborator. lucrați în fișierul common.inc.

Să ne uităm la un exemplu de cod de acțiune dintr-un driver de dispozitiv virtual care este utilizat în acest laborator. Numele este IOCTL_GET.

În cazul unui dispozitiv virtual, steag-ul fișierului este 0.

Tip de dispozitiv - FILE_DEVICE_UNKNOWN = 22 ore

Drepturi de acces - FILE_READ_ACCESS + FILE_WRITE_ACCESS = 1 + 2 = 3 = 11b

Codul funcției variază de la 800h la FFFh. Avem 800h.

Metoda de tamponare - o modalitate de a transfera date între aplicație și driver (sunt posibile trei):

Pentru o cantitate mică de date, de obicei este utilizat METHOD_BUFFERED (00b) - un buffer suplimentar este alocat în memoria non-pagină, suficient pentru a găzdui buffer-urile de intrare și de ieșire. Adresa acestui buffer este plasată în IRP în câmpul AssociatedIrp.SystemBuffer. Dispeceratul I/O preia sarcina de a rescrie datele între buffer-ul utilizatorului și tamponul auxiliar.

Acces direct la date (fără un buffer) - METHOD_OUT_DIRECT (2) - pentru ieșire, sau METOD_IN_DIRECT (1) - pentru intrare; câmp din IRP - MdlAddress. Acesta este un apel direct - managerul de I/O angajează în memorie paginile fizice care conțin tamponul în modul utilizator. În același timp, creează o structură auxiliară MDL (Memory Descriptor List) pentru a descrie paginile fixe. Și dezvoltatorul driverului lucrează cu MDL.

Acces printr-un buffer la nivel de utilizator - METHOD_NEITHER (3); câmp din IRP - SystemBuffer. Managerul I/O transmite adreselor virtuale în modul utilizator driverului. Și în driver trebuie să lucrați foarte atent cu ei, deoarece driverul în acest caz ar trebui să funcționeze numai în contextul firului de apelare.

Când aplicația trimite un cod de acțiune șoferului, pornește managerul I/O. Acesta este responsabil pentru generarea unui pachet de solicitare I/O (IRP) și trimiterea acestuia către driver pentru procesare ulterioară.

Vom lua în considerare 3 tipuri de solicitări:

IRP_MJ_CREATE - va fi transmis pe CreateFile,

IRP_MJ_DEVICE_CONTROL - va fi transmis de DeviceIoControl

IPR_MJ_CLOSE - pe CloseHandle

Un IRP constă dintr-un antet și stive de alocare. Managerul I/O creează un număr de celule de stivă I/O egal cu numărul de straturi de driver implicate în procesarea cererii. Fiecare șofer are acces la propria locație a stivei. Când un șofer transmite un IRP unui șofer de nivel inferior, indicatorul stivei se mută în locația de care are nevoie șoferul. În schimb, după procesarea cererii, indicatorul este mutat în sus la celula driverului de nivel superior. Obținerea unui pointer folosind o funcție - IoGetCurrentStackLocation ().

Fiecare stivă de alocare conține un pointer către DeviceObject și FileObject pentru care a fost inițiată cererea. IRP-urile sunt întotdeauna stocate în memorie non-paginată.

Pentru ca șoferul să funcționeze, sunt create și aplicate următoarele obiecte:

obiect șofer;

Obiecte dispozitiv;

Etapele șoferului.

1) Crearea unui obiect driver. Creat când driverul este încărcat în etapa de lansare. În acest moment, funcția DriverEntry este lansată și matricea MajorFunction este umplută, precum și pointerul către și de la obiectul dispozitivului.

Obiectul dispozitivului include:

Tip de dispozitiv.

2) Creați o legătură simbolică către dispozitiv. Pentru ca obiectul „dispozitiv” să devină disponibil pentru codul modului utilizator, driverul trebuie să creeze în directorul „\ ??” accesibil acestuia (codul modului utilizator). un alt obiect este o legătură simbolică. Driverul shablon.sys creează o legătură simbolică „slshablon” către dispozitivul său „devshablon” în directorul „\ ??”, a cărui valoare este șirul „\ Device \ devshablon”.

Astfel, deja la încărcarea driverului (în cazul nostru, la etapa de încărcare a sistemului de operare), avem trei obiecte în memorie: driverul „\ Driver \ shablon”, dispozitivul „\ Device \ shablon” și legătura simbolică către dispozitivul „\ ?? \ slshablon”.

3) Deschidere. Apoi, când pornește aplicația, este apelat CreateFile. Există un link către dispozitiv. Structura obiectului dispozitivului DEVICE_OBJECT preia informații despre driverul său de servire. Managerul I/O generează un pachet de solicitare IRP I/O de tip IRP_MJ_CREATE și îl trimite driverului. Acesta este modul în care șoferul știe că codul modului utilizator încearcă să acceseze dispozitivul său. Dacă driverul nu se deranjează, atunci returnează un cod de succes. Șoferul nostru are o procedură specială de expediere care reacționează la acest IRP - DispatchCreateClose (există o procedură combinată pentru deschiderea și închiderea unui dispozitiv). Conține STATUS_SUCCESS în câmpul Io.Status.Status și 0 în Io.Status.Information, deoarece în acest caz, nu trebuie transmis nimic. Acest răspuns din partea șoferului este un semnal către managerul de obiecte de creat fișier virtual... Acest lucru creează un nou element în tabelul de mâner de proces cu un pointer către obiectul „fișier” și returnează un nou mâner la codul modului utilizator.

Dacă totul este OK, atunci stocăm descriptorul de fișier returnat de CreateFile în variabila hDevice.

4) Operațiuni de intrare/ieșire. Acum putem efectua operațiuni pentru a controla acest dispozitiv apelând funcțiile DeviceIoControl. Deoarece un driver de dispozitiv poate, în principiu, îndeplini multe sarcini diferite, este necesar să se diferențieze cumva solicitările. Acesta este scopul celui de-al doilea parametru dwIoControlCode, numit cod de control I/O, care este construit conform anumitor reguli.

Folosind descriptorul de dispozitiv, managerul I/O va prelua informații despre driverul care servește, va genera un pachet de solicitare I/O de tip IRP_MJ_DEVICE_CONTROL și îl va trimite driverului. Driverul va apela procedura DispatchControl corespunzătoare, căreia îi este transmis codul de acțiune și informații despre adresele și dimensiunile buffer-urilor de intrare și ieșire ca parametri. Toate acestea sunt comunicate prin IRP. În procedură, din IRP sunt preluate informațiile necesare: codul de acțiune, adresa buffer-ului pentru transmiterea datelor.

Procedura DispatchControl efectuează acțiunile necesare, în cazul nostru adresa pachetului IRP din registrul ESI Apoi transferă rezultatul prin bufferul de ieșire către aplicație.

Similar cu procedura anterioară, trecem prin IRP starea de finalizare și numărul de octeți transferați de la driver.

În aplicație, aceste date sunt formatate și afișate.

5) Închidere. Așa cum ar trebui să se facă cu mânere care nu mai sunt necesare, apelând funcția CloseHandle, închidem mânerul dispozitivului.

6) Descărcarea șoferului. Eliminați legătura simbolică și eliminați obiectul dispozitivului.

Complexul (2) este format din două programe:

O aplicație care solicită șoferului adresa IRP și apoi trimite această adresă către fereastra standard Windows.

Shablon.sys - driver.

Driverul Shablon face ceva ce nu poate fi făcut la nivel de utilizator în în acest caz definește conținutul registrului esi când driverul rulează.

Aplicația din bufferul de ieșire primește conținutul esi, îl convertește pentru ieșire hexazecimală și îl trimite într-o fereastră standard Windows.

Dacă aveți nevoie să obțineți informații de la CMOS în driver, atunci aveți nevoie de:

Trimiteți offset-ul de interes CMOS la portul 70h;

Întârziere mică;

Obțineți informații de la portul 71h la al.

Apoi scrieți aceste informații în tamponul de ieșire.

Și în aplicație, trebuie să luați informații din bufferul de ieșire, dacă este necesar, să le transformați și să le afișați sau să le analizați și, în funcție de rezultat, să afișați textul necesar în fereastra standard.

Acest laborator presupune că driverul este instalat permanent în Windows folosind un fișier .inf folosind Panoul de control - Instalare hardware: Adăugați un dispozitiv nou, Instalați manual, Afișați toate dispozitivele, Dispuneți de disc, căutați pentru a selecta fișierul .inf (driverul trebuie să fie în același folder).

Pentru a verifica dacă driverul este instalat, selectați System, Hardware, Device Manager în panoul de control.

1.3 Accesarea driverelor existente din aplicațiile în modul utilizator

Algoritmul aplicației care lucrează cu driverul

Pentru a lucra cu un driver, o aplicație în modul utilizator trebuie să obțină un manipulator (mâner) al driverului. Acest manipulator poate fi obținut folosind funcția API CreateFile sau CreateFileA, care funcționează cu caractere ASCII. În continuare, este utilizată funcția API DeviceIoControl, căreia îi este transmis codul IOCTL ca unul dintre parametri. Codul IOCTL este codul de control prin care șoferul învață despre operația pe care aplicația solicită să o efectueze, metoda de transmitere a parametrilor și drepturile de acces de care are nevoie aplicația pentru a efectua această operațiune. După ce aplicația a sunat

IRP_MJ_DEVICE_CONTROL este trimis la driverul DeviceIoControl. După procesarea cererilor, controlul este returnat aplicației și rămâne ca aplicația să analizeze răspunsul șoferului și să închidă mânerele deschise.

Exemplu

În exemplul de mai jos, aplicația în modul utilizator trimite o solicitare IOCTL_DISK_GET_PARTITION_INFO_EX către driverul sistemului de fișiere, analizează informațiile pe care le primește și emite formatul partiției hard disk.

#include

#include

int _tmain (int argc, _TCHAR * argv)

DWORD dwBytesReturned = 0;

char cPartitionStyle = (0);

PARTITION_INFORMATION_EX piPartitionInfo;

HANDLE hDevice = CreateFileA (

/*1*/"\\\\.\\c: ",

/ * 2 * / GENERIC_READ | GENERIC_WRITE,

/ * 3 * / FILE_SHARE_READ | FILE_SHARE_WRITE,

/ * 5 * / OPEN_EXISTING,

dacă (hDevice == INVALID_HANDLE_VALUE)

MessageBoxA (NULL, „CreateFileA error!”, „Error”, 0);

dacă (DeviceIoControl (

/ * 1 * / (MANER) hDispozitiv,

/ * 5 * / & piPartitionInfo,

/ * 6 * / sizeof (piPartitionInfo),

/ * 7 * / & dwBytesReturned,

dacă (piPartitionInfo.PartitionStyle == PARTITION_STYLE_MBR)

MessageBoxA (NULL, „PARTITION_STYLE_MBR”, „Caption”, 0);

else if (piPartitionInfo.PartitionStyle == PARTITION_STYLE_GPT)

MessageBoxA (NULL, „PARTITION_STYLE_GPT”, „Caption”, 0);

MessageBoxA (NULL, „PARTITION_STYLE_RAW”, „Caption”, 0);

MessageBoxA (NULL, „Eroare DeviceIoControl”, „Eroare”, 0);

CloseHandle (dispozitiv h);

Analizând un exemplu

Sunt declarate variabilele necesare pentru ca aplicația să funcționeze. PARTITION_INFORMATION_EX este o structură care descrie informații despre secțiune tare disc.

typedef struct (

) PARTITION_INFORMATION_EX;

În această parte a programului, funcția CreateFileA este apelată pentru a obține un handle, care este scris în variabila hDevice.

Funcția DeviceIoControl este apelată sincron. I se transmite:

descriptor de dispozitiv;

Cod IOCTL IOCTL_DISK_GET_PARTITION_INFO_EX;

pointer către buffer-ul de intrare, NULL în cazul nostru;

dimensiunea tamponului de intrare;

pointer către bufferul de ieșire;

dimensiunea tamponului de ieșire;

pointer spre variabilă ca DWORD, care va stoca numărul de octeți de returnat;

un pointer către structura OVERLAPPED care este folosit pentru apel asincron funcții.

După revenirea controlului, în cazul finalizării cu succes a funcției, informațiile despre partiție sunt stocate în structura PARTITION_INFORMATION_EX.

Se efectuează analiza și eliberarea informațiilor. Înainte de a reveni controlul sistem de operare mânerele deschise pot fi închise. Funcția CloseHandle (__ în HANDLE) vă permite să faceți acest lucru. Dacă descriptorii nu sunt închiși, sistemul de operare o va face pentru dvs.

2. Implementarea documentului de termen

2.1 Pasul 1

Exercițiu: 1. Dezvoltați un driver de kernel cu acces la porturi, efectuând acțiuni în funcție de opțiune și ieșind informații în fereastra Debug View (prin opțiune), precum și o aplicație care lansează driverul.

Listarea Kurs_test.cpp

#include „stdafx.h”

#include „windows.h”

#include „stdlib.h”

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

dacă (hSCManager! = 0) (

// înregistrează jucătorul în tabelul SCManager

dacă (hService! = 0) (

// Ștergeți intrarea driverului

DeleteService (hService);

CloseServiceHandle (hService);

returnează 0;

}

Listarea Beeper.sys

#include

#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 (inter time) (

lung i, j;

pentru (i = 0; i<=time*0xfffff; i++) {}

}

void DO_BIG_DELAY (timpul int) (

DO_DELAY (2 * timp);

}

void Xilofon (int nPitch) (

int nTon = TIMER_FREQUENCY / nPitch

_asm (

mov al, 10110110b; // scrie cuvântul de control la 43h

out 43h, al; // Canal de control al sunetului - logica folosind tonul temporizatorului și biții portului de sistem controlați prin software

mov eax, nTone; // scrie frecvența recalculată la 42

afară 42h, al; // partea superioară

mov al, ah; // parte joasă

afară 42h, al

în al, 61h; // schimbarea secvenței de evadare - convertiți ultimii biți în uni

; // bit 0 - permisiunea de a folosi difuzorul

; // bit 1 - permisiunea de a conecta timer-2 la difuzor

sau al, 00000011b; difuzorul pornit

afară 61h, al

}

DO_DELAY (0x7f);

_asm (

în al, 61h

şi al, 11111100b; difuzorul OPRIT

afară 61h, al

}

}

Xilofon (PITCH_C);

Xilofon (PITCH_С);

Xilofon (PITCH_С);

Xilofon (PITCH_С);

Xilofon (PITCH_С);

Xilofon (PITCH_С);

Xilofon (PITCH_С);

returnează STATUS_DEVICE_CONFIGURATION_ERROR;

}

2.2 Pasul 2

Dezvoltați un driver de dispozitiv virtual care vă permite să efectuați acțiuni care sunt disponibile numai la nivelul de privilegii zero (în conformitate cu opțiunea), apoi transferați rezultatele în aplicație la al treilea nivel de privilegii pentru a le afișa.

În aplicație, scoatem rezultatul într-o fereastră standard Windows.

Listarea shablon.c

#include // diverse definiții NT

#include

UNICODE_STRING g_usDeviceName;

UNICODE_STRING g_usSymbolicLinkName;

void DriverUnload (IN PDRIVER_OBJECT pDriverObject) (

IoDeleteSymbolicLink (& g_usSymbolicLinkName);

IoDeleteDevice (pDriverObject-> DeviceObject);

}

NTSTATUS DispatchCreateClose (PDEVICE_OBJECT pDeviceObject, PIRP pIrp) (// procesează MJ_CREATE MJ_CLOSE

pIrp-> IoStatus.Status = STATUS_SUCCESS;

pIrp-> IoStatus.Information = 0;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

returnează STATUS_SUCCESS;

}

NTSTATUS DispatchControl (PDEVICE_OBJECT pDeviceObject, PIRP pIrp) (// procesează IRP_MJ_DEVICECONTROL

starea NTSTATUS;

int regEsi;

// duce un pointer către IO_STACK_LOCATION, în el către IoControlCode

dacă (pIrp-> Tail.Overlay.CurrentStackLocation-> Parameters.DeviceIoControl.IoControlCode == IOCTL_GET) (

// Comparați codul de acțiune și dacă acesta este clientul nostru, atunci:

_asm (

mutare eax, 0

mutare, 10h

afară 70h, al

în al, 71h

cbw

cwde

mov regEsi, eax

}

// aceasta este funcționalitatea noastră - luăm conținutul registrului esi

// scrieți-l în memoria tampon de sistem

* ((int *) pIrp-> AssociatedIrp.SystemBuffer) = regEsi;

pIrp-> IoStatus.Information = 4; // și setați dimensiunea rezultatului

stare = STATUS_SUCCESS;

) else status = STATUS_INVALID_DEVICE_REQUEST;

pIrp-> IoStatus.Status = status;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

întoarcere (starea);

}

int DriverEntry (IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath) (

Stare NTSTATUS;

PDEVICE_OBJECT pDeviceObject;

// inițializați șirurile Unicode

RtlInitUnicodeString (& g_usDeviceName, L „\\ Device \\ DevGet”);

RtlInitUnicodeString (& g_usSymbolicLinkName, L "\\ ?? \\ sldevGet");

// completați obiectul driver - explicați clar șoferului ce funcție procesează ce

pDriverObject-> DriverUnload =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

// creează un obiect logic al dispozitivului virtual

Stare = IoCreateDevice (pDriverObject, 0 și g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE și pDeviceObject);

dacă (! NT_SUCCESS (Stare)) (întoarce Stare;)

// creează o legătură simbolică către dispozitiv

Stare = IoCreateSymbolicLink (& g_usSymbolicLinkName, & g_usDeviceName);

dacă (! NT_SUCCESS (Stare)) (

IoDeleteDevice (pDeviceObject);

stare de returnare;

}

stare de returnare;

}

Listarea curs2.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 * argv) (

MÂNERE hDispozitiv;

BOOL DevControl;

DWORD dwBytesReturned;

Char stroka;

/*

Parametri:

lpFileName Adresa unui șir terminat cu valori nule care specifică numele obiectului de creat sau deschis.

dwDesiredAccess Tipul de acces la obiect. Acest parametru poate lua orice combinație a următoarelor valori:

Valoare: Descriere:

0 Determină interogarea despre disponibilitatea obiectului pe dispozitivul specificat. O aplicație poate solicita atribute de dispozitiv fără a o accesa.

GENERIC_READ Specifică accesul la citire de la obiect. Datele pot fi citite dintr-un fișier și indicatorul fișierului poate fi mutat. Combinați cu GENERIC_WRITE pentru acces citire-scriere.

GENERIC_WRITE Specifică accesul de scriere la obiect. Datele pot fi scrise într-un fișier, iar indicatorul fișierului poate fi mutat. Combinați cu GENERIC_READ pentru acces citire-scriere.

dwShareMode Mod de acces partajat al obiectului. Dacă valoarea este zero, obiectul nu poate fi partajat de mai multe programe. Toate operațiunile ulterioare de deschidere a obiectului vor eșua până când mânerul pentru obiect este închis. Pentru a partaja un obiect, utilizați o combinație a următoarelor valori:

Valoare: Descriere:

FILE_SHARE_DELETE Permite unei secvențe deschise de obiect să solicite acces de ștergere.

FILE_SHARE_READ Permite unei secvențe deschise de obiect să solicite acces la citire.

FILE_SHARE_WRITE Permite unei secvențe deschise de obiect să solicite acces la scriere

lpSecurityAttributes Adresa unei structuri SECURITY_ATTRIBUTES care determină dacă handle-ul returnat de funcție poate fi moștenit sau nu de către procesul copil.

Dacă lpSecurityAttributes este NULL, atunci descriptorul nu poate fi moștenit.

dwCreationDisposition

Valoare: Descriere:

CREATE_ALWAYS Creează un fișier nou, întotdeauna.

Dacă fișierul există, funcția îl suprascrie.

CREATE_NEW Creează un fișier nou. Funcția va eșua dacă fișierul există.

OPEN_ALWAYS Deschideți fișierul, întotdeauna. Dacă fișierul nu există, funcția îl creează în același mod dacă dwCreationDisposition ar fi CREATE_NEW.

OPEN_EXISTING Deschide un fișier. Funcția va eșua dacă fișierul nu există.

TRUNCATE_EXISTING Deschide un fișier și îl trunchiază la dimensiunea zero. Funcția va eșua dacă fișierul nu există.

dwFlagsAndAttributes Steaguri și atribute ale fișierului.

Când un fișier existent este deschis, CreateFile ignoră fișierul șablon.

Valori returnate:

Dacă funcția reușește, este returnat un handle deschis pentru fișierul specificat. Dacă fișierul specificat există înainte de apelul funcției și parametrul dwCreationDisposition este CREATE_ALWAYS sau OPEN_ALWAYS, apelul GetLastError va returna ERROR_ALREADY_EXISTS chiar dacă funcția are succes. Dacă fișierul nu există înainte de apel, GetLastError va returna 0 (zero).

În caz de eroare, funcția va returna INVALID_HANDLE_VALUE. Pentru mai multe informații despre eroare, apelați GetLastError.

*/

dacă (hDevice! = 0) (

/*

hDevice este handle-ul returnat de CreateFile.

dwIocontrolCode este o valoare care indică operația de efectuat.

lpInBuffer este adresa buffer-ului care conține datele necesare pentru a efectua operația specificată în dwIoControlCode. Dacă operațiunea nu necesită date, puteți trece NULL.

nInBufferSize este dimensiunea în octeți a datelor din buffer-ul indicat de lpInBuffer.

lpOutBuffer este adresa buffer-ului care va fi umplut cu ieșire atunci când operația are succes. Dacă operația nu oferă rezultate, acest câmp TREBUIE să fie NULL.

nOutBufferSiz este dimensiunea în octeți a bufferului indicat de lpOutbuffer.

lpBytesReturned este adresa unei variabile dword care va primi dimensiunea datelor introduse în lpOutBuffer.

lpOverlapped este adresa structurii OVERLAPPED dacă doriți ca operația să fie asincronă. Dacă doriți să așteptați finalizarea operației, introduceți NULL în acest câmp.

*/

wsprintf ((LPSTR) stroka, „% X”, adwOutBuffer); // scrieți o linie în buffer (adwOutBuffer -> stroka)

CloseHandle (dispozitiv h);

returnează 0;

}

program de calculator driver kernel

2.3 Pasul 3

Listing course.cpp

#include

#include

#include

{

DWORD nedorit;

0, // atributele fișierului

întoarcere (FALSE);

}

0, // introduceți dimensiunea tamponului

CloseHandle (dispozitiv h);

returnare (bResult);

}

int main (int argc, char * argv)

{

/*

typedef struct (

PARTITION_STYLE PartitionStyle; // format secțiune

LARGE_INTEGER StartingOffset; // decalaj al începutului secțiunii

LARGE_INTEGER PartitionLength; // Mărimea partiției

DWORD PartitionNumber; // numărul secțiunii

BOOLEAN RewritePartition; // dacă secțiunea este rescriere, atunci TRUE

uniune (

PARTITION_INFORMATION_MBR Mbr; // informații suplimentare despre secțiunea MBR Style

PARTITION_INFORMATION_GPT Gpt; // informații suplimentare despre secțiunea Stil GPT

};

) PARTITION_INFORMATION_EX;

*/

BOOL bResult;

sistem („PAUZĂ”);

return ((int) bResult);

}

2.4 Pasul 4

1) Combinați toate funcționalitățile dezvoltate în pașii 1-3 într-un singur set de programe.

Complexul final ar trebui să arate astfel:

- Driverul nostru este încorporat în sistem și încărcat în timpul fazei de pornire Windows.

- Aplicația cere șoferului informațiile necesare (specificate în etapa 2), șoferul transmite această informație, în timp ce difuzorul este pornit și el pentru un timp și se redă o melodie (specificată în etapa 1). Apoi aplicația face o cerere către șoferul existent în sistem (în conformitate cu opțiunea pentru etapa 3).

2) Întocmește o notă explicativă, în care să fie descrise toate cele 4 etape, precum și informații teoretice pentru fiecare etapă.

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

{

MÂNERE hDispozitiv; // descriptorul dispozitivului verificat

BOOL bResult; // steag rezultat

DWORD nedorit;

hDevice = CreateFile (TEXT ("\\\\. \\ c:"), // dispozitiv de deschis

GENERIC_READ | GENERIC_WRITE, // acces la dispozitiv

FILE_SHARE_READ | FILE_SHARE_WRITE, // modul de utilizare partajat

NULL, // atribute de securitate implicite

OPEN_EXISTING, // locație

0, // atributele fișierului

NUL); // nu copiați atributele fișierului

dacă (hDevice == INVALID_HANDLE_VALUE) (// nu se poate deschide dispozitivul

printf ("CreateFile () failed! \ n");

întoarcere (FALSE);

}

bResult = DeviceIoControl (hDevice, // dispozitiv solicitat

IOCTL_DISK_GET_PARTITION_INFO_EX, // operația care se efectuează

NULL, // pointer către buffer-ul de intrare

0, // introduceți dimensiunea tamponului

pex, sizeof (* pex), // tampon de ieșire

& junk, // numărul de octeți de returnat

(LPOVERLAPPED) NULL); // sincronizare intrare/ieșire (I/O)

CloseHandle (dispozitiv h);

returnare (bResult);

}

int _tmain (int argc, _TCHAR * argv) (

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

MÂNERE hDispozitiv;

BOOL DevControl;

DWORD dwBytesReturned;

LPVOID adwInBuffer, adwOutBuffer;

Char stroka;

PARTITION_INFORMATION_EX pex; // structura dispozitivului

BOOL bResult;

hDevice = CreateFile ("\\\\. \\ sldevGet", GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

dacă (hDevice! = 0) (

DevControl = DeviceIoControl (hDevice, IOCTL_GET și adwInBuffer, sizeof (adwInBuffer), & adwOutBuffer, sizeof (adwOutBuffer), & dwBytesReturned, NULL);

dacă ((DevControl! = 0) && (dwBytesReturned! = 0)) (

wsprintf ((LPSTR) stroka, „% X”, adwOutBuffer); // scrieți o linie în buffer (adwOutBuffer -> stroka)

if (stroka == "00000100") MessageBox (NULL, "Found 1,44 Mb", "Yermakov FDD scaner", MB_OK);

else MessageBox (NULL, „Nu a fost găsit”, „Scaner Yermakov FDD”, MB_OK);

hSCManager = OpenSCManager (NULL, NULL, SC_MANAGER_CREATE_SERVICE);

dacă (hSCManager! = 0) (

GetFullPathName ("beeper.sys", dimensiunea acDriverPath, acDriverPath, NULL);

// Înregistrați un muzician în tabelele SCM

hService = CreateService (hSCManager, „beeper11”, „Nice Melody Beeper11”,

SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,

SERVICE_ERROR_IGNORE, acDriverPath, NULL, NULL, NULL, NULL, NULL);

dacă (hService! = 0) (

StartService (hService, 0, NULL);

DeleteService (hService);

CloseServiceHandle (hService);

) else MessageBox (NULL, „Nu se poate” înregistra driverul „, NULL, MB_ICONSTOP);

CloseServiceHandle (hSCManager);

) else MessageBox (NULL, "Nu se poate" conecta la SCManager ", NULL, MB_ICONSTOP);

) else MessageBox (NULL, "Nu se poate" trimite codul de control ", NULL, MB_OK);

CloseHandle (dispozitiv h);

) else MessageBox (NULL, „Dev nu este prezent”, NULL, MB_ICONSTOP);

bResult = GetPartitionNumber (& pex);

if (bResult) (printf ("PartitionNumber =% d \ n", pex.PartitionNumber);

) else (printf ("GetPartitionNumber () a eșuat. Error% d. \ n", GetLastError ());)

sistem („PAUZĂ”);

return ((int) bResult);

}

3. Operarea aplicației

Figura 3.1. Sofer de la pasul 2

Figura 3.2. Sofer de la pasul 3

Postat pe Allbest.ru

Documente similare

    Mecanisme de interacțiune între driverul în modul kernel și aplicația utilizator: arhitectură driver multistrat, algoritm de ascundere a datelor, interacțiune driver-aplicație, interfața cu utilizatorul programe de filtrare a accesului la fișiere.

    lucrare de termen, adăugată 23.06.2009

    Arhitectura I/O Windows NT. Organizare internă Autobuz USB... Caracteristica esențială a modelului de driver WDM. Punctele de intrare ale driverului în curs de dezvoltare, plasarea codului în memorie, instalarea driverului în sistem. Implementarea codului conducătorului auto în C.

    lucrare de termen, adăugată 27.09.2014

    Structura modului utilizator care permite utilizatorului să interacționeze cu sistemul. Descrierea modului kernel, care asigură executarea în siguranță a aplicațiilor (programelor) utilizatorului. Stratul de abstracție hardware Windows NT.

    prezentare adaugata la 23.10.2013

    Nucleul Windows 98. Rolul modulelor de nucleu pe 16 biți. Probleme de performanță. Multitasking cooperativ și preventiv. Utilizarea resurselor îmbunătățită în Windows 98. Utilizarea WordArt. MS Outlook Express: crearea și trimiterea de mesaje.

    test, adaugat 14.04.2005

    Funcționarea comună a tuturor dispozitivelor computerului și accesul la resursele acestuia. Conceptul și funcțiile blocului de operație grafic sisteme Windows... fundal serviciu windows... Control Sistemul de fișiere... Tehnologia Plug and Play. Interfață grafică Windows.

    test, adaugat 22.01.2011

    Caracteristicile sistemului de operare. Istoria dezvoltării Windows. Caracteristici comparative versiuni Windows... Elemente și Instrumente Windows XP. Programe de aplicațieîn Windows XP. Desktop și computere laptop rulează Windows.

    raport adaugat la 16.10.2011

    Utilizarea unui driver în modul kernel și a unei aplicații de control pentru a crea fire de execuție de sistem. Simularea procesării datelor și organizarea întârzierilor. Dezvoltarea driverului în C++. Configurația bancului de testare. Precizia modificărilor în întârzierile și funcționarea temporizatorului.

    lucrare de termen, adăugată 24.06.2009

    Lucrări preliminare ale structurii interne a sistemului de operare Windows. Arhitectura NT și structura de bază. Metode pentru suprascrierea funcțiilor în modul kernel și modul koristuvach. Înțelegerea șoferului. Pachete I/O. Evaluarea stabilității și securității sistemelor Windows.

    lucrare de termen, adăugată 01.02.2014

    Conceptul, tipurile și funcționarea unui firewall. Firewall Windows încorporat. Windows XP SP2, acces la setările firewall Windows XP Service Pack 2. Windows Vista, trafic permis. Windows 7, setări de profil active. Personal Firewall, niveluri de testare.

    rezumat, adăugat 19.11.2010

    Cunoștință cu caracteristici tehnice calculator personal... Instalarea sistemului de operare și Drivere Windows 7. Metode curatarea geamurilor XP Professional SP3. Metode de recuperare a sistemului de operare. Performanţă Instalări Microsoft Office 2010.

Microsoftîn sistemul de operare Windows 10 acordă o mare atenție securității. Unul dintre elementele importante ale sistemului este „ Windows defender”, Dar nu este capabil să facă față tuturor amenințărilor. În special, recent, virușii ransomware câștigă popularitate, dintre care cele mai faimoase reîncarnări sunt malware Petya și. Microsoft a implementat funcții de izolare a nucleului și de integritate a memoriei în Windows 10 pentru a combate virușii ransomware. Sunt dezactivate implicit.

Cuprins:

Ce este izolarea nucleului și integritatea memoriei

Izolarea miezului este un proces de protecție suplimentară, care este asigurat de metoda de protejare a proceselor computerului de sistemul de operare și dispozitiv. Datorită acestor acțiuni, este posibil să se evite subminarea funcționării sistemului de operare atunci când virușii intră pe computer.

Integritatea memoriei este o funcție de protecție care însoțește izolarea nucleului, care are ca scop restricționarea accesului programelor necunoscute potențial periculoase la procesele cu nivel inalt Securitate.

Important: Funcția de izolare a nucleului poate funcționa numai dacă există condiții suficiente pentru aceasta din partea hardware-ului computerului. V setări BIOS tehnologia de virtualizare trebuie să fie activă, datorită căreia un computer care rulează Windows 10 poate rula diverse aplicații într-un container virtual, restricționând accesul acestora de la componentele cheie ale sistemului.

Cum să activați izolarea nucleului și integritatea memoriei

Setările sistemului de operare Windows 10 vă permit să preluați controlul deplin asupra caracteristicilor de securitate de pe computer. Prin setările Windows 10, puteți activa izolarea nucleului și integritatea memoriei după cum urmează:


După cum sa menționat mai sus, dacă hardware-ul computerului dvs. nu acceptă virtualizarea, această funcție nu va funcționa. Când este activată, utilizatorul va vedea mesajul „Nu se poate asigura integritatea memoriei. Posibilă incompatibilitate.” Dacă apare acest mesaj, este recomandat să mergeți la BIOS și să vedeți dacă funcția este activată. Încărcare sigură(Modul boot).

Cum să dezactivați izolarea nucleului și integritatea memoriei

Noile funcții ale sistemului de operare care îi afectează grav funcționarea riscă întotdeauna să provoace probleme computerului. Funcția de izolare a nucleului nu face excepție. Utilizatorii care l-au încercat deja, notează pe forumurile Microsoft că întâmpină probleme la lansarea unui număr de jocuri și programe. Singura modalitate de a remedia această problemă este să dezactivați izolarea nucleului și integritatea memoriei. Poate că, în actualizările viitoare, dezvoltatorii de aplicații sau Microsoft vor rezolva această incompatibilitate.

Există 3 moduri de a dezactiva izolarea nucleului și integritatea memoriei: