Upravljanje napajanjem u Windows-u. Upravljanje napajanjem u Windows Powercfg naslijeđenom pozivu kernela

Windows Defender sigurnosni centar, uključujući nova sekcija Device Security, koji nudi upravljanje naprednim sigurnosnim alatima kao što je izolacija kernela.

Core Isolation je sigurnosna tehnologija zasnovana na virtuelizaciji koja pruža dodatni nivo zaštita od inteligentnih napada. Integritet memorije jedan je od gradivnih blokova tehnologije izolacije kernela - funkcija dizajnirana da spriječi umetanje zlonamjernog koda u procese visoke sigurnosti. Zaštita je osigurana osiguravanjem da stranica virtuelne memorije kernela počne da se izvršava tek nakon uspješnog prolaska provjere konzistentnosti.

Hajde da pogledamo kako da omogućimo integritet memorije u Windows 10 ažuriranju za april 2018. da bi vaš računar bio sigurniji.

Omogućavanje integriteta memorije

  • Otvorite Windows Defender Security Center.
  • Odaberite odjeljak "Sigurnost uređaja".
  • U odeljku „Izolacija kernela” kliknite na vezu „Informacije o izolaciji jezgra”.
  • Postavite prekidač za integritet memorije u aktivni položaj.

Nakon što dovršite ove korake, morate ponovo pokrenuti računar da bi promjene stupile na snagu.

Bilješka: Vaš procesor mora podržavati tehnologije virtuelizacije da bi ova funkcija radila. Osim toga, virtuelizacija mora biti omogućena u BIOS-u ili UEFI-ju. U suprotnom, funkcija će biti nedostupna.

Ispravljanje problema sa izolacijom kernela

U nekim slučajevima možete naići na probleme s kompatibilnošću u nekim aplikacijama ako je omogućena izolacija kernela. Da biste riješili problem, morat ćete onemogućiti funkciju.

Ako pokušavate da onemogućite integritet memorije u Windows Defender Security Center, ali je opcija postala siva i prikazana je poruka „Ovu postavku kontroliše vaš administrator“, i dalje možete onemogućiti funkciju pomoću registra.

Bilješka: Pogrešna promjena registra može uzrokovati ozbiljne probleme. Preporučuje se kreiranje backup windows registar prije nego što nastavite s ovim koracima. Iz menija uređivača registra odaberite Datoteka> Izvezi da biste spremili sigurnosnu kopiju.

  • Pritisnite kombinaciju Windows tipke+ R za otvaranje prozora Run.
  • Upišite regedit i kliknite OK da pokrenete uređivač registra.
  • Idite na sljedeću stazu:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ DeviceGuard \ Scenarios \ HypervisorEnforcedCodeIntegrity
  • Dvaput kliknite na unos Omogućeno.
  • Promijenite vrijednost sa 1 na 0.
  • Kliknite OK.

Da biste onemogućili, možete koristiti i gotove

Pitanje: Kada dug rad računara ili buđenja iz stanja mirovanja font se gubi u start meniju


Kada računar radi duže vreme ili kada izađe iz stanja mirovanja, meni Start postaje ovakav.

Kako da ovo popravim? Pomozi mi molim te..

odgovor: već ponovo instaliran OS i ažuriran (

Pitanje: Kako da stavim svoj računar u stanje mirovanja S1 ("Spreman")?


Ne uključeno desktop računar, niti na laptopu ne mogu da shvatim kako da stavim kompjuter u hibernaciju tipa S1.

Rezultat izvršavanja "powercfg / a"

Na ovom sistemu su dostupna sljedeća stanja hibernacije:
Standby (S3)

Sljedeća stanja hibernacije nisu dostupna na ovom sistemu:
Standby (S1)

Standby (S2)
Sistemski firmver ne podržava stanje pripravnosti.

Hibernacija
Hibernacija nije omogućena.

Stanje pripravnosti (povezano)
Sistemski firmver ne podržava stanje pripravnosti.

Hibridni režim mirovanja

Brzi početak
Hibernacija nije dostupna.

odgovor: Ostavite računar da miruje nekoliko minuta, a zatim ga stavite u stanje mirovanja i probudite.

U zapisniku događaja:
Akcija => kreiranje prilagođenog prikaza
U stavci datuma postavite, na primjer, dvominutni interval i pogledajte šta se dogodilo.

Nemam više ideja.

Pa, provjerite drajvere i uređaje povezane na računar

Pitanje: Budi se u 4 ujutro


Skoro svake noći kompjuter se budi i budi me.
u upravitelju uređaja, mrežni adapteri, poništio izbor u polju za potvrdu "buđenje sa čarobnim paketima".
onemogućio tajmere za buđenje u postavkama napajanja.
v komandna linija naredba powercfg / waketimers to pokazuje.

c: \> powercfg / waketajmeri
Tajmer postavljen od strane Legacy Kernel Caller važi do 4:14:46 01.09.2016.
Uzrok:

Upomoć. Ko je kriv i šta da se radi?

odgovor: na kraju je izliječio ovu bolest:

Kontrolna tabla -> Sigurnost i održavanje -> Održavanje -> Automatsko održavanje -> Promjena postavki održavanja -> isključite "Dozvoli zadatku održavanja da probudi moj računar..."

Pitanje: Računar se spontano uključuje noću


Zadnji put (oko 1 ... 2 mjeseca), oko 30 ... 60 minuta nakon što je računar stavljen u stanje mirovanja (da biste mogli nastaviti sa radom ujutro od trenutka kada je prekinut), spontano se uključuje. Završavam posao oko 12 uveče, tj. uključivanje se dešava u 0:30 ... 1:00 ujutro. Međutim, monitor ostaje taman. Ustajem iz kreveta, pomeram miša - monitor se pali, ulazim u profil u normalnom režimu, vraćam ga u stanje mirovanja - večeras se više ne pali.

Na Win7 računaru postoji rezidentni antivirus MS Cecurity Esentials. Nekoliko puta sam pokrenuo aktualne (svježe preuzete) uslužne programe za liječenje mbar i DrWeb Cureit - naišli su na nekoliko byaka, ali je ipak ostala spontana aktivacija. Izgleda kao virus koji povezuje moj kompjuter sa DDOS napadima. Štaviše, s vremena na vrijeme Google blokira pristup zbog sumnjivog prometa koji dolazi s moje IP adrese. Ovo se dešava već duže vreme (više od godinu dana), ali sam tek nedavno primetio spontano pokretanje računara.

Zapravo, pitanje je: ako je problem poznat i relativno ga je lako liječiti, onda preuzimam preporučeni softver, skeniram ga i postavljam. Ako je problem komplikovaniji, onda neću zavaravati sebe ili lokalnog gurua i glupo preuređivati ​​sistem.

odgovor: Falconist,nesto nisam sasvim razumeo...

Poruka od Falconist

nakon stavljanja kompjutera u stanje mirovanja ... spontano se uključuje

Spavanje i hibernacija u 7 su potpuno različite stvari. Da biste ga prebacili u stanje mirovanja, samo pritisnite dugme Sleep na tastaturi. Ako kliknete na Start i zadržite pokazivač miša iznad strelice pored opcije Isključivanje, pojavit će se meni u kojem postoji i Hibernacija. i hibernacija. Tokom hibernacije, računar se isključuje iz napajanja na isti način kao i kada ga isključite, ali kada uključite računar, možete početi da radite na isti način kao i nakon režima spavanja.
Ali pitali ste za nešto drugo. Jeste li provjerili Task Scheduler?

Pitanje: Računar se noću budi iz stanja mirovanja


Dobar dan svima. Ovaj problem me je već uhvatio. PC sam po sebi izlazi iz režima spavanja noću, to je Windows 10, prije toga je bio 7, nije bilo tog problema, pa sam odabrao ovaj dio.
Šta je već urađeno prije 2 dana:
1. U Event Vieweru sam pronašao razlog: Tajmer - Planirani zadatak "NT TASK \ Microsoft \ Windows \ UpdateOrchestrator \ Reboot" će biti izvršen, zahtijevajući da se računar probudi iz stanja mirovanja.
Otišao sam u Task Scheduler, pronašao ovaj zadatak i uklonio polje za potvrdu sa stavke: Uslovi - Probudite računar da završite zadatak.
2. Otišao sam na powercfg.cpl - Postavke sheme napajanja - Promjena Dodatne opcije Napajanje - Spavanje - Dozvoli tajmere za buđenje - ONEMOGUĆI.

Večeras se situacija ponovila, ali u gledanju događaja pronašao sam samo:

Sistem je izašao iz stanja hibernacije.

Vrijeme spavanja: 2016-10-29T21: 38: 38.657073700Z
Vrijeme buđenja: 2016-10-29T21: 58: 34.625754700Z

Izvor izlaza: Nema podataka

3. U upravitelju uređaja sam uklonio potvrdni okvir "dopusti ovom uređaju da probudi računar iz stanja pripravnosti" sa miša, tastature, mrežne kartice i gdje god sam ga našao...

Pomozite riješiti ovaj problem, ne znam gde da kopam vise...

odgovor:

Poruka od GoLeMjkeee

Troškovi dnevno u 2-00

Promijenite na dan.

Poruka od GoLeMjkeee

ali krpelj .... nije vrijedno toga.

Ona je takva, sa karakterom.

Pitanje: Kako ukloniti ekran sa dugmetom "Prijava" pri izlasku iz stanja mirovanja?


Windows 10 Pro 1607.
Kada izađete iz režima spavanja, Windows traži da pritisnete "Enter". Nakon buđenja se pojavljuje plavi ekran sa natpisom korisničkog imena i ispod njega dugme "Prijava". Lozinka nije postavljena, korisnik je jedini u sistemu sa administratorskim pravima. Prilikom učitavanja, sve je u redu, nema ekrana i klikova na dugme, samo desktop.

U opcijama- Računi- Opcije prijave ne postoji stavka "Potrebna je prijava".
U prozoru Korisnički nalozi, na kartici Korisnici, polje za potvrdu "Zahtijevaj korisničko ime i lozinku" je poništeno.
U postavkama plana napajanja ne postoji stavka "Zahtijevaj lozinku pri buđenju".

Kako mogu ukloniti dugme "Prijava" kada izađem iz stanja mirovanja tako da računar automatski pokreće radnu površinu zaobilazeći ovaj prozor?

odgovor: uklonite hibernaciju

Pitanje: Windows 8.1 se isključuje u režimu mirovanja


Zdravo.
Imam problem sa hibernacijom. Računar se potpuno gasi dok spava. One. snaga potpuno nestaje. Ranije je u spavacu treptala sijalica na sistemskoj jedinici, sada je i mis potpuno "izbledeo" sa usb-om, tastatura se gasi i moze da se upali samo dugmetom za ukljucivanje i naravno sve infa se ne sprema.
Pročitao sam mnogo tema na internetu, ali nijedan problem nije sličan mom.
Odmah ću napisati karakteristike računara: matična ploča ASUS p8h67, video radeon HD7850 (asus), intel i5 2550k, 8gb RAM, SSD Snaga silikona s55 120gb, HDD WD 500gb.
Instaliran Windows 8.1, stoji jako dugo i hibernacija je radila kako treba. Nakon što je prestao da radi, ne znam tačno zašto i nakon čega (neke radnje) je prestao da radi. Nisam instalirao ništa slično, izgleda da nisam ažurirao drajver.
Često iz navike, umjesto da ga isključim, pritisnem dugme za spavanje i jednom je proradio i radio nekoliko dana, ali je vremenom prestao da radi.
Pokušao sam ažurirati ili deinstalirati drajvere. Pokušao sam da se isključim sa računara dodatni uređaji(pa, nikad se ne zna). Isključio sam razne programe prije spavanja. Ništa nije pomoglo.
Na internetu sam pronašao jedinu informaciju koja je potpuno ista kao moja (tačka 8):

Naravno, nisam mogao da instaliram drajvere, različite platforme. Nisam mogao da pronađem isto za sebe.

Ne želim ponovo instalirati OS. sve (osim onog za spavanje) radi dobro.
Imate li ideju šta bi moglo biti pogrešno?

Dodato nakon 17 minuta
Zaboravio sam da napišem koji BIOS resetuje i ažurira.

odgovor: provjeri onda ili krvni pritisak ili majka. Programski smo konfigurisali spavanje i hibernaciju powercfg / h uključeno.

Druga opcija je provjeriti (zamijeniti). hiberfil.sys - odgovoran je za hibernaciju.

Pitanje: Hibernacija u Windows 8


nakon napuštanja spavanja windows mod 8 počinje da se restartuje i posle windows boot sljedeća poruka se pojavljuje
reci mi kako da se nosim sa tim?

odgovor:

Poruka od azat145

nakon izlaska iz hibernacije windows 8 počinje da se ponovo pokreće

Prvo.
kasnije.

Pitanje: Hibridno spavanje ili hibernacija? Šta je poželjno na desktopu?


Općenito, pitanje je u naslovu. Kako sam shvatio iz tražilice, odnosno iz istog članka kopiranog na sve stranice, prednost hibridnog načina mirovanja je samo u brzini uključivanja, buđenja, moglo bi se reći. A ako želim da koristim režim hibernacije na svom desktopu Windows 7 x64, postoji podvodnih stijena? Samo treba da isključim napajanje, a bolje je da to ne radim u režimu hibridnog mirovanja. Hvala svima koji se odazovu

odgovor: Pročitao sam ga danas. U redu, po mom mišljenju nema drugog odgovora na moje pitanje osim kratkog brifinga iz Microsofta. Zatim ću podijeliti svoja saznanja (za one koji spadaju u ovu temu na slično pitanje).
dakle:

pros Hibridni režim spavanja: 1. Brzi početak, nema potrebe za potpuno gašenjem računara;
Minusi: 1. Opterećenja HDD(prema jednom moderatoru iz sekcije Windows 7 na našem forumu); 2. Ne isključuje se u potpunosti, nastavlja da troši struju, iako malo (iako je nekima ova stavka plus)

Ukratko, hibernacija je potrebna ako želite da se stalno isključite sa mreže, ali ne želite da učitavate/isključujete OS na duže vreme.
Hibridni režim mirovanja - za one koji su zadovoljni računarom koji je stalno na mreži.

Pitanje: Ranije se laptop isključio pri pokretanju, sada je u stanju mirovanja


Moj DELL laptop INSPIRON 3521 sa Windows 8.1 je bio onemogućen pri pokretanju (pojavio se logotip DELL - onemogući - ponovo omogući i normalan rad). Ažurirao sam sistem za 10k, nije pomoglo. Nosio sam ga u planinsko-servisnom centru, poznatom u gradu i hvaljenom - tamo je laptop bezbedno odmarao 2 nedelje od ljudske pažnje. Uzimajući to, riješio sam problem tako što sam prekinuo vezu brzo učitavanje i, da proslavimo, vratio se na 8.1.
Prošlo je mesec dana i sada, kada zatvorim poklopac laptopa, on ide u režim mirovanja (kao u podešavanjima), ali se posle 20 minuta ili malo više potpuno isključuje (to ranije nije bio slučaj i postavke napajanja nisu promijenjene). Prilikom uključivanja, situacija koju sam gore opisao: uključivanje - logo - isključivanje. Normalan rad nakon ponovnog pokretanja. Svi drajveri su ažurirani. Šta bi mogao biti problem i kako ga riješiti? Šteta za jadnika - godinu i po dana ukupno, ali imam diplomu i državne svjedodžbe - ne mogu to sada nositi po majstorima ...

odgovor: Kako želite da funkcionira? Lično koristim hibernaciju, a ne hibernaciju, prelazak u hibernaciju je također omogućen kada je neaktivan, postavke u prilogu

Prenos postavki napajanja

Pošaljite svoj dobar rad u bazu znanja je jednostavno. Koristite obrazac ispod

Studenti, postdiplomci, mladi naučnici koji koriste bazu znanja u svom studiranju i radu biće vam veoma zahvalni.

Objavljeno na http://www.allbest.ru/

1. Teorijske informacije

1.1 Razvoj upravljačkih programa Windows kernela

Kratke teorijske informacije

Razvoj upravljačkog programa kernela

Drajver je računarski program preko kojeg drugi program (obično operativni sistem) pristupa hardveru na standardni način.

Skica da pokaže kako različite vrste drajvera rade:

Pogodno je podijeliti u 2 vrste:

- Kernel drajveri (rade na nivou privilegija 0, ali ni na koji način ne stupaju u interakciju ni sa korisničkim programom ni sa uređajem. Sa njima ćemo početi (jednostavniji su i mogu biti korisni).

Drajveri uređaja su potrebni za interakciju između korisničkog programa i uređaja, odnosno za prijenos podataka između njih, za kontrolu uređaja. Štaviše, uređaji mogu biti i stvarni i virtuelni). Vozač ne mora da kontroliše nijednu fizički uređaj... Neki operativni sistemi takođe vam omogućavaju da kreirate drajvere za virtuelne uređaje - objekte koji se ponašaju kao I/O uređaji, ali ne odgovaraju nijednom fizičkom uređaju.

Komponente kernela rade u privilegovanom procesorskom režimu (koji se zove kernel mod), mogu sve, naime:

- mogu izvršavati privilegirane procesorske komande (kao lgdt),

- može imati pristup sistemskim podacima i kodu,

- imaju direktan pristup opremi, na primjer, preko portova

- imaju pristup memorijskim ćelijama; drajver ne može direktno manipulisati fizičkom memorijom, ali može dobiti virtuelnu adresu za bilo koju fizičku memoriju i manipulisati njome.

Ako trebate napisati bilo kakvu ozbiljnu aplikaciju koja zahtijeva pristup internim funkcijama ili strukturama podataka sistema, tada se možete suočiti s mnogim ograničenjima koja se mogu prevazići samo postavljanjem vašeg koda u sistemski adresni prostor. Jedini dokumentovani način da to uradite je da instalirate drajver. Ova metoda je relativno jednostavna, pouzdana i što je najvažnije, u potpunosti je podržana od samog operativnog sistema.

Kod kernela (u stvari, ovo je sam sistem) smatra se potpuno pouzdanim. Stoga, učitavajući se u sistemski adresni prostor, drajver postaje dio sistema i ne podliježe nikakvim ograničenjima. U Windows-u, ovo je praktično jedini način za programere koji nisu OS da napišu sistemske komponente na nivou kernela.

Za pisanje i proučavanje načina za razvoj drajvera koriste DDK (Device Development Kit) - sistem za razvoj drajvera.

Pored dokumentacije, DDK uključuje skup uključenih datoteka (* .inc) i datoteka biblioteke (* .lib).

Dakle, Windows podržava različite vrste drajvera uređaja, ali pored toga postoje drajveri koji nisu drajveri uređaja, već vam jednostavno omogućavaju da kreirate programe koji će raditi u kernel modu u Windows-u, tj. na 0 nivou privilegija. Pritom imaju pun pristup OS i hardveru.

Hajde da pogledamo najjednostavniji drajver za kernel mod.

#include

int DriverEntry (

U PDRIVER_OBJECT pDriverObject,

U PUNICODE_STRING pusRegistryPath) (

}

Ulazna tačka je DriverEntry, koji je strukturiran kao procedura koja uzima dva parametra:

pDriverObject Pokazivač na novokreirani pogonski objekat. Prilikom učitavanja drajvera, sistem kreira objekat drajvera koji za njega predstavlja sliku drajvera u memoriji. Sistem kontroliše vozača preko ovog objekta. Objekt drajvera je obična struktura podataka tipa DRIVER_OBJECT.

pusRegistryPath Pokazivač na ključ registratora koji sadrži parametre inicijalizacije drajvera.

Ovaj naš prvi drajver je upravo učitan u sistem i odmah istovaren.

Sada pogledajmo šablonski program koji će se morati koristiti za razvoj programa u prvom koraku rada na kursu (beeper.sys drajver za režim kernela).

Zadatak ovog drajvera je da odsvira jednu notu do prve oktave na dinamici sistema. Da bi to učinio, drajver koristi instrukcije procesora za ulaz i izlaz, pozivajući se na odgovarajuće I/O portove. Opšte je poznato da je pristup I/O portovima sveto čuvan. Windows sistem resurs. Pokušaj pristupa bilo kojem od njih, kako na ulazu tako i na izlazu, iz korisničkog moda, neizbježno rezultira izuzetkom.

U našem primjeru, zvučnik će raditi (za to se posebno koriste port 61h, 0 i 1 bitovi, port 43h i 42h).

Na početku drajvera je definisano svih 12 nota.

Bit će potrebno ne samo uključiti zvučnik, već i podesiti frekvenciju zvuka. Za to se koristi podsistem tajmera koji radi nezavisno od procesora i ima 3 kanala. Izlaz kanala 2 je povezan sa zvučnikom koji se koristi za generisanje zvuka različitih frekvencija. Čujni opseg zvuka je 30Hz-6000Hz.

Za podešavanje frekvencije zvuka, kontrolna riječ 0Bh se šalje na port 43h (registar komandi tajmera):

mov al, 0Bh

van 43h, al

Ova vrijednost određuje broj kanala koji ćemo kontrolirati, vrstu operacije, način rada kanala i format brojača.

Zatim se ponovo izračunata frekvencija zvuka (1193167 / frekvencija (Hz)) šalje na port 42h u dva dijela (prvo dio nižeg reda, zatim dio visokog).

Na primjer, želimo da dobijemo frekvenciju zvuka od 100Hz. Preračunavamo frekvenciju,

1193167/100 = 11931

onda:

pokretna sjekira, 11931

van 42h, al

mov al, ah

van 42h, al

U prvom koraku nastavnog rada potrebno je promijeniti program tako da proizvodi druge muzičke zvukove (svaki ima varijantu).

Zadaci često moraju postaviti različita trajanja. Za ovo je zgodno koristiti proceduru DO_DELAY tako što se u nju prosljeđuje indirektno definiran parametar "vreme zvuka".

Da biste olakšali otklanjanje grešaka u drajveru, postoje različiti alati. Najjednostavnije je prikazati potrebne informacije u posebnom prozoru uslužnog programa Debug View. Ovaj program je preliminarno pokrenut i konfigurisan da presreće poruke sa nivoa kernela. Za izlaz, program poziva funkciju DbgPrint, koja ima jedan parametar - izlazni niz. Nakon pokretanja drajvera, sav izlaz se prikazuje u prozoru Debug View.

Postoje različiti načini za instaliranje drajvera u kernel. Pošto naš drajver, zapravo, nije potreban sistemu (ne kontroliše nijedan uređaj), privremeno ćemo povezati drajver sa sistemom, a zatim ga izbrisati.

Da biste to učinili, morate kreirati aplikaciju koja će pokrenuti upravljački program. Kako? Drajver je usluga na nivou kernela. Stoga će aplikacija koristiti SCM - Service Control Manager, koji je uključen u Windows i radi na nivou korisnika.

Dakle, morate napraviti rješenje iz dva projekta: konzolne aplikacije i drajvera.

Da biste razvili drajvere u C, prvo morate:

- instalirati DDK,

- postavite varijablu okruženja WNETBASE (vrijednost je putanja do DDK-a, na primjer, e: \ winddk \ 3790.1830).

Projekat drajvera mora biti tipa MakeFile.

Napravite postavke projekta koristeći postavke aplikacije i upišite liniju u polje Komandna linija za izgradnju

ddkbuild -WNETXP chk. -ceZ

što znači pozivanje posebne skripte za povezivanje VC-a sa DDK-om

Fajlovi moraju biti prisutni u trenutnom folderu projekta:

izvori, makefile, ddkbuild.cmd (skripta), izvorni fajl drajvera.c

Nakon izrade projekta, drajver mora imati sys ekstenziju.

Aplikacija pokreće beeper.sys drajver, tj. registruje ga u registar i pokreće ga. Zatim, kada završi, briše ga iz registra.

Da bi aplikacija pokrenula drajver, nakon izrade rješenja koje se sastoji od dva projekta – aplikacije i drajvera, potrebno je da izvršnu datoteku aplikacije i drajver smjestite u isti folder, a zatim pokrenete aplikaciju.

Upravljačke programe je veoma teško otkloniti. U slučaju grešaka u radu OS-a, često se zamrzava i zahtijeva ponovno pokretanje. A za naš drajver, nakon ponovnog pokretanja, također morate izbrisati uslugu beeper06 iz registra koristeći regedit (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \), a zatim ponovo pokrenuti.

1.2 Windows drajveri za virtuelne uređaje

Do sada smo razvijali drajver režima jezgra koji može da radi stvari koje se ne mogu uraditi na nivou korisnika, posebno da radi sa I/O portovima. Takav drajver se naziva drajver kernela, ali ne i drajver uređaja, jer se nikakvi podaci ne prenose između korisničkog programa i uređaja (na kraju krajeva, zašto je obično potreban drajver? Da bi se organizovala razmena podataka između korisničke aplikacije i uređaj).

Sada ćemo razviti drajvere uređaja koji prosljeđuju podatke naprijed-nazad između korisničke aplikacije i uređaja.

Kada aplikacija zahtijeva I/O operaciju, javlja se poziv drajveru. Da bi to učinila, aplikacija može uputiti zahtjev za čitanje podataka sa uređaja ili pisanje podataka na uređaj. A ako je potrebna neka druga radnja, na primjer, prozivanje ili kontrola uređaja, ili nešto drugo, onda tzv. IOCTL sučelje (Device In-Out Control).

Razmotrićemo upravo takav slučaj za virtuelne uređaje, jer češće nego ne, zašto nam je potreban virtuelni uređaj u drajveru? Tako da na njega možete prenijeti podatke koje vozač može nekako obraditi (kao što je nemoguće u aplikaciji) i vratiti rezultat aplikaciji. Podsjetimo da uobičajeni upravljački program kernela o kojem smo ranije govorili nije uzeo ništa iz aplikacije i nije vratio ništa tamo, već je jednostavno radio radnje koje nisu bile dostupne aplikaciji.

Kada aplikacija zahtijeva I/O operaciju, javlja se poziv drajveru. Za to se koristi tzv. IOCTL sučelje (Device In-Out Control).

Aplikacija za pozivanje radi sljedeće:

1) Otvaranje fajla i dobijanje njegovog deskriptora:

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

Kao rezultat, ako se sve dogodilo uspješno, dobijamo deskriptor uređaja.

2) Slanje koda akcije drajveru (šta da radi, vozač može implementirati mnogo različitih radnji):

invoke DeviceIoControl, deskriptor, kod akcije, adresa ulaznog bafera, veličina ulaznih podataka, adresa izlaznog bafera, veličina izlaznih podataka, adresa bafera za stvarni broj bajtova

3) Zatvaranje datoteke i, shodno tome, oslobađanje deskriptora.

pozvati ručku uređaja CloseHandle

Za prijenos podataka, moduli (aplikacija i drajver) moraju se dogovoriti o protokolu interakcije (akcioni kodovi, struktura bafera - ulaz i izlaz).

Isti kod akcije se koristi i u aplikaciji i u upravljačkom programu.

Akcioni kod u aplikaciji i u upravljačkom programu može biti napisan u heksadecimalnom obliku, ili možete koristiti makro CTL_CODE, kao što je urađeno u primjeru laboratorija. raditi u datoteci common.inc.

Pogledajmo primjer akcijskog koda iz drajvera virtuelnog uređaja koji se koristi u ovoj laboratoriji. Ime je IOCTL_GET.

U slučaju virtuelnog uređaja, oznaka datoteke je 0.

Tip uređaja - FILE_DEVICE_UNKNOWN = 22h

Prava pristupa - FILE_READ_ACCESS + FILE_WRITE_ACCESS = 1 + 2 = 3 = 11b

Funkcijski kod se kreće od 800h do FFFh. Imamo 800h.

Metoda baferiranja - način prijenosa podataka između aplikacije i drajvera (moguća su tri):

Za malu količinu podataka obično se koristi METHOD_BUFFERED (00b) - dodatni bafer se dodeljuje u memoriji koja nije stranica, dovoljna za smeštaj ulaznih i izlaznih bafera. Adresa ovog bafera se postavlja u IRP u polje AssociatedIrp.SystemBuffer. I/O dispečer preuzima posao prepisivanja podataka između korisničkog bafera i pomoćnog bafera.

Direktan pristup podacima (bez bafera) - METHOD_OUT_DIRECT (2) - za izlaz, ili METOD_IN_DIRECT (1) - za ulaz; polje iz IRP - MdlAddress. Ovo je direktan poziv — I/O menadžer predaje memoriji fizičke stranice koje sadrže bafer korisničkog režima. Istovremeno, kreira pomoćnu strukturu MDL (Memory Descriptor List) za opis fiksnih stranica. A programer drajvera radi sa MDL-om.

Pristup preko bafera na nivou korisnika - METHOD_NEITHER (3); polje iz IRP - SystemBuffer. I/O menadžer prenosi virtuelne adrese u korisničkom režimu drajveru. A u drajveru morate raditi vrlo pažljivo s njima, jer bi drajver u ovom slučaju trebao raditi samo u kontekstu pozivajuće niti.

Kada aplikacija pošalje akcijski kod drajveru, pokreće se I/O menadžer. On je odgovoran za generisanje I/O paketa zahtjeva (IRP) i slanje ga drajveru na dalju obradu.

Razmotrićemo 3 vrste zahtjeva:

IRP_MJ_CREATE - bit će proslijeđen na CreateFile,

IRP_MJ_DEVICE_CONTROL - će biti prenošen od strane DeviceIoControl

IPR_MJ_CLOSE - na CloseHandle

IRP se sastoji od zaglavlja i stekova za dodjelu. I/O menadžer kreira broj ćelija I/O steka jednak broju drajverskih slojeva uključenih u obradu zahtjeva. Svakom vozaču je dozvoljen pristup svojoj vlastitoj lokaciji steka. Kada drajver prosledi IRP drajveru nižeg nivoa, pokazivač steka se pomera na lokaciju koja je potrebna drajveru. Suprotno tome, nakon obrade zahtjeva, pokazivač se pomjera na gornju ćeliju drajvera. Dobijanje pokazivača pomoću funkcije - IoGetCurrentStackLocation ().

Svaki stek dodjele sadrži pokazivač na DeviceObject i FileObject za koji je zahtjev pokrenut. IRP-ovi se uvijek pohranjuju u memoriju bez stranica.

Da bi drajver radio, kreiraju se i primenjuju sledeći objekti:

Driver object;

Objekti uređaja;

Faze vozača.

1) Kreiranje objekta drajvera. Kreira se kada se upravljački program učita u fazi njegovog pokretanja. U ovom trenutku pokreće se funkcija DriverEntry i popunjava se niz MajorFunction, kao i pokazivač na i iz objekta uređaja.

Objekt uređaja uključuje:

Vrsta uređaja.

2) Kreirajte simboličku vezu do uređaja. Da bi objekat "uređaj" postao dostupan kodu korisničkog načina rada, upravljački program mora kreirati u direktoriju "\ ??" koji mu je dostupan (kod korisničkog načina). drugi objekat je simbolička veza. Shablon.sys drajver kreira simboličku vezu "slshablon" za svoj uređaj "devshablon" u direktorijumu "\ ??", čija je vrijednost niz "\ Device \ devshablon".

Dakle, već prilikom učitavanja drajvera (u našem slučaju, u fazi učitavanja OS-a), imamo tri objekta u memoriji: drajver "\ Driver \ shablon", uređaj "\ Device \ shablon" i simboličku vezu na uređaj "\ ?? \ slshablon ".

3) Otvaranje. Zatim, kada se aplikacija pokrene, poziva se CreateFile. Postoji link do uređaja. Struktura objekta uređaja DEVICE_OBJECT dohvaća informacije o svom upravljačkom programu za posluživanje. I/O menadžer generiše IRP I/O paket zahteva tipa IRP_MJ_CREATE i šalje ga drajveru. Ovo je način na koji vozač zna da šifra korisničkog načina rada pokušava pristupiti svom uređaju. Ako vozač nema ništa protiv, onda vraća šifru uspjeha. Naš vozač ima posebnu proceduru otpreme koja reaguje na ovaj IRP - DispatchCreateClose (postoji kombinovana procedura za otvaranje i zatvaranje uređaja). Sadrži STATUS_SUCCESS u polju Io.Status.Status i 0 u Io.Status.Information, jer u ovom slučaju ne treba ništa prenositi. Ovaj odgovor drajvera je signal upravitelju objekata za kreiranje virtuelni fajl... Ovo kreira novi element u tablici rukohvata procesa s pokazivačem na objekt "datoteka" i vraća novu ručku kodu korisničkog načina.

Ako je sve u redu, pohranjujemo deskriptor datoteke koji vraća CreateFile u varijablu hDevice.

4) Operacije ulaz/izlaz. Sada smo u mogućnosti da izvršimo operacije za kontrolu ovog uređaja pozivanjem funkcija DeviceIoControl. Budući da drajver uređaja u principu može obavljati mnogo različitih zadataka, potrebno je nekako razlikovati zahtjeve. Ovo je svrha drugog parametra dwIoControlCode, nazvanog I/O kontrolni kod, koji je izgrađen prema određenim pravilima.

Koristeći deskriptor uređaja, I/O menadžer će dohvatiti informacije o servirnom drajveru, generisati I/O paket zahtjeva tipa IRP_MJ_DEVICE_CONTROL i poslati ga drajveru. Upravljački program će pozvati odgovarajuću DispatchControl proceduru, kojoj se kao parametri prosljeđuju kod akcije i informacije o adresama i veličinama ulaznih i izlaznih bafera. Sve se to prenosi putem IRP-a. U proceduri se iz IRP-a preuzimaju potrebne informacije: kod akcije, adresa bafera za prenos podataka.

Procedura DispatchControl izvodi potrebne radnje, u našem slučaju adresu IRP paketa iz ESI registra. Zatim prenosi rezultat kroz izlazni bafer u aplikaciju.

Slično prethodnoj proceduri, kroz IRP propuštamo status završetka i broj bajtova prenesenih iz drajvera.

U aplikaciji se ovi podaci formatiraju i prikazuju.

5) Zatvaranje. Kako bi to trebalo učiniti s ručkama koje više nisu potrebne, pozivanjem CloseHandle funkcije zatvaramo ručku uređaja.

6) Istovar drajvera. Uklonite simboličku vezu i uklonite objekt uređaja.

Kompleks (2) se sastoji od dva programa:

Aplikacija koja od drajvera traži IRP adresu, a zatim šalje ovu adresu na standardni prozor Windows.

Shablon.sys - vozač.

Shablon drajver radi nešto što se ne može uraditi na nivou korisnika u ovom slučaju definira sadržaj esi registra kada drajver radi.

Aplikacija u izlaznom baferu prima esi sadržaj, pretvara ga u heksadecimalni izlaz i šalje ga u standardni Windows prozor.

Ako trebate dobiti informacije od CMOS-a u drajveru, onda vam je potrebno:

Pošaljite CMOS pomak od interesa na port 70h;

Malo kašnjenje;

Dobijte informacije od luke 71h do al.

Zatim zapišite ove informacije u izlazni bafer.

A u aplikaciji morate uzeti informacije iz izlaznog bafera, po potrebi ih transformirati i prikazati, ili analizirati i, ovisno o rezultatu, prikazati potreban tekst u standardnom prozoru.

Ova laboratorija pretpostavlja da je drajver trajno instaliran u Windows pomoću .inf datoteke pomoću kontrolne table - instalacija hardvera: dodajte novi uređaj, instalirajte ručno, prikažite sve uređaje, imajte disk, pretražite da biste odabrali .inf datoteku (drajver mora biti u istom folderu).

Da biste proverili da li je drajver instaliran, izaberite Sistem, Hardver, Upravljač uređajima na kontrolnoj tabli.

1.3 Pristup postojećim drajverima iz aplikacija u korisničkom režimu

Algoritam rada aplikacije sa drajverom

Da bi radila sa drajverom, aplikacija u korisničkom režimu treba da dobije manipulator (ručku) drajvera. Ovaj manipulator se može dobiti pomoću API funkcije CreateFile ili CreateFileA, koja radi sa ASCII znakovima. Zatim se koristi API funkcija DeviceIoControl, kojoj se kao jedan od parametara prosljeđuje IOCTL kod. IOCTL kod je kontrolni kod pomoću kojeg drajver uči o operaciji koju aplikacija traži da izvrši, načinu prosljeđivanja parametara i pravima pristupa koja su aplikaciji potrebna za izvođenje ove operacije. Nakon što je aplikacija pozvala

IRP_MJ_DEVICE_CONTROL se šalje upravljačkom programu DeviceIoControl. Nakon obrade zahtjeva, kontrola se vraća aplikaciji, a aplikaciji ostaje da analizira odgovor vozača i zatvori otvorene ručke.

Primjer

U primjeru ispod, aplikacija korisničkog načina šalje zahtjev IOCTL_DISK_GET_PARTITION_INFO_EX drajveru sistema datoteka, analizira informacije koje prima i ispisuje format particije tvrdog diska.

#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 * / OTVORENO_POSTOJEĆE,

if (hDevice == INVALID_HANDLE_VALUE)

MessageBoxA (NULL, "Greška CreateFileA!", "Greška", 0);

if (DeviceIoControl (

/ * 1 * / (RUČKA) hUređaj,

/ * 5 * / & piPartitionInfo,

/ * 6 * / sizeof (piPartitionInfo),

/ * 7 * / & dwBytes vraćeno,

if (piPartitionInfo.PartitionStyle == PARTITION_STYLE_MBR)

MessageBoxA (NULL, "PARTITION_STYLE_MBR", "Naslov", 0);

inače ako (piPartitionInfo.PartitionStyle == PARTITION_STYLE_GPT)

MessageBoxA (NULL, "PARTITION_STYLE_GPT", "Caption", 0);

MessageBoxA (NULL, "PARTITION_STYLE_RAW", "Caption", 0);

MessageBoxA (NULL, "DeviceIoControl error", "Error", 0);

CloseHandle (hDevice);

Analiza primjera

Deklarisane su varijable potrebne da bi aplikacija radila. PARTITION_INFORMATION_EX je struktura koja opisuje informacije o sekcija hard disk.

typedef struktura (

) PARTITION_INFORMATION_EX;

U ovom dijelu programa poziva se funkcija CreateFileA da bi se dobio ručnik koji je upisan u varijablu hDevice.

Funkcija DeviceIoControl se poziva sinhrono. Na nju se prenosi:

deskriptor uređaja;

IOCTL kod IOCTL_DISK_GET_PARTITION_INFO_EX;

pokazivač na ulazni bafer, NULL u našem slučaju;

veličina ulaznog bafera;

pokazivač na izlazni bafer;

veličina izlaznog bafera;

pokazivač na varijabilna like DWORD, koji će pohraniti broj bajtova za vraćanje;

pokazivač na OVERLAPPED strukturu za koju se koristi asinhroni poziv funkcije.

Nakon što se kontrola vrati, u slučaju uspješnog završetka funkcije, informacije o particiji se pohranjuju u strukturu PARTITION_INFORMATION_EX.

Vrši se analiza i izlaz informacija. Prije povratka kontrole operativni sistem otvorene ručke se mogu zatvoriti. Funkcija CloseHandle (__ u HANDLE) vam omogućava da to učinite. Ako deskriptori nisu zatvoreni, operativni sistem će to učiniti umjesto vas.

2. Realizacija seminarskog rada

2.1 Korak 1

vježba: 1. Razvijte drajver kernela sa pristupom portovima, izvršavanjem radnji prema opciji i izlazom informacija u prozor Debug View (po opciji), kao i aplikaciju koja pokreće drajver.

Listing Kurs_test.cpp

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

if (hSCManager! = 0) (

// registriramo igrača u tablici SCManager

if (hService! = 0) (

// Brisanje unosa drajvera

DeleteService (hService);

CloseServiceHandle (hService);

return 0;

}

Beeper.sys listing

#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_Kao 988 // 987,77 Hz

void DO_DELAY (int time) (

dugo i, j;

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

}

void DO_BIG_DELAY (int time) (

DO_DELAY (2 * vrijeme);

}

void Xylophone (int nPitch) (

int nTone = TIMER_FREQUENCY / nPitch

_asm (

mov al, 10110110b; // upiši kontrolnu riječ u 43h

out 43h, al; // Kanal za kontrolu zvuka - logika koja koristi ton tajmera i softverski kontrolirani sistemski port bitova

mov eax, nTone; // zapisati preračunatu frekvenciju na 42

out 42h, al; // gornji dio

mov al, ah; // donji dio

van 42h, al

in al, 61h; // promijeniti izlaznu sekvencu - pretvoriti posljednje bitove u jedinice

; // bit 0 - dozvola za korištenje zvučnika

; // bit 1 - dozvola za povezivanje timera-2 na zvučnik

ili al, 00000011b; zvučnik UKLJUČEN

van 61h, al

}

DO_DELAY (0x7f);

_asm (

u al, 61h

i drugi, 11111100b; zvučnik isključen

van 61h, al

}

}

Ksilofon (PITCH_C);

Ksilofon (PITCH_S);

Ksilofon (PITCH_S);

Ksilofon (PITCH_S);

Ksilofon (PITCH_S);

Ksilofon (PITCH_S);

Ksilofon (PITCH_S);

return STATUS_DEVICE_CONFIGURATION_ERROR;

}

2.2 Korak 2

Razvijte drajver virtuelnog uređaja koji vam omogućava da izvodite radnje koje su dostupne samo na nultom nivou privilegija (u skladu sa opcijom), a zatim prenesite rezultate u aplikaciju na trećem nivou privilegija za njihovo prikazivanje.

U aplikaciji rezultat šaljemo u standardni Windows prozor.

Listing shablon.c

#include // razne NT definicije

#include

UNICODE_STRING g_usDeviceName;

UNICODE_STRING g_usSymbolicLinkName;

void DriverUnload (U PDRIVER_OBJECT pDriverObject) (

IoDeleteSymbolicLink (& g_usSymbolicLinkName);

IoDeleteDevice (pDriverObject-> DeviceObject);

}

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

pIrp-> IoStatus.Status = STATUS_SUCCESS;

pIrp-> IoStatus.Information = 0;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

return STATUS_SUCCESS;

}

NTSTATUS DispatchControl (PDEVICE_OBJECT pDeviceObject, PIRP pIrp) (// obrada IRP_MJ_DEVICECONTROL

NTSTATUS status;

int regEsi;

// uzimamo pokazivač na IO_STACK_LOCATION, u njemu na IoControlCode

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

// Uporedite kod akcije i ako je ovo naš klijent, onda:

_asm (

mov eax, 0

pokret, 10h

van 70h, al

u al, 71h

cbw

cwde

mov regEsi, eax

}

// ovo je naša funkcionalnost - preuzimamo sadržaj esi registra

// zapisuje u sistemski bafer

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

pIrp-> IoStatus.Informacija = 4; // i postavite veličinu rezultata

status = STATUS_SUCCESS;

) else status = STATUS_INVALID_DEVICE_REQUEST;

pIrp-> IoStatus.Status = status;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

povratak (status);

}

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

NTSTATUS Status;

PDEVICE_OBJECT pDeviceObject;

// inicijalizira Unicode stringove

RtlInitUnicodeString (& g_usDeviceName, L "\\ Uređaj \\ DevGet");

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

// popuniti pogonski objekat - jasno objasniti vozaču koja funkcija šta obrađuje

pDriverObject-> DriverUnload =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

// kreiranje logičkog objekta virtuelnog uređaja

Status = IoCreateDevice (pDriverObject, 0, & g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, & pDeviceObject);

if (! NT_SUCCESS (Status)) (vrati Status;)

// kreiramo simboličku vezu do uređaja

Status = IoCreateSymbolicLink (& g_usSymbolicLinkName, & g_usDeviceName);

if (! NT_SUCCESS (Status)) (

IoDeleteDevice (pDeviceObject);

return Status;

}

return Status;

}

Listing course2.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) (

HANDLE hDevice;

BOOL DevControl;

DWORD dwBytesReturned;

char stroka;

/*

Parametri:

lpFileName Adresa stringa završenog nultom koji specificira ime objekta za kreiranje ili otvaranje.

dwDesiredAccess Tip pristupa objektu. Ovaj parametar može uzeti bilo koju kombinaciju sljedećih vrijednosti:

Vrijednost: Opis:

0 Određuje upit o dostupnosti objekta na navedenom uređaju. Aplikacija može zahtijevati atribute uređaja bez pristupa.

GENERIC_READ Određuje pristup za čitanje iz objekta. Podaci se mogu čitati iz datoteke, a pokazivač datoteke može se pomicati. Kombinirajte sa GENERIC_WRITE za pristup čitanju i pisanju.

GENERIC_WRITE Određuje pristup pisanju objektu. Podaci se mogu upisati u datoteku, a pokazivač datoteke se može pomjeriti. Kombinirajte sa GENERIC_READ za pristup čitanju i pisanju.

dwShareMode Način zajedničkog pristupa objektu. Ako je vrijednost nula, objekt ne može dijeliti više programa. Sve naredne operacije otvaranja objekta neće uspjeti dok se ručka na objektu ne zatvori. Za dijeljenje objekta koristite kombinaciju sljedećih vrijednosti:

Vrijednost: Opis:

FILE_SHARE_DELETE Dozvoljava nizu otvorenih objekata da zatraži pristup za brisanje.

FILE_SHARE_READ Dozvoljava nizu otvorenih objekata da zatraži pristup za čitanje.

FILE_SHARE_WRITE Dozvoljava nizu otvorenih objekata da zatraži pristup pisanju

lpSecurityAttributes Adresa strukture SECURITY_ATTRIBUTES koja određuje može li ili ne rukohvat koji vraća funkcija biti naslijeđen od strane podređenog procesa.

Ako je lpSecurityAttributes NULL, tada se deskriptor ne može naslijediti.

dwCreationDisposition

Vrijednost: Opis:

CREATE_ALWAYS Uvijek kreira novi fajl.

Ako datoteka postoji, funkcija prepisuje datoteku.

CREATE_NEW Kreira novi fajl. Funkcija neće uspjeti ako datoteka postoji.

OPEN_ALWAYS Otvaranje datoteke, uvijek. Ako datoteka ne postoji, funkcija je kreira na isti način da je dwCreationDisposition bio CREATE_NEW.

OPEN_EXISTING Otvara fajl. Funkcija neće uspjeti ako datoteka ne postoji.

TRUNCATE_EXISTING Otvara datoteku i skraćuje je na nultu veličinu. Funkcija neće uspjeti ako datoteka ne postoji.

dwFlagsAndAttributes Zastavice i atributi datoteke.

Kada se otvori postojeća datoteka, CreateFile zanemaruje datoteku šablona.

Povratne vrijednosti:

Ako funkcija uspije, vraća se otvoreni rukohvat za navedenu datoteku. Ako navedena datoteka postoji prije poziva funkcije, a parametar dwCreationDisposition je CREATE_ALWAYS ili OPEN_ALWAYS, poziv GetLastError će vratiti ERROR_ALREADY_EXISTS čak i ako je funkcija uspješna. Ako datoteka ne postoji prije poziva, GetLastError će vratiti 0 (nula).

U slučaju greške, funkcija će vratiti INVALID_HANDLE_VALUE. Za više informacija o grešci pozovite GetLastError.

*/

if (hUreaj! = 0) (

/*

hDevice je ručka koju vraća CreateFile.

dwIocontrolCode je vrijednost koja označava operaciju koju treba izvesti.

lpInBuffer je adresa međuspremnika koji sadrži podatke potrebne za izvođenje operacije specificirane u dwIoControlCode. Ako operacija ne zahtijeva podatke, možete proslijediti NULL.

nInBufferSize je veličina u bajtovima podataka u baferu na koju ukazuje lpInBuffer.

lpOutBuffer je adresa bafera koji će biti popunjen izlazom kada operacija bude uspješna. Ako operacija ne daje izlaz, ovo polje MORA biti NULL.

nOutBufferSiz je veličina u bajtovima bafera na koju ukazuje lpOutbuffer.

lpBytesReturned je adresa dword varijable koja će primiti veličinu podataka unesenih u lpOutBuffer.

lpOverlapped je adresa OVERLAPPED strukture ako želite da operacija bude asinhrona. Ako želite da sačekate da se operacija završi, stavite NULL u ovo polje.

*/

wsprintf ((LPSTR) stroka, "% X", adwOutBuffer); // upisuje liniju u međuspremnik (adwOutBuffer -> stroka)

CloseHandle (hDevice);

return 0;

}

drajver kernel kompjuterski program

2.3 Korak 3

Listing course.cpp

#include

#include

#include

{

DWORD junk;

0, // atributi datoteke

povratak (FALSE);

}

0, // veličina ulaznog bafera

CloseHandle (hDevice);

povratak (bRezultat);

}

int main (int argc, char * argv)

{

/*

typedef struktura (

PARTITION_STYLE PartitionStyle; // format sekcije

LARGE_INTEGER StartingOffset; // pomak početka sekcije

LARGE_INTEGER PartitionLength; // veličina particije

DWORD PartitionNumber; // broj sekcije

BOOLEAN RewritePartition; // ako je sekcija ponovno upisiva onda TRUE

sindikat (

PARTITION_INFORMATION_MBR Mbr; // dodatne informacije o odjeljku MBR stil

PARTITION_INFORMATION_GPT Gpt; // dodatne informacije o odjeljku GPT stil

};

) PARTITION_INFORMATION_EX;

*/

BOOL bResult;

sistem ("PAUZA");

return ((int) bResult);

}

2.4 Korak 4

1) Kombinirajte svu funkcionalnost razvijenu u koracima 1-3 u jedan skup programa.

Konačni kompleks bi trebao izgledati ovako:

- Naš drajver je ugrađen u sistem i učitava se tokom faze pokretanja Windows-a.

- Aplikacija traži od vozača potrebne informacije (navedene u fazi 2), vozač prenosi te informacije, dok je zvučnik također uključen na neko vrijeme i pušta se melodija (navedena u fazi 1). Zatim aplikacija postavlja zahtjev upravljačkom programu koji postoji u sistemu (u skladu sa opcijom do faze 3).

2) Sastaviti objašnjenje, u kojem treba opisati sve 4 faze, kao i teorijske podatke za svaku fazu.

#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 Get PartitionNumber (PARTITION_INFORMATION_EX * pex)

{

HANDLE hDevice; // deskriptor provjerenog uređaja

BOOL bResult; // oznaka rezultata

DWORD junk;

hDevice = CreateFile (TEXT ("\\\\. \\ c:"), // uređaj za otvaranje

GENERIC_READ | GENERIC_WRITE, // pristup uređaju

FILE_SHARE_READ | FILE_SHARE_WRITE, // način zajedničkog korištenja

NULL, // zadani sigurnosni atributi

OPEN_EXISTING, // lokacija

0, // atributi datoteke

NULL); // ne kopiraj atribute datoteke

if (hDevice == INVALID_HANDLE_VALUE) (// nije moguće otvoriti uređaj

printf ("CreateFile () nije uspjelo! \ n");

povratak (FALSE);

}

bResult = DeviceIoControl (hDevice, // traženi uređaj

IOCTL_DISK_GET_PARTITION_INFO_EX, // operacija koja se izvodi

NULL, // pokazivač na ulazni bafer

0, // veličina ulaznog bafera

pex, sizeof (* pex), // izlazni bafer

& junk, // broj bajtova za vraćanje

(LPOVERLAPPED) NULL); // sinkronizacija ulaza/izlaza (I/O)

CloseHandle (hDevice);

povratak (bRezultat);

}

int _tmain (int argc, _TCHAR * argv) (

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

HANDLE hDevice;

BOOL DevControl;

DWORD dwBytesReturned;

LPVOID adwInBuffer, adwOutBuffer;

char stroka;

PARTITION_INFORMATION_EX pex; // struktura uređaja

BOOL bResult;

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

if (hUreaj! = 0) (

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

if ((DevControl! = 0) && (dwBytesReturned! = 0)) (

wsprintf ((LPSTR) stroka, "% X", adwOutBuffer); // upisuje liniju u međuspremnik (adwOutBuffer -> stroka)

if (stroka == "00000100") MessageBox (NULL, "Pronađeno 1,44 Mb", "Yermakov FDD skener", MB_OK);

else MessageBox (NULL, "Nije pronađeno", "Yermakov FDD skener", MB_OK);

hSCManager = OpenSCManager (NULL, NULL, SC_MANAGER_CREATE_SERVICE);

if (hSCManager! = 0) (

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

// Registrujte muzičara u SCM tabelama

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

if (hService! = 0) (

StartService (hService, 0, NULL);

DeleteService (hService);

CloseServiceHandle (hService);

) else MessageBox (NULL, "Ne mogu" registrovati drajver ", NULL, MB_ICONSTOP);

CloseServiceHandle (hSCManager);

) else MessageBox (NULL, "Ne mogu" se povezati na SCManager ", NULL, MB_ICONSTOP);

) else MessageBox (NULL, "Ne mogu" poslati kontrolni kod ", NULL, MB_OK);

CloseHandle (hDevice);

) else MessageBox (NULL, "Dev nije prisutan", NULL, MB_ICONSTOP);

bResult = GetPartitionNumber (& pex);

if (bRezult) (printf ("Broj particije =% d \ n", pex.Broj particije);

) else (printf ("GetPartitionNumber () nije uspio. Greška% d. \ n", GetLastError ());)

sistem ("PAUZA");

return ((int) bResult);

}

3. Rad aplikacije

Slika 3.1. Vozač iz koraka 2

Slika 3.2. Driver iz koraka 3

Objavljeno na Allbest.ru

Slični dokumenti

    Mehanizmi interakcije između drajvera režima jezgra i korisničke aplikacije: višeslojna arhitektura drajvera, algoritam za skrivanje podataka, interakcija drajver-aplikacija, korisnički interfejs programi za filtriranje pristupa datotekama.

    seminarski rad, dodan 23.06.2009

    Windows NT I/O arhitektura. Unutrašnja organizacija USB magistrala... Osnovna karakteristika modela WDM drajvera. Ulazne tačke drajvera koji se razvija, postavljanje koda u memoriju, instaliranje drajvera u sistem. Implementacija koda drajvera u C.

    seminarski rad, dodan 27.09.2014

    Struktura korisničkog načina rada koja omogućava korisniku interakciju sa sistemom. Opis načina rada kernela koji osigurava sigurno izvršavanje korisničkih aplikacija (programa). Windows NT hardverski sloj apstrakcije.

    prezentacija dodata 23.10.2013

    Kernel Windows 98. Uloga 16-bitnih modula kernela. Problemi sa performansama. Kooperativni i preventivni multitasking. Poboljšano korištenje resursa u Windows 98. Korištenje WordArt-a. MS Outlook Express: kreiranje i slanje poruka.

    test, dodano 14.04.2005

    Zajedničko funkcionisanje svih uređaja računara i pristup njegovim resursima. Koncept i funkcije grafičke operacione sale Windows sistemi... Pozadina windows servis... Kontrola sistem podataka... Plug and Play tehnologija. Grafički interfejs Windows.

    test, dodano 22.01.2011

    Karakteristike operativnog sistema. Istorija razvoja Windows-a. Uporedne karakteristike Windows verzije... Elementi i Windows alati XP. Aplikacioni programi u Windows XP. Desktop i laptop računari pod operativnim sistemom Windows.

    izvještaj dodan 16.10.2011

    Korištenje drajvera u režimu jezgra i kontrolne aplikacije za kreiranje sistemskih niti. Simulacija obrade podataka i organiziranje kašnjenja. Razvoj drajvera u C++. Konfiguracija testnog stola. Tačnost promjena u kašnjenju i radu tajmera.

    seminarski rad, dodan 24.06.2009

    Preliminarni rad na internoj strukturi Windows operativnog sistema. NT arhitektura i struktura jezgra. Metode za nadjačavanje funkcija u režimu kernela i režimu koristuvača. Razumijevanje vozača. I/O paketi. Procjena stabilnosti i sigurnosti Windows sistema.

    seminarski rad, dodan 02.01.2014

    Koncept, vrste i rad firewall-a. Ugrađeni Windows zaštitni zid. Windows XP SP2, pristup postavkama zaštitnog zida Windows XP servisni paket 2. Windows Vista, dozvoljen saobraćaj. Windows 7, aktivne postavke profila. Personal Firewall, nivoi testiranja.

    sažetak, dodan 19.11.2010

    Upoznavanje sa tehničke karakteristike PC... Instalacija operativnog sistema i Windows drajveri 7. Metode čišćenje prozora XP Professional SP3. Metode oporavka operativnog sistema. Performanse Microsoft instalacije Office 2010.

Microsoft u Windows 10 operativnom sistemu veliku pažnju posvećuje sigurnosti. Jedan od važnih elemenata sistema je “ Windows zaštitnik”, Ali nije u stanju da se nosi sa svim prijetnjama. Konkretno, nedavno, Ransomware virusi postaju sve popularniji, čije su najpoznatije reinkarnacije malware Petya i. Microsoft je implementirao izolaciju kernela i funkcije integriteta memorije u Windows 10 za borbu protiv Ransomware virusa. One su podrazumevano onemogućene.

Sadržaj:

Šta je izolacija kernela i integritet memorije

Izolacija jezgra je proces dodatne zaštite, koji se obezbeđuje metodom zaštite računarskih procesa od operativnog sistema i uređaja. Zbog ovih radnji moguće je izbjeći podrivanje rada operativnog sistema kada virusi dođu na računar.

Integritet memorije je zaštitna funkcija koja prati izolaciju kernela, koja ima za cilj ograničavanje pristupa nepoznatim potencijalno opasnim programima procesima sa visoki nivo sigurnost.

Važno: Funkcija izolacije kernela može raditi samo ako za to postoje dovoljni uslovi na dijelu hardvera računala. V BIOS postavke Tehnologija virtuelizacije mora biti aktivna, zbog čega računar sa operativnim sistemom Windows 10 može pokrenuti različite aplikacije u virtuelnom kontejneru, ograničavajući njihov pristup ključnim komponentama sistema.

Kako omogućiti izolaciju kernela i integritet memorije

Postavke operativnog sistema Windows 10 vam omogućavaju da preuzmete potpunu kontrolu nad sigurnosnim funkcijama na vašem računaru. Kroz postavke Windows 10 možete omogućiti izolaciju kernela i integritet memorije na sljedeći način:


Kao što je gore navedeno, ako hardver vašeg računara ne podržava virtuelizaciju, ovu funkciju neće raditi. Kada je omogućeno, korisnik će vidjeti poruku „Nije moguće osigurati integritet memorije. Moguća nekompatibilnost." Ako se pojavi ova poruka, preporučujemo da odete u BIOS i vidite da li je funkcija omogućena. Secure boot(Režim pokretanja).

Kako onemogućiti izolaciju kernela i integritet memorije

Nove funkcije u operativnom sistemu koje ozbiljno utiču na njegov rad uvek nose rizik da izazovu probleme sa računarom. Funkcija izolacije kernela nije izuzetak. Korisnici koji su ga već isprobali, na Microsoftovim forumima napominju da nailaze na probleme prilikom pokretanja brojnih igara i programa. Jedini način da riješite ovaj problem je da onemogućite izolaciju kernela i integritet memorije. Možda će u budućim ažuriranjima programeri aplikacija ili Microsoft popraviti ovu nekompatibilnost.

Postoje 3 načina da onemogućite izolaciju kernela i integritet memorije: