Driver je zastaraný volajúci jadra. Správa napájania v systéme Windows

Otázka: Keď je počítač dlhší čas spustený alebo sa prebúdza z režimu spánku, písmo sa stratí v ponuke Štart


Keď je počítač dlhší čas spustený alebo sa prebúdzate z režimu spánku, ponuka Štart vyzerá takto.

Ako to opravím? Pomôž mi prosím..

Odpoveď: už preinštalovaný operačný systém a aktualizovaný (

Otázka: Ako uvediem počítač do režimu spánku S1 („pohotovostný režim“)?


Ani na stacionárnom počítači, ani na prenosnom počítači nemôžem prísť na to, ako prepnúť počítač do režimu spánku S1.

Výsledok spustenia „powercfg / a“

V tomto systéme sú k dispozícii nasledujúce stavy hibernácie:
Pohotovostný režim (S3)

V tomto systéme nie sú k dispozícii nasledujúce stavy hibernácie:
Pohotovostný režim (S1)

Pohotovostný režim (S2)
Firmvér systému nepodporuje pohotovostný režim.

Hibernácia
Hibernácia nie je povolená.

Pohotovostný režim (pripojený)
Firmvér systému nepodporuje pohotovostný režim.

Hybridný režim spánku

Rýchly štart
Hibernácia nie je k dispozícii.

Odpoveď: Nechajte počítač niekoľko minút nečinný, potom ho presuňte do režimu spánku a prebudte ho.

V denníku udalostí:
Action => vytvoriť vlastné zobrazenie
V položke dátumu nastavte napríklad dvojminútový interval a sledujte, čo sa stalo.

Nemám už žiadne nápady.

Skontrolujte ovládače a zariadenia pripojené k počítaču

Otázka: Vstáva o 4:00


Takmer každú noc sa prebúdza počítač a prebúdza ma.
v správcovi zariadení, sieťové adaptéry, zrušil začiarkavacie políčko „Zobuď sa s kúzelnými paketmi“.
deaktivoval časovače prebudenia v nastaveniach napájania.
na príkazovom riadku to ukazuje príkaz powercfg / waketimers.

c: \> powercfg / waketimers
Časovač nastavený starším volajúcim jadra platí 1. septembra 2016 do 4:14:46.
Príčina:

Pomoc. Kto je na vine a čo robiť?

Odpoveď: nakoniec vyliečil túto chorobu:

Ovládací panel -> Zabezpečenie a údržba -> Údržba -> Automatická údržba -> Zmeniť nastavenia údržby -> zrušte začiarknutie políčka „Povoliť úlohe údržby prebudiť počítač ...“

Otázka: Počítač sa v noci spontánne zapne


Naposledy (asi 1 ... 2 mesiace), asi 30 ... 60 minút po prepnutí počítača do režimu spánku (aby ste mohli pokračovať v práci ráno od momentu, kedy bol prerušený), sa spontánne zapne . Prácu končím asi o 12 v noci, t.j. k zapnutiu dôjde o 0:30 ... 1:00 hod. Monitor však zostáva tmavý. Vstanem z postele, pohnem myšou - monitor sa zapne, vstúpim do profilu v normálnom režime, vrátim ho späť do režimu spánku - dnes v noci sa už viac nezapne.

Na počítači Win7 je rezidentný antivírus MS Cecurity Esentials. Aktuálne (čerstvo stiahnuté) vytvrdzovacie nástroje mbar a DrWeb Cureit som spustil niekoľkokrát - narazili na niekoľko byakov, ale stále zostala spontánna aktivácia. Vyzerá to ako vírus, ktorý spája môj počítač s útokmi DDOS. Navyše, z času na čas Google zablokuje prístup kvôli podozrivému prenosu pochádzajúcemu z mojej IP. Deje sa to už dlho (viac ako rok), ale spontánny štart počítača som zaznamenal len nedávno.

Otázka skutočne znie: ak je problém známy a je relatívne ľahké ho odstrániť, stiahnem si odporúčaný softvér, naskenujem ho a zverejním. Ak je problém komplikovanejší, potom neoklamem seba ani miestneho guru a hlúpo prestavím systém.

Odpoveď: Sokoliar Niečomu som celkom nerozumel ...

Správa od Sokoliar

po prepnutí počítača do režimu spánku ... sa spontánne zapne

Spánok a hibernácia v 7 sú úplne odlišné veci. Ak chcete prepnúť do režimu spánku, stačí stlačiť tlačidlo Spánok na klávesnici. Ak kliknete na tlačidlo Štart a umiestnite kurzor myši na šípku vedľa položky Vypnúť, zobrazí sa ponuka, v ktorej je aj režim dlhodobého spánku. a hibernácia. Počas hibernácie je počítač odpojený od zdroja napájania rovnakým spôsobom ako pri vypnutí, ale keď počítač zapnete, môžete začať pracovať rovnako ako po režime spánku.
Ale pýtaš sa na niečo iné. Skontrolovali ste Plánovač úloh?

Otázka: Počítač sa v noci prebúdza zo spánku


Dobrý deň všetkým. Tento problém ma už dostal. Samotný počítač v noci prejde z režimu spánku, je to Windows 10, predtým bolo 7, nebol taký problém, takže som si vybral túto konkrétnu časť.
Čo sa už stalo pred 2 dňami:
1. V prehliadači udalostí som našiel dôvod: Časovač - Spustí sa naplánovaná úloha „NT TASK \ Microsoft \ Windows \ UpdateOrchestrator \ Reboot“, ktorá požiada počítač, aby sa prebral z režimu spánku.
Išiel som do Plánovača úloh, našiel som túto úlohu a zrušil začiarkavacie políčko z položky: Podmienky - Na dokončenie úlohy zobudte počítač.
2. Išiel som na powercfg.cpl - Nastavenia schémy napájania - Zmeniť pokročilé nastavenia napájania - Spánok - Povoliť časovače prebudenia - VYPNÚŤ.

Dnes v noci sa situácia opakovala, ale pri sledovaní udalostí som našiel iba:

Systém ukončil režim hibernácie.

Čas spánku: 2016-10-29T21: 38: 38,657073700Z
Čas prebudenia: 2016-10-29T21: 58: 34,625754700Z

Výstupný zdroj: Žiadne údaje

3. V správcovi zariadení som zrušil začiarkavacie políčko „umožniť tomuto zariadeniu prebudiť počítač z pohotovostného režimu“ z myši, klávesnice, sieťovej karty a kdekoľvek, kde som to našiel ...

Pomôcť vyriešiť tento problém Už neviem, kde mám kopať ...

Odpoveď:

Správa od GoLeMjkeee

Náklady denne od 2 do 00

Zmeniť na denné.

Správa od GoLeMjkeee

ale kliešť .... nestojí to za to.

Je taká, má charakter.

Otázka: Ako odstrániť obrazovku pomocou tlačidla „Prihlásiť sa“ pri ukončení režimu spánku?


Windows 10 Pro 1607.
Keď ukončíte režim spánku, systém Windows vás požiada o stlačenie klávesu „Enter“. Po prebudení sa objaví modrá obrazovka s nápisom používateľského mena a pod ním tlačidlo „Prihlásiť sa“. Heslo nie je nastavené, používateľ je jediný v systéme, ktorý má práva správcu. Pri načítaní je všetko v poriadku, žiadne obrazovky ani kliknutia na tlačidlá, iba pracovná plocha.

V Možnosti-Účty Záznamy- parametre neexistuje žiadny záznam „Vstup je potrebný“.
V okne Účty používateľov, na karte Používatelia nie je začiarknuté políčko „Vyžadovať používateľské meno a heslo“.
V nastaveniach plánu napájania nie je žiadna položka „Vyžadovať heslo pri prebudení“.

Ako môžem odstrániť tlačidlo „Enter“ pri ukončení režimu spánku, aby počítač automaticky spustil pracovnú plochu bez tohto okna?

Odpoveď: odstrániť hibernáciu

Otázka: Windows 8.1 sa v režime spánku vypne


Ahoj.
Mám problém s hibernáciou. Počítač sa počas spánku úplne vypne. Títo. sila úplne zmizne. Predtým žiarovka na systémovej jednotke blikala v pražci, teraz myš tiež úplne „vybledne“ s usb, klávesnica zhasne a dá sa zapnúť iba tlačidlom napájania a všetky infa sa samozrejme neuložia.
Čítal som veľa tém na internete, ale ani jeden problém nie je podobný tomu môjmu.
Hneď napíšem charakteristiku PC: základná doska ASUS p8h67, video Radeon HD7850 (asus), intel i5 2550k, 8gb RAM, SSD Silicon Power s55 120gb, HDD WD 500gb.
Nainštalovaný Windows 8.1 stojí už veľmi dlho a hibernácia fungovala tak, ako by mala. Akonáhle prestal fungovať, už ani presne neviem, prečo a po akej (nejakej akcii) prestal fungovať. Nič také som nenainštaloval, nezdalo sa, že by som aktualizoval ovládač.
Často zo zvyku, namiesto aby som ho vypol, stlačil som spánok a raz to fungovalo a fungovalo niekoľko dní, ale časom to prestalo fungovať.
Skúsil som aktualizovať alebo odinštalovať ovládače. Pokúsil som sa odpojiť nepotrebné zariadenia od počítača (no, nikdy neviete). Pred spaním som vypol rôzne programy. Nič nepomáhalo.
Na internete som našiel jediné informácie, ktoré sú úplne rovnaké ako moje (bod 8):

Samozrejme, nemohol som nainštalovať ovládače, rôzne platformy. To isté som pre seba nenašiel.

Nechcem preinštalovať OS. všetko (okrem toho spiaceho) funguje dobre.
Nejaké nápady, čo by mohlo byť zle?

Pridané po 17 minútach
Zabudli ste napísať, čo sa BIOS resetuje a aktualizuje.

Odpoveď: potom skontroluj buď BP alebo matku. Programovo sme zapli režim spánku a hibernácie powercfg / h.

Ďalšou možnosťou je skontrolovať (nahradiť). hiberfil.sys - je zodpovedný za hibernáciu.

Otázka: Hibernujte v systéme Windows 8


po opustení spánku režim Windows 8 sa začne reštartovať a po načítaní okien zlyhá nasledujúca správa
povedz mi, ako sa s tým vysporiadať?

Odpoveď:

Správa od azat145

po ukončení režimu dlhodobého spánku sa Windows 8 reštartuje

Najprv.
Neskôr.

Otázka: Hybridný spánok alebo hibernácia? Čo je vhodnejšie na pracovnej ploche?


Otázka je vo všeobecnosti v názve. Ako som pochopil z vyhľadávača, respektíve z rovnakého článku skopírovaného na všetky stránky, výhoda hybridného režimu spánku je iba v rýchlosti zapnutia, prebúdzania, dalo by sa povedať. A ak chcem na svojom počítači so systémom Windows 7 x64 používať režim hibernácie, existujú úskalia? Potrebujem len vypnúť napájanie a je lepšie to nerobiť v režime hybridného spánku. Ďakujem všetkým, ktorí odpovedajú

Odpoveď: Dnes som to čítal. Dobre, podľa môjho názoru neexistuje iná odpoveď na moju otázku ako krátky briefing od spoločnosti Microsoft. Potom sa podelím o svoje zistenia (pre tých, ktorí na podobnú otázku spadajú do tejto témy).
Takže:

klady Režim hybridného spánku: 1. Rýchle spustenie, nie je potrebné úplne vypnúť počítač;
Mínusy: 1. Načíta pevný disk (podľa jedného moderátora zo sekcie Windows 7 na našom fóre); 2. Nevypína sa úplne, pokračuje v spotrebe prúdu, aj keď trochu (aj keď pre niektorých je táto položka plus)

Hibernácia je skrátka potrebná, ak sa chcete neustále vypínať zo siete, ale nechcete dlhodobo načítať / vypínať OS.
Režim hybridného spánku - pre tých, ktorí sú spokojní s počítačom, ktorý je neustále v sieti.

Otázka: Notebook sa predtým vypínal pri štarte, teraz je v režime spánku


Môj prenosný počítač DELL INSPIRON 3521 s Windows 8.1 sa pri štarte vypínal (zobrazilo sa logo DELL - vypnutie - znova zapnúť a normálna práca). Aktualizoval som systém na 10k, nepomohlo to. Nosil som ho v stredisku horských služieb, známom v meste a ospevovanom - tam notebook bezpečne odpočíval 2 týždne pred ľudskou pozornosťou. Keď som to vzal, vyriešil som problém vypnutím rýchleho spustenia a na oslavu som sa vrátil k 8.1.
Uplynul mesiac a teraz, keď zatvorím veko prenosného počítača, prejde do režimu spánku (ako v nastaveniach), ale po 20 minútach alebo o niečo viac sa úplne vypne (predtým to tak nebolo nastavenia napájania sa nezmenili). Pri zapnutí situácia, ktorú som popísal vyššie: zapnutie - logo - vypnutie. Normálna prevádzka po reštarte. Všetky ovládače sú aktuálne. V čom môže byť problém a ako ho opraviť? Škoda toho chudobného - celkovo rok a pol, ale mám diplom a štátne osvedčenia - teraz to nemôžem nosiť okolo majstrov ...

Odpoveď: Ako chceš aby to fungovalo Osobne používam hibernáciu, nie hibernáciu, prechod do hibernácie je povolený aj v nečinnosti, nastavenia v prílohe

Prenos nastavení napájania

V mojom hlavnom prenosnom počítači sa často vyskytujú rôzne problémy s napájaním, čo sa dá vysvetliť prácou v zasvätených zostavách. Avšak aj pri stabilnom vydaní 1803 som si všimol, že môj systém prestal spať. V takom prípade sa monitor po určenom čase vypol, čo naznačovalo správne určenie stavu nečinnosti systémom.

Nastavil som malé obdobie prechodu do režimu spánku, 1-2 minúty, a začal som diagnostikovať.

Kontrola požiadaviek na subsystém napájania z aplikácií a ovládačov

Prvým krokom je pozrieť sa dovnútra powercfg, ktorý bráni operačnému systému zaspať. Procesy a ovládače pristupujúce k subsystému napájania je možné vidieť v príkazovom riadku ako správca:

Powercfg -žiadosti

Ihneď vidíte, že požiadavka na SYSTÉM pochádza z DRIVER - v tomto prípade Realtek používa audio stream.

Zoznam môže obsahovať aj WebRTC z prehliadača Chrome a bezprostredne po reštarte systému môžete vidieť žiadosti o optimalizáciu sťahovania, index vyhľadávania, ktoré však rýchlo zmiznú. Do zoznamu vylúčení môžete pridať proces alebo ovládač a nebude vám to brániť v spánku.

Powercfg -požaduje nahradenie OVLÁDAČA „Realtek High Definícia zvuku(HDAUDIO \ FUNC_01 & VEN_10EC & DEV_0269 & SUBSYS_17AA2204 & REV_1002 \ 4 & d00657 & 0 & 0001) "SYSTÉM

Príkaz znie ako „ignorovať požiadavku DRIVER [úplné meno ovládača] na SYSTÉM“.

Zoznam vylúčení je uložený v kľúči databázy Registry

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power \ PowerRequestOverride

a je vydaný príkazom

Powercfg -požaduje prepísanie

Pre istotu som reštartoval, ale systém odmietol spať. Po skontrolovaní výnimiek a zoznamu žiadostí som zistil, že ovládač Realtek naďalej používal zvukový stream, aj keď bol uvrhnutý do výnimiek.

Trochu som tancoval s tamburínou okolo výnimiek, ale neuspel som. Rýchle googlovanie potvrdilo, že v niektorých prípadoch nefungovali. To je typické pre staršie otázky, ale toto bol iný prípad a nie som prvý, komu sa to stalo.

Nakoniec som odstránil Realtek zo zoznamu. Položky môžete odstrániť v editore databázy Registry alebo konzole. Príkaz je takmer rovnaký ako pri pridávaní, len neindikuje, kam požiadavka smeruje, t.j. v tomto prípade nie je na konci príkazu SYSTÉM:

Powercfg -požaduje overenie ovládača „Realtek High Definition Audio (HDAUDIO \ FUNC_01 & VEN_10EC & DEV_0269 & SUBSYS_17AA2204 & REV_1002 \ 4 & d00657 & 0 & 0001)“

Pôjdeme inou cestou

Výpočet procesu pomocou zvukového subsystému

Je známe, že ovládač Realtek sa zaoberá špinavými skutkami. Je zrejmé, že je načítaný pri spustení systému, takže názov súboru je ľahké zistiť pomocou Autoruns.

Tri položky sa týkajú dvoch súborov, z ktorých jeden je, ako naznačuje názov, ovládacím panelom. Preto objektom záujmu bolo ravbg64.exe.

Microsoft v operačnom systéme Windows 10 platí veľká pozornosť bezpečnosť. Jednou z dôležitých prvkov systému je „ Ochranca systému Windows”, Ale nedokáže sa vyrovnať so všetkými hrozbami. V poslednej dobe získavajú na obľube predovšetkým vírusy Ransomware, medzi ktoré najznámejšie reinkarnácie patria malware Peťa a. Spoločnosť Microsoft implementovala v systéme Windows 10 funkcie izolácie jadra a integrity pamäte na boj proti vírusom Ransomware. Štandardne sú vypnuté.

Obsah:

Čo je izolácia jadra a integrita pamäte

Izolácia jadra je proces dodatočnej ochrany, ktorý je poskytovaný metódou ochrany počítačových procesov pred operačný systém a zariadeniami. Vďaka týmto akciám je možné vyhnúť sa narušeniu prevádzky operačného systému, keď sa do počítača dostanú vírusy.

Integrita pamäte je ochranná funkcia, ktorá sprevádza izoláciu jadra a ktorá je zameraná na obmedzenie prístupu neznámych potenciálne nebezpečných programov k procesom s vysokou úrovňou zabezpečenia.

Dôležité: Funkcia izolácie jadra môže fungovať iba vtedy, ak sú na to hardvér počítača dostatočné podmienky. V nastaveniach systému BIOS musí byť aktívna virtualizačná technológia, vďaka ktorej môže počítač so systémom Windows 10 spúšťať rôzne aplikácie vo virtuálnom kontajneri, čím sa obmedzí ich prístup z kľúčových systémových komponentov.

Ako povoliť izoláciu jadra a integritu pamäte

Nastavenia operačného systému Windows 10 vám umožňujú prevziať plnú kontrolu nad funkciami zabezpečenia vo vašom počítači. Naprieč Nastavenia systému Windows 10, môžete povoliť izoláciu jadra a integritu pamäte nasledovne:


Ako je uvedené vyššie, ak hardvér počítača nepodporuje virtualizáciu, túto funkciu nebudem pracovať. Keď je táto možnosť povolená, používateľovi sa zobrazí správa „Nedá sa zaistiť integrita pamäte. Možná nekompatibilita. " Ak sa zobrazí táto správa, odporúča sa prejsť do systému BIOS a zistiť, či je táto funkcia povolená. Bezpečné spustenie(Boot Mode).

Ako vypnúť izoláciu jadra a integritu pamäte

Nové funkcie v operačnom systéme, ktoré vážne ovplyvňujú jeho činnosť, vždy predstavujú riziko, že spôsobia problémy s počítačom. Funkcia izolácie jadra nie je výnimkou. Používatelia, ktorí to už vyskúšali, si na fórach spoločnosti Microsoft všimnú, že pri spustení niekoľkých hier a programov sa stretávajú s problémami. Jediným spôsobom, ako vyriešiť tento problém, je zakázať izoláciu jadra a integritu pamäte. Možno v budúcich aktualizáciách túto nekompatibilitu vyriešia vývojári aplikácií alebo spoločnosť Microsoft.

Existujú tri spôsoby, ako zakázať izoláciu jadra a integritu pamäte:


Odoslanie dobrej práce do znalostnej základne je jednoduché. Použite nižšie uvedený formulár

Študenti, postgraduálni študenti, mladí vedci, ktorí pri štúdiu a práci využívajú vedomostnú základňu, vám budú veľmi vďační.

Publikované na http://www.allbest.ru/

1. Teoretické informácie

1.1 Vývoj ovládačov jadra systému Windows

Stručné teoretické informácie

Vývoj ovládača jadra

Ovládač je počítačový program, prostredníctvom ktorého iný program (zvyčajne operačný systém) pristupuje k hardvéru štandardným spôsobom.

Útržkovitý príklad, ako fungujú rôzne typy ovládačov:

Je vhodné rozdeliť na 2 typy:

- Ovládače jadra (pracujú na úrovni oprávnení 0, ale nijako nekomunikujú ani s užívateľským programom, ani so zariadením. Práve s nimi začneme (sú jednoduchšie a môžu byť aj užitočné).

Ovládače zariadenia sú potrebné na interakciu medzi užívateľským programom a zariadením, a to na prenos údajov medzi nimi a na ovládanie zariadenia. Zariadenia môžu byť navyše skutočné aj virtuálne). Vodič nemusí ovládať žiadne fyzické zariadenie. Niektoré operačné systémy tiež umožňujú vytvárať ovládače virtuálnych zariadení - objekty, ktoré sa správajú ako I / O zariadenia, ale nekorešpondujú so žiadnym fyzickým zariadením.

Komponenty jadra bežia v režime privilegovaného procesora (nazýva sa režim jadra), môžu robiť všetko, a to:

- môžu vykonávať privilegované príkazy procesora (ako lgdt),

- môže mať prístup k systémovým údajom a kódu,

- mať priamy prístup k zariadeniu, napríklad prostredníctvom portov

- mať prístup k pamäťovým bunkám; ovládač nemôže manipulovať priamo s fyzickou pamäťou, ale môže získať virtuálnu adresu pre akúkoľvek fyzickú pamäť a manipulovať s ňou.

Ak potrebujete napísať akúkoľvek serióznu aplikáciu, ktorá vyžaduje prístup k vnútorným funkciám alebo dátovým štruktúram systému, môžete naraziť na mnohé obmedzenia, ktoré je možné prekonať iba umiestnením kódu do priestoru adries systému. Jediným zdokumentovaným spôsobom, ako to urobiť, je nainštalovať ovládač. Táto metóda je pomerne jednoduchá, spoľahlivá a hlavne je plne podporovaná samotným operačným systémom.

Kód jadra (v skutočnosti je to samotný systém) sa považuje za úplne dôveryhodný. Po načítaní do priestoru adries systému sa ovládač stane súčasťou systému a nevzťahujú sa naň žiadne obmedzenia. V systéme Windows je to prakticky jediný spôsob, ako môžu vývojári mimo OS písať systémové komponenty na úrovni jadra.

Na písanie a štúdium spôsobov vývoja ovládačov používajú DDK (Device Development Kit) - systém na vývoj ovládačov.

Okrem dokumentácie obsahuje DDK aj sadu súborov na zahrnutie (* .inc) a súborov knižnice (* .lib).

Windows teda podporuje rôzne typy ovládačov zariadení, ale okrem toho existujú aj ovládače, ktoré nie sú ovládačmi zariadení, ale jednoducho vám umožňujú vytvárať programy, ktoré pobežia v režime jadra Windows, t.j. na úrovni oprávnení 0. Pritom majú plný prístup k operačnému systému a hardvéru.

Pozrime sa na najjednoduchší ovládač režimu jadra.

#zahrnúť

int DriverEntry (

V PDRIVER_OBJECT pDriverObject,

IN PUNICODE_STRING pusRegistryPath) (

}

Vstupným bodom je DriverEntry, ktorý je štruktúrovaný ako postup, ktorý má dva parametre:

pDriverObject je ukazovateľ na novovytvorený objekt ovládača. Pri načítaní ovládača systém vytvorí objekt ovládača, ktorý v pamäti predstavuje jeho obrázok. Systém prostredníctvom tohto objektu ovláda vodiča. Objekt ovládača je bežná dátová štruktúra typu DRIVER_OBJECT.

pusRegistryPath Ukazovateľ na kľúč databázy Registry obsahujúci parametre inicializácie ovládača.

Tento náš prvý ovládač sa načíta iba do systému a ihneď sa uvoľní.

Teraz sa pozrime na program šablón, ktorý bude potrebné použiť na vývoj programu v prvom kroku práce na kurze (ovládač režimu jadra beeper.sys).

Úlohou tohto ovládača je zahrať jednu notu až do prvej oktávy o dynamike systému. Na to ovládač používa pokyny pre vstup a výstup procesora podľa príslušných vstupno -výstupných portov. Je všeobecne známe, že prístup k I / O portom je systémový zdroj, ktorý systém Windows posvätne stráži. Pokus o prístup k ľubovoľnému z nich, vstupnému aj výstupnému, z používateľského režimu nevyhnutne vedie k výnimke.

V našom prípade bude reproduktor fungovať (na tento účel sa používa najmä port 61h, 0 a 1 bit, port 43h a 42h).

Na začiatku ovládača je definovaných všetkých 12 poznámok.

Bude potrebné nielen zapnúť reproduktor, ale nastaviť aj frekvenciu zvuku. Na tento účel sa používa subsystém časovača, ktorý pracuje nezávisle od procesora a má 3 kanály. Výstup z kanála 2 je pripojený k reproduktoru, ktorý slúži na generovanie zvuku rôznych frekvencií. Počuteľný rozsah zvuku je 30 Hz-6 000 Hz.

Ak chcete nastaviť frekvenciu zvuku, riadiace slovo 0Bh sa odošle na port 43h (register príkazov časovača):

mov al, 0Bh

mimo 43h, al

Táto hodnota určuje číslo kanála, ktorý budeme ovládať, typ operácie, režim prevádzky kanála a formát počítadla.

Potom sa prepočítaná zvuková frekvencia (1193167 / frekvencia (Hz)) odošle na port 42h v dvoch častiach (najskôr dolná časť, potom vysoká).

Chceme napríklad získať zvukovú frekvenciu 100 Hz. Prepočítame frekvenciu,

1193167/100 = 11931

Potom:

pohyblivá sekera, 11931

mimo 42h, al

mov al, ah

mimo 42h, al

V prvom kroku práce na kurze je potrebné zmeniť program tak, aby produkoval ďalšie hudobné zvuky (každý má variant).

Úlohy často musia mať rôzne trvanie. Na tento účel je vhodné použiť procedúru DO_DELAY tak, že do nej zadáte nepriamo definovaný parameter „čas zvuku“.

Na uľahčenie ladenia ovládača existujú rôzne nástroje. Najjednoduchšie je zobraziť potrebné informácie v špeciálnom okne obslužného programu Debug View. Tento program je predbežne spustený a nakonfigurovaný tak, aby zachytával správy z úrovne jadra. Pre výstup program volá funkciu DbgPrint, ktorá má jeden parameter - výstupný reťazec. Po spustení ovládača sa všetok výstup zobrazí v okne Debug View.

Existuje niekoľko spôsobov, ako nainštalovať ovládač do jadra. Pretože náš ovládač systém v skutočnosti nepotrebuje (neriadi žiadne zariadenie), dočasne pripojíme ovládač k systému a potom ho odstránime.

Na to musíte vytvoriť aplikáciu, ktorá spustí ovládač. Ako? Ovládač je služba na úrovni jadra. Aplikácia preto bude používať SCM - Service Control Manager, ktorý je súčasťou systému Windows a beží na užívateľskej úrovni.

Preto musíte vytvoriť riešenie z dvoch projektov: konzolová aplikácia a ovládač.

Na vývoj ovládačov v jazyku C musíte najskôr:

- nainštalovať DDK,

- nastavte premennú prostredia WNETBASE (hodnota je cesta k DDK, napríklad e: \ winddk \ 3790.1830).

Projekt ovládača musí byť typu MakeFile.

Vykonajte nastavenia projektu pomocou Nastavenia aplikácie a napíšte riadok do poľa Zostaviť príkazový riadok

ddkbuild -WNETXP chk. -ceZ

čo znamená volanie špeciálneho skriptu na prepojenie VC s DDK

Súbory musia byť prítomné v aktuálnom priečinku projektu:

sources, makefile, ddkbuild.cmd (skript), zdrojový súbor ovládača.c

Po vybudovaní projektu musí mať vodič rozšírenie sys.

Aplikácia spustí ovládač beeper.sys, t.j. zaregistruje ho do registra a spustí ho. Potom, keď je hotový, vymaže ho z registra.

Aby aplikácia spustila ovládač, po vytvorení riešenia, ktoré pozostáva z dvoch projektov - aplikácie a ovládača, musíte umiestniť spustiteľný súbor aplikácie a ovládač do rovnakého priečinka a potom aplikáciu spustiť.

Ovládače je veľmi ťažké odladiť. V prípade chýb v prevádzke OS najčastejšie visí a je potrebné reštartovať počítač. A pre náš ovládač musíte po reštarte tiež odstrániť službu beeper06 z registra pomocou regedit (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \) a potom znova reštartovať.

1.2 Ovládače virtuálnych zariadení Windows

Doteraz sme vyvíjali ovládač v režime jadra, ktorý dokáže veci, ktoré nie je možné vykonať na používateľskej úrovni, najmä prácu s I / O portami. Takýto ovládač sa nazýva ovládač jadra, ale nie ovládač zariadenia, pretože medzi užívateľským programom a zariadením sa neprenášajú žiadne údaje (koniec koncov, prečo je ovládač zvyčajne potrebný? Organizovať výmenu údajov medzi užívateľskou aplikáciou a zariadenie).

Teraz budeme vyvíjať ovládače zariadení, ktoré prenášajú údaje medzi užívateľskou aplikáciou a zariadením tam a späť.

Keď aplikácia vyžaduje operáciu I / O, zavolá sa ovládač. Na tento účel môže aplikácia vydať požiadavku na čítanie údajov zo zariadenia alebo na zápis údajov do zariadenia. A ak je potrebná nejaká iná akcia, napríklad hlasovanie alebo ovládanie zariadenia, alebo niečo iné, tak tzv. Rozhranie IOCTL (ovládanie vstupu a výstupu zariadenia).

Budeme zvažovať práve taký prípad pre virtuálne zariadenia, pretože prečo častejšie potrebujeme virtuálne zariadenie v ovládači? Aby ste doň mohli prenášať údaje, ktoré môže vodič nejakým spôsobom spracovať (čo je v aplikácii nemožné) a vrátiť výsledok do aplikácie. Pripomeňme si, že obvyklý ovládač jadra, o ktorom sme hovorili vyššie, z aplikácie nič nevzal a nič tam nevrátil, ale jednoducho vykonal akcie, ktoré aplikácia nemala k dispozícii.

Keď aplikácia vyžaduje operáciu I / O, zavolá sa ovládač. Na to slúžia tzv. Rozhranie IOCTL (ovládanie vstupu a výstupu zariadenia).

Volajúca aplikácia robí nasledujúce:

1) Otvorenie súboru a získanie jeho deskriptora:

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

Výsledkom je, že ak sa všetko stalo úspešne, dostaneme deskriptor zariadenia.

2) Odoslanie akčného kódu vodičovi (čo robiť, vodič môže implementovať mnoho rôznych akcií):

vyvolať DeviceIoControl, deskriptor, akčný kód, adresa vstupnej vyrovnávacej pamäte, veľkosť vstupných údajov, adresa výstupnej vyrovnávacej pamäte, veľkosť výstupných údajov, adresa vyrovnávacej pamäte pre skutočný počet bajtov

3) Zatvorte súbor a podľa toho uvoľnite deskriptor.

vyvolajte rukoväť zariadenia CloseHandle

Na prenos údajov sa moduly (aplikácia a ovládač) musia dohodnúť na protokole interakcie (akčné kódy, štruktúra vyrovnávacích pamätí - vstup a výstup).

Rovnaký akčný kód sa používa v aplikácii aj v ovládači.

Kód akcie v aplikácii a v ovládači môže byť zapísaný v hexadecimálnej forme alebo môžete použiť makro CTL_CODE, ako sa to robí v ukážkovom laboratóriu. pracovať v súbore common.inc.

Pozrime sa na príklad akčného kódu z ovládača virtuálneho zariadenia, ktorý sa používa v tomto laboratóriu. Názov je IOCTL_GET.

V prípade virtuálneho zariadenia je príznak súboru 0.

Typ zariadenia - FILE_DEVICE_UNKNOWN = 22 hodín

Prístupové práva - FILE_READ_ACCESS + FILE_WRITE_ACCESS = 1 + 2 = 3 = 11b

Kód funkcie je v rozsahu 800 h až FFFh. Máme 800 hodín.

Spôsob ukladania do vyrovnávacej pamäte - spôsob prenosu údajov medzi aplikáciou a ovládačom (sú možné tri):

Pre malé množstvo údajov sa zvyčajne používa METHOD_BUFFERED (00b) - v nestránkovej pamäti je alokovaná ďalšia vyrovnávacia pamäť, ktorá postačuje na umiestnenie vstupných a výstupných vyrovnávacích pamätí. Adresa tejto vyrovnávacej pamäte je umiestnená v IRP v poli AssociatedIrp.SystemBuffer. I / O dispečer preberá prácu pri prepisovaní údajov medzi užívateľskou vyrovnávacou pamäťou a pomocnou vyrovnávacou pamäťou.

Priamy prístup k údajom (bez vyrovnávacej pamäte) - METHOD_OUT_DIRECT (2) - pre výstup alebo METOD_IN_DIRECT (1) - pre vstup; pole z IRP - MdlAddress. Toto je priame volanie-I / O manager zaväzuje do pamäte fyzické stránky obsahujúce vyrovnávaciu pamäť v užívateľskom režime. Súčasne vytvára pomocnú štruktúru MDL (Memory Descriptor List) na popis pevných stránok. A vývojár ovládača pracuje s MDL.

Prístup prostredníctvom vyrovnávacej pamäte na úrovni používateľa - METHOD_NEITHER (3); pole z IRP - SystemBuffer. Manažér I / O odovzdá ovládaču adresy virtuálneho užívateľského režimu. A v ovládači s nimi musíte pracovať veľmi opatrne, pretože ovládač by v tomto prípade mal fungovať iba v kontexte volajúceho vlákna.

Keď aplikácia odošle ovládaču kód akcie, spustí sa I / O manager. Je zodpovedný za generovanie paketu požiadaviek I / O (IRP) a jeho odoslanie ovládaču na ďalšie spracovanie.

Zvážime 3 typy žiadostí:

IRP_MJ_CREATE - bude postúpené na CreateFile,

IRP_MJ_DEVICE_CONTROL - bude prenášať DeviceIoControl

IPR_MJ_CLOSE - na CloseHandle

IRP pozostáva zo zásobníkov alokácií hlavičiek a I / O. Manažér I / O vytvorí počet buniek zásobníka I / O rovný počtu vrstiev ovládača zapojených do spracovania požiadavky. Každý ovládač má povolený prístup do svojho vlastného umiestnenia zásobníka. Keď vodič odovzdá IRP ovládaču nižšej úrovne, ukazovateľ zásobníka sa presunie na miesto, ktoré ovládač potrebuje. Naopak, po spracovaní požiadavky sa ukazovateľ presunie do bunky ovládača najvyššej úrovne. Získanie ukazovateľa pomocou funkcie - IoGetCurrentStackLocation ().

Každý alokačný zásobník obsahuje ukazovateľ na DeviceObject a FileObject, pre ktoré bola žiadosť iniciovaná. IRP sú vždy uložené v nestránkovanej pamäti.

Aby ovládač fungoval, vytvoria sa a použijú sa tieto objekty:

Objekt vodiča;

Objekty zariadenia;

Fázy vodiča.

1) Vytvorenie objektu ovládača. Vytvorené pri načítaní ovládača vo fáze jeho spustenia. V tejto chvíli sa spustí funkcia DriverEntry a vyplní sa pole MajorFunction, ako aj ukazovateľ na a z objektu zariadenia.

Objekt zariadenia obsahuje:

Typ zariadenia.

2) Vytvorte symbolický odkaz na zariadenie. Aby bol objekt "zariadenie" dostupný pre kód užívateľského režimu, musí ovládač vytvoriť v adresári "\ ??", ku ktorému je prístupný (kód užívateľského režimu). ďalším predmetom je symbolický odkaz. Ovládač shablon.sys vytvorí symbolický odkaz „slshablon“ na svoje zariadenie „devshablon“ v adresári „\ ??“, ktorého hodnota je reťazec „\ Device \ devshablon“.

Už pri načítaní ovládača (v našom prípade vo fáze načítania OS) teda máme v pamäti tri objekty: ovládač „\ Driver \ shablon“, zariadenie „\ Device \ shablon“ a symbolický odkaz na zariadenie „\ ?? \ slshablon“.

3) Otvorenie. Potom, keď sa aplikácia spustí, sa zavolá CreateFile. K dispozícii je odkaz na zariadenie. Štruktúra objektu zariadenia DEVICE_OBJECT získava informácie o obsluhujúcom ovládači. I / O manager vygeneruje paket IRP I / O požiadaviek typu IRP_MJ_CREATE a odošle ho ovládaču. Takto vodič vie, že sa kód používateľského režimu pokúša získať prístup k jeho zariadeniu. Ak to vodičovi nevadí, vráti kód úspechu. Náš vodič má špeciálny postup odoslania, ktorý reaguje na túto IRP - DispatchCreateClose (existuje kombinovaný postup na otvorenie a zatvorenie zariadenia). Obsahuje STATUS_SUCCESS v poli Io.Status.Status a 0 v Io.Status.Information, pretože v tomto prípade nie je potrebné nič prenášať. Táto odpoveď od ovládača je signálom pre správcu objektov, aby vytvoril virtuálny súbor. To vytvorí nový prvok v tabuľke popisovača procesov s ukazovateľom na objekt „súbor“ a vráti nový popisovač do kódu užívateľského režimu.

Ak je všetko v poriadku, uložíme deskriptor súborov vrátený CreateFile do premennej hDevice.

4) Operácie vstup / výstup. Teraz sme schopní vykonávať operácie na ovládanie tohto zariadenia volaním funkcií DeviceIoControl. Pretože ovládač zariadenia môže v zásade vykonávať mnoho rôznych úloh, je potrebné požiadavky nejako diferencovať. Na to slúži druhý parameter dwIoControlCode, nazývaný riadiaci kód I / O, ktorý je zostavený podľa určitých pravidiel.

Pomocou deskriptora zariadenia I / O manažér získa informácie o obsluhujúcom ovládači, vygeneruje paket požiadaviek na I / O typu IRP_MJ_DEVICE_CONTROL a odošle ho ovládaču. Ovládač zavolá zodpovedajúcu procedúru DispatchControl, ktorej sa ako parameter odovzdá kód akcie a informácie o adresách a veľkostiach vstupnej a výstupnej vyrovnávacej pamäte. Toto všetko je oznámené prostredníctvom IRP. Pri postupe sa z IRP získajú potrebné informácie: akčný kód, adresa vyrovnávacej pamäte na prenos údajov.

Procedúra DispatchControl vykoná potrebné akcie, v našom prípade adresu paketu IRP z registra ESI Potom odovzdá výsledok cez výstupnú vyrovnávaciu pamäť do aplikácie.

Podobne ako v predchádzajúcom postupe, prejdeme cez IRP stav dokončenia a počet bajtov prenesených z ovládača.

V aplikácii sú tieto údaje naformátované a zobrazené.

5) Zatváranie. Ako by sa malo vykonať s už nepotrebnými rukoväťami, zavolaním funkcie CloseHandle zavrieme rukoväť zariadenia.

6) Vyloženie vodiča. Odstráňte symbolický odkaz a odstráňte objekt zariadenia.

Komplex (2) pozostáva z dvoch programov:

Aplikácia, ktorá požiada ovládač o adresu IRP a potom túto adresu zobrazí v štandardnom okne systému Windows.

Shablon.sys - vodič.

Šablonový ovládač robí niečo, čo sa nedá vykonať na užívateľskej úrovni, v tomto prípade určuje obsah registra esi, keď je ovládač spustený.

Aplikácia vo výstupnej vyrovnávacej pamäti prijíma obsah esi, prevádza ho na hexadecimálny výstup a odosiela ho do štandardného okna systému Windows.

Ak potrebujete získať informácie z pamäte CMOS v ovládači, potrebujete:

Poslať posunutie záujmu CMOS na port 70h;

Malé oneskorenie;

Získajte informácie z portu 71h do al.

Potom napíšte tieto informácie do výstupnej vyrovnávacej pamäte.

A v aplikácii musíte vziať informácie z výstupnej vyrovnávacej pamäte, v prípade potreby ich transformovať a zobraziť, alebo ich analyzovať a v závislosti od výsledku zobraziť potrebný text v štandardnom okne.

Toto laboratórium predpokladá, že ovládač je v systéme Windows nainštalovaný natrvalo pomocou súboru .inf pomocou ovládacieho panela - Inštalácia hardvéru: Pridajte nové zariadenie, nainštalujte ručne, zobrazte všetky zariadenia, máte disk, vyhľadajte súbor .inf (ovládač musí byť v rovnakom priečinku).

Ak chcete skontrolovať, či je nainštalovaný ovládač, vyberte na ovládacom paneli Systém, Hardvér, Správca zariadení.

1.3 Prístup k existujúcim ovládačom z aplikácií v užívateľskom režime

Algoritmus aplikácie pracujúcej s ovládačom

Na prácu s ovládačom potrebuje aplikácia v používateľskom režime ovládača (manipulátor). Tento manipulátor je možné získať pomocou funkcie CreateFile alebo CreateFileA API, ktorá pracuje so znakmi ASCII. Ďalej sa používa funkcia API DeviceIoControl, ktorej je ako jeden z parametrov odovzdaný kód IOCTL. Kód IOCTL je riadiaci kód, pomocou ktorého sa vodič dozvie o operácii, ktorú aplikácia požaduje vykonať, o spôsobe odovzdávania parametrov a prístupových právach, ktoré aplikácia potrebuje na vykonanie tejto operácie. Po zavolaní aplikácie

IRP_MJ_DEVICE_CONTROL je odoslaný do ovládača DeviceIoControl. Po spracovaní požiadaviek sa riadenie vráti do aplikácie a zostane na aplikácii, aby analyzovala odpoveď vodiča a zatvorila otvorené úchyty.

Príklad

V nižšie uvedenom príklade aplikácia používateľského režimu odošle požiadavku IOCTL_DISK_GET_PARTITION_INFO_EX ovládaču systém súborov, analyzuje prijaté informácie a zobrazí formát oblasti pevného disku.

#zahrnúť

#zahrnúť

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,

ak (hDevice == INVALID_HANDLE_VALUE)

MessageBoxA (NULL, „Chyba CreateFileA!“, „Chyba“, 0);

ak (DeviceIoControl (

/ * 1 * / (HANDLE) hZariadenie,

/ * 5 * / & piPartitionInfo,

/ * 6 * / sizeof (piPartitionInfo),

/ * 7 * / & dwBytesVrátené,

if (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, "Chyba DeviceIoControl", "Chyba", 0);

CloseHandle (hDevice);

Analýza príkladu

Deklarované sú premenné potrebné na to, aby aplikácia fungovala. PARTITION_INFORMATION_EX je štruktúra, ktorá popisuje informácie o oblasti pevného disku.

typedef struct (

) PARTITION_INFORMATION_EX;

V tejto časti programu sa volá funkcia CreateFileA, aby sa získal popisovač, ktorý je zapísaný do premennej hDevice.

Funkcia DeviceIoControl sa nazýva synchrónne. Prenáša sa na ňu:

deskriptor zariadenia;

Kód IOCTL IOCTL_DISK_GET_PARTITION_INFO_EX;

ukazovateľ na vstupnú vyrovnávaciu pamäť, v našom prípade NULL;

veľkosť vstupného buffera;

ukazovateľ na výstupnú vyrovnávaciu pamäť;

veľkosť výstupnej vyrovnávacej pamäte;

ukazovateľ na premenná typu DWORD, ktorý uloží počet bajtov, ktoré sa majú vrátiť;

ukazovateľ na PREPLATENÚ štruktúru, na ktorú sa používa asynchrónny hovor funkcie.

Po návrate ovládania sa v prípade úspešného dokončenia funkcie informácie o oddiele uložia do štruktúry PARTITION_INFORMATION_EX.

Vykonáva sa analýza a výstup informácií. Pred vrátením ovládania do operačného systému môžete zatvoriť otvorené úchyty. Umožňuje vám to funkcia CloseHandle (__ v HANDLE). Ak deskriptory nie sú zatvorené, operačný systém to urobí za vás.

2. Implementácia semestrálnej práce

2.1 Krok 1

Cvičenie: 1. Vytvorte ovládač jadra s prístupom k portom, vykonávajte akcie podľa voľby a odosielajte informácie do okna Debug View (podľa možnosti), ako aj aplikáciu, ktorá ovládač spustí.

Zoznam Kurs_test.cpp

#include "stdafx.h"

#include "windows.h"

#include "stdlib.h"

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

if (hSCManager! = 0) (

// zaregistrujte hráča v tabuľke SCManager

if (hService! = 0) (

// Vymažte položku ovládača

DeleteService (hService);

CloseServiceHandle (hService);

návrat 0;

}

Výpis Beeper.sys

#zahrnúť

#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

neplatné DO_DELAY (int time) (

dlho i, j;

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

}

neplatné DO_BIG_DELAY (medzičas) (

DO_DELAY (2 * čas);

}

prázdny xylofón (int nPitch) (

int nTone = TIMER_FREQUENCY / nPitch

_asm (

mov al, 10110110b; // napíšte kontrolné slovo o 43 hod

out 43h, al; // Kanál ovládania zvuku - logika s použitím časovacích tónov a softvérovo riadených bitov portov systému

mov eax, nTone; // napíšte prepočítanú frekvenciu na 42

out 42h, al; // horná časť

mov al, ah; // dolná časť

mimo 42h, al

in al, 61h; // zmena únikovej sekvencie - konvertujte posledné bity na jedničky

; // bit 0 - povolenie používať reproduktor

; // bit 1 - povolenie na pripojenie časovača -2 k reproduktoru

alebo al, 00000011b; reproduktor ZAPNUTÝ

von 61h, al

}

DO_DELAY (0x7f);

_asm (

v al, 61h

a kol., 11111100b; reproduktor VYPNUTÝ

von 61h, al

}

}

Xylofón (PITCH_C);

Xylofón (PITCH_С);

Xylofón (PITCH_С);

Xylofón (PITCH_С);

Xylofón (PITCH_С);

Xylofón (PITCH_С);

Xylofón (PITCH_С);

vrátiť STATUS_DEVICE_CONFIGURATION_ERROR;

}

2.2 Krok 2

Vytvorte ovládač virtuálneho zariadenia, ktorý vám umožní vykonávať akcie, ktoré sú k dispozícii iba na úrovni nulových oprávnení (v súlade s touto možnosťou), a potom preniesť výsledky do aplikácie na tretej úrovni oprávnení na ich zobrazenie na obrazovke.

V aplikácii výstup vynesieme do štandardného okna Windows.

Zoznam shablon.c

#zahrnúť // rôzne definície NT

#zahrnúť

UNICODE_STRING g_usDeviceName;

UNICODE_STRING g_usSymbolicLinkName;

zrušiť DriverUnload (IN PDRIVER_OBJECT pDriverObject) (

IoDeleteSymbolicLink (& g_usSymbolicLinkName);

IoDeleteDevice (pDriverObject-> DeviceObject);

}

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

pIrp-> IoStatus.Status = STATUS_SUCCESS;

pIrp-> IoStatus.Information = 0;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

návrat STATUS_SUCCESS;

}

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

Stav NTSTATUS;

int regEsi;

// vezmite ukazovateľ na IO_STACK_LOCATION, v ňom na IoControlCode

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

// Porovnajte kód akcie a ak je to náš klient, potom:

_asm (

mov eax, 0

mov al, 10h

mimo 70h, al

v al, 71h

cbw

cwde

mov regEsi, eax

}

// toto je naša funkcia - preberáme obsah registra esi

// napíšte to do systémovej vyrovnávacej pamäte

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

pIrp-> IoStatus.Information = 4; // a nastavte veľkosť výsledku

status = STATUS_SUCCESS;

) else status = STATUS_INVALID_DEVICE_REQUEST;

pIrp-> IoStatus.Status = stav;

IoCompleteRequest (pIrp, IO_NO_INCREMENT);

návrat (stav);

}

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

Stav NTSTATUS;

PDEVICE_OBJECT pDeviceObject;

// inicializácia reťazcov Unicode

RtlInitUnicodeString (& g_usDeviceName, L "\\ Device \\ DevGet");

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

// vyplňte objekt ovládača - jasne vysvetlite vodičovi, aká funkcia čo spracováva

pDriverObject-> DriverUnload =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

pDriverObject-> MajorFunction =

// vytvorenie logického objektu virtuálneho zariadenia

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

if (! NT_SUCCESS (stav)) (vrátiť stav;)

// vytvorte symbolický odkaz na zariadenie

Status = IoCreateSymbolicLink (& g_usSymbolicLinkName, & g_usDeviceName);

if (! NT_SUCCESS (stav)) (

IoDeleteDevice (pDeviceObject);

vrátiť stav;

}

vrátiť stav;

}

Zoznam 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 hZariadenie;

BOOL DevControl;

DWORD dwBytesReturned;

char stroka;

/*

Možnosti:

lpFileName Adresa reťazca ukončeného nulou, ktorý určuje názov objektu, ktorý sa má vytvoriť alebo otvoriť.

dwDesiredAccess Typ prístupu k objektu. Tento parameter môže mať akúkoľvek kombináciu nasledujúcich hodnôt:

Hodnota: Popis:

0 Definuje dotaz na dostupnosť objektu na uvedenom zariadení. Aplikácia môže požadovať atribúty zariadenia bez toho, aby k nej mala prístup.

GENERIC_READ Špecifikuje prístup na čítanie z objektu. Údaje je možné čítať zo súboru a ukazovateľ súboru je možné presúvať. Skombinujte s GENERIC_WRITE na prístup na čítanie a zápis.

GENERIC_WRITE Špecifikuje prístup na zápis do objektu. Dáta je možné zapísať do súboru a ukazovateľ súboru je možné presunúť. Skombinujte s GENERIC_READ a získajte prístup na čítanie a zápis.

dwShareMode Režim zdieľaného prístupu k objektom. Ak je hodnota nula, objekt nemožno zdieľať s viacerými programami. Všetky nasledujúce operácie na otvorenie objektu zlyhajú, kým sa nezatvorí popisovač objektu. Na zdieľanie objektu použite kombináciu nasledujúcich hodnôt:

Hodnota: Popis:

FILE_SHARE_DELETE Umožňuje sekvencii otvorenia objektu požiadať o prístup na odstránenie.

FILE_SHARE_READ Umožňuje sekvencii otvoreného objektu požiadať o prístup na čítanie.

FILE_SHARE_WRITE Umožňuje sekvencii otvoreného objektu požiadať o prístup na zápis

lpSecurityAttributes Adresa štruktúry SECURITY_ATTRIBUTES, ktorá určuje, či popisovač vrátený funkciou môže byť zdedený podradeným procesom.

Ak je lpSecurityAttributes NULL, deskriptor nemožno zdediť.

dwCreationDisposition

Hodnota: Popis:

CREATE_ALWAYS Vytvorí vždy nový súbor.

Ak súbor existuje, funkcia ho prepíše.

CREATE_NEW Vytvorí nový súbor. Ak súbor existuje, funkcia zlyhá.

OPEN_ALWAYS Otvorený súbor, vždy. Ak súbor neexistuje, funkcia ho vytvorí rovnakým spôsobom, ak dwCreationDisposition boli CREATE_NEW.

OPEN_EXISTING Otvorí súbor. Ak súbor neexistuje, funkcia zlyhá.

TRUNCATE_EXISTING Otvorí súbor a skráti ho na veľkosť nula. Ak súbor neexistuje, funkcia zlyhá.

dwFlagsAndAttributes Príznaky a atribúty súboru.

Keď je otvorený existujúci súbor, CreateFile ignoruje súbor šablóny.

Vrátené hodnoty:

Ak je funkcia úspešná, vráti sa otvorený popisovač zadaného súboru. Ak zadaný súbor existuje pred volaním funkcie a dwCreationDisposition je CREATE_ALWAYS alebo OPEN_ALWAYS, funkcia GetLastError vráti ERROR_ALREADY_EXISTS, aj keď bude funkcia úspešná. Ak súbor pred volaním neexistuje, funkcia GetLastError vráti hodnotu 0 (nula).

V prípade chyby funkcia vráti INVALID_HANDLE_VALUE. Ak chcete získať ďalšie informácie o chybe, zavolajte na server GetLastError.

*/

if (hDevice! = 0) (

/*

hDevice je popisovač vrátený súborom CreateFile.

dwIocontrolCode je hodnota, ktorá označuje operáciu, ktorú je potrebné vykonať.

lpInBuffer je adresa vyrovnávacej pamäte, ktorá obsahuje údaje potrebné na vykonanie operácie uvedenej v dwIoControlCode. Ak operácia nevyžaduje údaje, môžete zadať hodnotu NULL.

nInBufferSize je veľkosť v bajtoch údajov vo vyrovnávacej pamäti, na ktorú odkazuje lpInBuffer.

lpOutBuffer je adresa vyrovnávacej pamäte, ktorá bude naplnená výstupom, keď je operácia úspešná. Ak operácia neposkytuje výstup, MUSÍ byť toto pole NULL.

nOutBufferSiz je veľkosť v bajtoch vyrovnávacej pamäte, na ktorú odkazuje lpOutbuffer.

lpBytesReturned - adresa premennej dword, ktorá dostane veľkosť údajov zadaných v lpOutBuffer.

lpOverlapped je adresa štruktúry OVERLAPPED, ak chcete, aby bola operácia asynchrónna. Ak chcete počkať na dokončenie operácie, zadajte do tohto poľa NULL.

*/

wsprintf ((LPSTR) stroka, "% X", adwOutBuffer); // napíšte riadok do vyrovnávacej pamäte (adwOutBuffer -> stroka)

CloseHandle (hDevice);

návrat 0;

}

počítačový program jadro ovládača

2.3 Krok 3

Zoznam course.cpp

#zahrnúť

#zahrnúť

#zahrnúť

{

Nevyžiadaná pošta DWORD;

0, // atribúty súboru

návrat (NEPRAVDA);

}

0, // veľkosť vstupného buffera

CloseHandle (hDevice);

návrat (bVýsledok);

}

int main (int argc, char * argv)

{

/*

typedef struct (

PARTITION_STYLE PartitionStyle; // formát sekcie

LARGE_INTEGER StartingOffset; // posunutie začiatku sekcie

LARGE_INTEGER PartitionLength; // veľkosť oddielu

Číslo oddielu DWORD; // číslo sekcie

BOOLEAN RewritePartition; // ak je sekcia prepisovatelna tak TRUE

zväz (

PARTITION_INFORMATION_MBR Mbr; // dodatočné informácie o sekcii MBR Style

PARTITION_INFORMATION_GPT Gpt; // dodatočné informácie o sekcii Štýl GPT

};

) PARTITION_INFORMATION_EX;

*/

BOOL bVýsledok;

systém („PAUZA“);

return ((int) bVýsledok);

}

2.4 Krok 4

1) Skombinujte všetky funkcie vyvinuté v krokoch 1-3 do jednej sady programov.

Konečný komplex by mal vyzerať takto:

- Náš ovládač je zabudovaný do systému a načítaný v štádiu zavádzania systému Windows.

- Aplikácia požiada vodiča o potrebné informácie (uvedené v 2. etape), vodič tieto informácie odovzdá, pričom je na chvíľu zapnutý aj reproduktor a zaznie melódia (špecifikovaná v 1. etape). Potom aplikácia odošle požiadavku vodičovi existujúcemu v systéme (v súlade s možnosťou fázy 3).

2) Vydajte vysvetľujúcu poznámku, ktorá by mala popísať všetky 4 etapy, ako aj teoretické informácie o každej fáze.

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

{

HANDLE hZariadenie; // deskriptor kontrolovaného zariadenia

BOOL bVýsledok; // príznak výsledku

Nevyžiadaná pošta DWORD;

hDevice = CreateFile (TEXT ("\\\\. \\ c:"), // zariadenie na otvorenie

GENERIC_READ | GENERIC_WRITE, // prístup k zariadeniu

FILE_SHARE_READ | FILE_SHARE_WRITE, // režim zdieľaného použitia

NULL, // predvolené atribúty zabezpečenia

OPEN_EXISTING, // umiestnenie

0, // atribúty súboru

NULOVÝ); // nekopírujte atribúty súborov

if (hDevice == INVALID_HANDLE_VALUE) (// zariadenie sa nedá otvoriť

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

návrat (NEPRAVDA);

}

bResult = DeviceIoControl (hDevice, // požadované zariadenie

IOCTL_DISK_GET_PARTITION_INFO_EX, // operácia, ktorá sa má vykonať

NULL, // ukazovateľ na vstupnú vyrovnávaciu pamäť

0, // veľkosť vstupného buffera

pex, sizeof (* pex), // výstupná vyrovnávacia pamäť

& junk, // počet bajtov, ktoré sa majú vrátiť

(LPOVERLAPPED) NULL); // synchronizácia vstupu / výstupu (I / O)

CloseHandle (hDevice);

návrat (bVýsledok);

}

int _tmain (int argc, _TCHAR * argv) (

SC_HANDLE hSCManager;

SC_HANDLE hService;

char acDriverPath;

HANDLE hZariadenie;

BOOL DevControl;

DWORD dwBytesReturned;

LPVOID adwInBuffer, adwOutBuffer;

char stroka;

PARTITION_INFORMATION_EX pex; // štruktúra zariadenia

BOOL bVýsledok;

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

if (hDevice! = 0) (

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

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

wsprintf ((LPSTR) stroka, "% X", adwOutBuffer); // napíšte riadok do vyrovnávacej pamäte (adwOutBuffer -> stroka)

if (stroka == "00000100") MessageBox (NULL, "Nájdené 1,44 Mb", "Yermakov FDD scaner", MB_OK);

else MessageBox (NULL, "Nenašiel sa", "Yermakov FDD scaner", MB_OK);

hSCManager = OpenSCManager (NULL, NULL, SC_MANAGER_CREATE_SERVICE);

if (hSCManager! = 0) (

GetFullPathName ("beeper.sys", veľkosť acDriverPath, acDriverPath, NULL);

// Zaregistrujte hudobníka v tabuľkách 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);

if (hService! = 0) (

StartService (hService, 0, NULL);

DeleteService (hService);

CloseServiceHandle (hService);

) else MessageBox (NULL, "Nemôžem zaregistrovať ovládač", NULL, MB_ICONSTOP);

CloseServiceHandle (hSCManager);

) else MessageBox (NULL, „Nedá sa pripojiť k SCManager“, NULL, MB_ICONSTOP);

) else MessageBox (NULL, "Can" t send send control code ", NULL, MB_OK);

CloseHandle (hDevice);

) else MessageBox (NULL, "Dev is not present", NULL, MB_ICONSTOP);

bResult = GetPartitionNumber (& pex);

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

) else (printf ("GetPartitionNumber () zlyhalo. Chyba% d. \ n", GetLastError ());)

systém („PAUZA“);

return ((int) bVýsledok);

}

3. Prevádzka aplikácie

Obrázok 3.1. Ovládač z kroku 2

Obrázok 3.2. Ovládač z kroku 3

Publikované na Allbest.ru

Podobné dokumenty

    Mechanizmy interakcie medzi ovládačom režimu jadra a užívateľskou aplikáciou: viacvrstvová architektúra ovládača, algoritmus skrývania údajov, interakcia ovládača a aplikácie, užívateľské rozhranie programu na filtrovanie prístupu k súborom.

    semestrálny príspevok, pridané 23. júna 2009

    Architektúra I / O systému Windows NT. Vnútorná organizácia zbernice USB. Základná charakteristika modelu ovládača WDM. Vstupné body vyvíjaného ovládača, umiestnenie kódu do pamäte, inštalácia ovládača do systému. Implementácia kódu vodiča v C.

    semestrálny príspevok pridaný 27. 9. 2014

    Štruktúra užívateľského režimu, ktorá umožňuje užívateľovi interagovať so systémom. Popis režimu jadra, ktorý zaisťuje bezpečné spustenie používateľských aplikácií (programov). Vrstva abstrakcie hardvéru Windows NT.

    prezentácia pridaná 23.10.2013

    Jadro Windows 98. Úloha 16-bitových modulov jadra. Problémy s výkonom. Kooperatívny a preventívny multitasking. Vylepšené využitie zdrojov v systéme Windows 98. Použitie WordArt. MS Outlook Express: vytváranie a odosielanie správ.

    test, pridané 14. 4. 2005

    Spoločné fungovanie všetkých počítačových zariadení a prístup k jeho zdrojom. Koncept a funkcie grafického operačného systému Windows. Pozadie služba windows... Správa súborového systému. Technológia Plug and Play. Grafické rozhranie Windows.

    test, pridané 22. 1. 2011

    Charakteristika operačného systému. História vývoja systému Windows. Porovnávacie charakteristiky verzií Windows. Prvky a Nástroje systému Windows XP. Aplikačné programy v systéme Windows XP. Pracovné stolové počítače a notebooky so systémom Windows.

    správa pridaná 16/10/2011

    Použitie ovládača a ovládacej aplikácie v režime jadra na vytváranie systémových vlákien. Simulácia spracovania údajov a organizácia oneskorení. Vývoj ovládačov v C ++. Konfigurácia testovacej stolice. Presnosť zmien oneskorení a prevádzky časovača.

    semestrálny príspevok, pridané 24. 6. 2009

    Prípravné práce na vnútornej štruktúre operačného systému Windows. Architektúra NT a štruktúra jadra. Metódy na potlačenie funkcií v režime jadra a režime koristuvach. Pochopenie vodiča. I / O pakety. Hodnotenie stability a zabezpečenia systémov Windows.

    semestrálny príspevok, pridané 1. 2. 2014

    Pojem, typy a činnosť brány firewall. Vstavaný firewall systému Windows. Windows XP SP2, prístup k nastaveniam brány firewall Windows XP Service Pack 2. Windows Vista, povolený prenos. Windows 7, aktívne nastavenia profilu. Osobný firewall, testovacie úrovne.

    abstrakt, pridané 19/11/2010

    Zoznámenie s technické vlastnosti osobný počítač... Inštalácia operačného systému a Ovládače systému Windows 7. Metódy čistenia Windows XP Professional SP3. Metódy obnovy operačného systému. Inštaluje sa Microsoft Office 2010.

Ovládače režimu jadra: Časť 1: Koncepty - archív WASM.RU

Prehľad architektúry

Vnútorný svet Windows 2000 je rozdelený na dve časti s jasne definovanými hranicami, a to ako z hľadiska adresného priestoru, tak z hľadiska práv a povinností kódu v tomto adresnom priestore exekútora.

S rozdelením adresného priestoru je všetko prekvapivo jednoduché. Všetky štyri, dostupné v 32-bitovej architektúre, sú gigabajty rozdelené na dve rovnaké časti (ako exotiku vynechávam 4GT RAM Tuning a Physical Address Extension). Spodná polovica je venovaná procesom v používateľskom režime, horná časť patrí jadru.

Oddelenie práv a povinností je trochu komplikovanejšie.

Používateľské procesy zahŕňajú nasledujúce procesy:

  • Procesy systémovej podpory - napríklad proces prihlásenia Winlogon (implementovaný v \% SystemRoot% \ System32 \ Winlogon.exe);
  • Servisné procesy - napríklad zaraďovač tlače;
  • Užívateľské aplikácie - existuje päť typov: Win32, Windows 3.1, MS -DOS, POSIX a OS / 2;
  • Environmentálne subsystémy - podporované sú tri subsystémy prostredia: Win32 (implementovaný v \% SystemRoot% \ System32 \ Csrss.exe), POSIX (implementovaný v \% SystemRoot% \ System32 \ Psxss.exe), OS / 2 (implementovaný v \% SystemRoot % \ System32 \ os2ss.exe).

Jadro sa skladá z nasledujúcich komponentov:

    Výkonný systém (Executive) - správa pamäte, procesy a vlákna atď .;
  • Jadro - plánovanie vlákien, odosielanie prerušení a výnimiek atď. (Implementované v \% SystemRoot% \ System32 \ Ntoskrnl.exe);
  • Ovládače zariadení - ovládače hardvérových zariadení, sieťové ovládače, ovládače systému súborov;
  • Hardware Abstraction Layer (HAL) - izoluje vyššie uvedené tri komponenty od rozdielov medzi hardvérovými architektúrami (implementované v \% SystemRoot% \ System32 \ Hal.dll);
  • Okenný a grafický systém - Funkcie grafického používateľského rozhrania (GUI) (implementované v \% SystemRoot% \ System32 \ Win32k.sys).

Ryža. 1-1. Zjednodušená architektúra Windows 2000

Užívateľský režim a režim jadra

Napriek tomu, že rodina procesorov Intel x86 podporuje štyri úrovne oprávnení (nazývané bezpečnostné krúžky), Windows používa iba dve: 0 pre režim jadra a 3 pre užívateľský režim. Dôvodom je podpora ďalších procesorov (alfa, mips), ktoré majú iba dve úrovne oprávnení. Predchádzajúce vydania systému Windows NT podporovali tieto architektúry, ale v systéme Windows 2000 zostala iba podpora x86.

Komponenty v užívateľskom režime majú svoje vlastné chránené adresné priestory, vlákna týchto procesov bežia v neprivilegovanom procesorovom režime (nazývanom užívateľský režim), nemôžu vykonávať privilegované procesorové príkazy, majú obmedzený a nepriamy prístup k systémovým údajom a do systémového adresného priestoru, nemajú priamy prístup k hardvéru ... Je pravda, že počas svojej práce vlákna týchto procesov, ktoré volajú systémové služby, prechádzajú do režimu jadra, ale v tomto prípade úplne stratia kontrolu nad svojim vykonaním, kým sa nevrátia do používateľského režimu.

Procesy v užívateľskom režime sú považované za potenciálne nebezpečné z hľadiska stability systému. Ich práva sú obmedzené. A všetky pokusy prekročiť tieto obmedzenia sú prísne potlačené.

Komponenty jadra zdieľajú jeden adresný priestor, bežia v privilegovanom režime procesora (nazýva sa režim jadra), môžu vykonávať všetky, vrátane privilegovaných, príkazov procesora, majú neobmedzený a priamy prístup k systémovým údajom a kódu, majú priamy alebo prostredníctvom HAL prístup k vybavenie.

Kód jadra (v skutočnosti je to samotný systém) sa považuje za úplne dôveryhodný. Po načítaní do priestoru adries systému sa ovládač stane súčasťou systému a nevzťahujú sa naň žiadne obmedzenia.

Užívateľské aplikácie sú teda oddelené od skutočného operačného systému. Ak sa rozhodnete napísať akúkoľvek serióznu aplikáciu, ktorá vyžaduje prístup k interným funkciám alebo dátovým štruktúram systému, narazíte na mnohé obmedzenia, ktoré je možné prekonať iba umiestnením kódu do priestoru adries systému. Jediným zdokumentovaným spôsobom, ako to urobiť, je nainštalovať ovládač zariadenia. Táto metóda je pomerne jednoduchá, spoľahlivá a hlavne je plne podporovaná samotným operačným systémom.

Ovládače Windows 2000

Windows 2000 podporuje mnoho typov ovládačov zariadení.

Existujú dva základné, ktoré majú svojich zástupcov:

  • Ovládače používateľského režimu:
    • Virtual Device Drivers (VDD) - slúži na podporu programov MS -DOS (nesmie sa zamieňať s ovládačmi VxD v systéme Windows 95/98 - to sú úplne odlišné veci, aj keď majú rovnaký názov);
    • Ovládače tlačiarne
  • Ovládače režimu jadra:
    • Ovládače súborového systému - implementujte I / O na lokálne a sieťové disky;
    • Legacy Drivers - napísané pre predchádzajúce verzie Windows NT;
    • Ovládače pre grafické adaptéry (video ovládače) - implementácia grafických operácií;
    • Streamovacie ovládače - implementujte video / audio vstup / výstup;
    • Ovládače WDM (Windows Driver Model, WDM) - Podporuje technológiu Plag and Play a správu napájania. Ich charakteristickou črtou je kompatibilita na úrovni zdrojový kód medzi Windows 98, Windows ME a Windows 2000.

V rôznych zdrojoch nájdete klasifikáciu mierne odlišnú od vyššie uvedených, o to nejde. Dôležité je, aby vodiči, ktorých napíšeme, nespadali pod žiadny z bodov tejto klasifikácie. Nie sú to ani ovládače systému súborov, ani staršie ovládače, ani ovládače grafickej karty, príp zvukové karty ani ovládače WDM, pretože nepodporujú hru Plag "n" Play a správu napájania. Nejde o ovládače používateľského režimu (nie sú vôbec zaujímavé). V skutočnosti to je len diabol, ktorý vie, čo to je, tk. samotný systém vám umožňuje jednoducho a jednoducho pridať kód pre neznáme zariadenie a robiť si s ním, čo chcete! Je to, ako keby vám v noci klopal na dvere úplne neznámy človek a vy by ste ho na noc pustili dnu, a dokonca by ste ho uložili do postele! Nejde však o žiadnu chybu alebo bezpečnostnú dieru. Systém funguje tak, ako funguje. Nemôže to byť inak, pretože pri interakcii s prostredím je systém nútený poskytnúť prístup k sebe. A keby to tak nebolo, potom by to bol úplne uzavretý, čo znamená, zbytočný systém.

Ako naznačuje názov, ovládač zariadenia je program určený na ovládanie zariadenia a toto zariadenie nemusí byť fyzické. Môže to byť logické alebo, ako v našom prípade, virtuálne.

Štruktúra ovládača zariadenia nie je nič iné ako súbor formátu Portable Executable (PE). To isté ako bežné exe a dll. Načíta sa a funguje iba podľa rôznych pravidiel. Ovládače je možné chápať ako knižnice DLL v režime jadra navrhnuté na vykonávanie úloh, ktoré nemožno vyriešiť z používateľského režimu. Zásadný rozdiel tu (okrem úrovne privilégií) spočíva v tom, že nebudeme mať priamy prístup k ovládaču, ani k jeho kódu, ani k údajom, ale použijeme špeciálny mechanizmus poskytovaný správcom vstupov / výstupov. I / O manager poskytuje prostredie pre fungovanie ovládačov a tiež poskytuje mechanizmy na ich načítanie, vykladanie a správu.

Keď sa pustíte do vývoja ovládačov v režime jadra, budete sa cítiť ako úplný nováčik. všetky predchádzajúce skúsenosti Použitie API tu to nepomôže - jadro poskytuje úplne inú sadu funkcií. Budete tiež musieť použiť zle zdokumentované (definované iba v hlavičkových súboroch) alebo úplne nezdokumentované funkcie a dátové štruktúry.

Jedno a viacúrovňové ovládače

Väčšina ovládačov ovládania fyzických zariadení sú vrstvené ovládače. Spracovanie požiadavky I / O je zdieľané medzi viacerými ovládačmi. Každý robí svoju časť. Napríklad požiadavka na čítanie súboru je odoslaná ovládaču súborového systému, ktorý ho po vykonaní niektorých operácií (napríklad rozdelení žiadosti na niekoľko častí) postúpi ovládaču disku, ktorý následne odošle žiadosť vodičovi autobusu. Medzi tieto ovládače navyše môžete pridať ľubovoľný počet ovládačov filtrov (napríklad šifrovanie údajov). Po vykonaní požiadavky vodič nižšej úrovne odovzdá svoje výsledky „až“ ovládaču vyššej úrovne. Ale našťastie s nami bude všetko oveľa jednoduchšie. Naše ovládače budú vždy monolitické, čo výrazne zjednoduší celý proces ich zápisu a ladenia.

Kontext streamu

Pretože vo väčšine prípadov máme iba jeden procesor a existuje mnoho aplikácií, ktoré je potrebné vykonať, je prirodzené, že na vytvorenie ilúzie ich súčasného vykonávania musia byť tieto aplikácie postupne prepojené s procesorom a rýchlo. Tento postup sa nazýva prepínanie kontextu vlákna. Ak systém prepne kontext vlákien patriacich k rovnakému procesu, potom je potrebné uložiť hodnotu registrov procesora odpojeného vlákna a načítať predtým uložené hodnoty registrov procesora pripojeného vlákna. A aktualizujte niektoré dátové štruktúry. Ak vlákno, ktoré sa má pripojiť, patrí do iného procesu, potom je potrebné načítať ukazovateľ na adresár stránky procesu do registra CR3 procesora. Pretože je každému používateľskému procesu poskytnutý súkromný adresný priestor, rôzne procesy majú rôzne projekcie adresných priestorov, čo znamená, že majú rôzne adresáre stránok a sady tabuliek stránok, podľa ktorých procesor prekladá virtuálne adresy na fyzické. To všetko priamo nesúvisí s programovaním ovládačov. Pripomínam vám to však v súvislosti s nasledujúcim. Pretože prepínanie kontextu nie je najrýchlejšou operáciou, ovládače z dôvodov lepší výkon, spravidla nevytvárajte svoje vlastné toky. Je však potrebné vykonať kód vodiča. Aby sa ušetril čas na prepínanie kontextov, ovládače sa vykonávajú v režime jadra v jednom z troch kontextov:

  • v kontexte používateľského vlákna, ktoré iniciovalo požiadavku I / O;
  • v kontexte systémového vlákna jadra (tieto vlákna patria do systémového procesu);
  • v dôsledku prerušenia (a teda nie v kontexte akéhokoľvek procesu alebo vlákna, ktoré bolo aktuálne v čase prerušenia).

Nerozumiem celkom, ako môžete niečo urobiť „nie v kontexte akéhokoľvek procesu alebo toku“, ale vzhľadom na autoritu ľudí, ktorí to napísali (D. Solomon a M. Russinovich), a tiež na to, že to nebudeme potrebovať , pretože ... nebudeme zvládať softvérové ​​prerušenia, nieto ešte hardvérové, na tretí prípad môžete rovno zabudnúť. Zostávajú prvé dve možnosti. Ak je iniciovaná požiadavka I / O, potom sme v kontexte vlákna, ktoré iniciovalo túto požiadavku, a preto môžeme priamo pristupovať k adresnému priestoru procesu, do ktorého toto vlákno patrí. Ak sa nachádzame v kontexte systémového vlákna, nemôžeme priamo pristupovať k žiadnemu používateľskému procesu, ale vždy sa môžeme odvolať na systémové vlákno. Ak potrebujete z ovládača vidieť, aký je tam nejaký proces pre takú adresu, budete musieť buď prepnúť kontext sami, alebo preložiť adresy prostredníctvom tabuliek stránok.

Úrovne žiadostí o prerušenie

Prerušenie je neoddeliteľnou súčasťou každého operačného systému. Prerušenie vyžaduje spracovanie, takže vykonanie aktuálneho kódu sa ukončí a kontrola sa prenesie do obsluhy prerušenia. Existujú prerušenia hardvéru aj softvéru. Prerušenia sú obsluhované podľa ich priority. Windows 2000 používa schému priority prerušenia známu ako úrovne požiadaviek na prerušenie (IRQL). Existuje 32 úrovní, od 0 (pasívne), ktoré majú najnižšiu prioritu, až po 31 (vysoké), ktoré majú najvyššiu prioritu. Prerušenia s IRQL = 0 (pasívne) až IRQL = 2 (DPC \ odoslanie) sú softvérové ​​a prerušenia s IRQL = 3 (zariadenie 1) až IRQL = 31 (vysoké) sú hardvérové. Nezamieňajte si úrovne priority prerušenia s úrovňami priority vlákna - sú to úplne odlišné veci. Prerušenie s IRQL = 0, striktne povedané, nie je prerušením, pretože nemôže prerušiť prácu žiadneho kódu (koniec koncov, tento kód musí byť vykonaný na ešte nižšej úrovni prerušenia a taká úroveň neexistuje). Na tomto sú spustené vlákna IRQL v užívateľskom režime. A na týchto IRQL bude vykonaný aj kód našich ovládačov. To neznamená, že kód akéhokoľvek ovládača je vždy vykonaný na „pasívnej“ úrovni. Ide len o to, že nebudeme spracovávať žiadny softvér, nieto ešte prerušenia hardvéru. A odtiaľto nasledujú najmenej dva veľmi dôležité závery.

Po prvé: prácu našich ovládačov je možné kedykoľvek prerušiť, aby bolo možné zvládnuť prerušenie s vyššou prioritou (napríklad z časovača, keď sa plánovač domnieva, že naše vlákno má procesor už nejaký čas a je čas na to na odpočinok). Preto je v tomto zmysle kód našich ovládačov prerušiteľný a preventívny (procesor je daný inému vláknu), rovnako ako kód akéhokoľvek používateľského vlákna. Existujú funkcie jadra, ktoré vám umožňujú zistiť aktuálnu úroveň prerušenia a tiež ho zvýšiť alebo znížiť.

Druhý dôležitý bod: na úrovni pasívneho prerušenia môžete volať akékoľvek funkcie jadra (v DDK je v popise každej funkcie potrebné uviesť, na ktorej úrovni prerušenia sa dá volať), ako aj prístup na stránky pamäte uložené do stránkovacieho súboru. Pre viac vysoké úrovne prerušenia (DPC / dispath a vyššie), pokus o prístup na stránku, ktorá nie je vo fyzickej pamäti, vedie k zlyhaniu systému. správca pamäte nemôže zvládnuť chybu stránky.

„Modrá obrazovka smrti“

Myslím, že každý, aspoň raz, videl vzrušujúci obrázok s názvom „Modrá obrazovka smrti“ (BSOD). Pravdepodobne nie je potrebné vysvetľovať, čo to je a prečo k tomu dochádza. Tu je dôležité, že keď začnete s vývojom ovládačov režimu jadra, pripravte sa na to, že BSOD sa na vašej obrazovke monitora bude objavovať pomerne často.

V treťom prstenci bolo všetko jednoduché: načrtol som ukážkový kód, podľa potreby umiestnil int3, spustil ho a ... v debuggeri už zisťujete, čo je čo. Ak niečo nie je v poriadku, zaklincoval som to, opravil chyby, znova skompiloval ... a tak ďalej, kým kód nefunguje tak, ako by mal. Na túto techniku ​​môžete pri programovaní ovládačov zabudnúť. Tu sa „ženista“ raz pomýli. Jeden nesprávny pohyb ... a môžete si na chvíľu sadnúť a relaxovať.

Aby ste videli BSOD čo najmenej, je potrebné dodržať jedno veľmi jednoduché pravidlo: „Merajte sedemkrát - jeden odstrihnite“ ... v zmysle „sedemkrát skontrolujte - jeden spustite“. Samozrejme, že sa to ľahko hovorí, ale oveľa ťažšie robí. Ale spravidla vzhľadom na to, že štruktúra ovládačov, ktoré budete písať (po prečítaní týchto článkov), je pomerne jednoduchá, môžete sa s chybami vysporiadať ešte skôr, ako sa objaví BSOD. Ak sa vám tvrdohlavo objaví pred očami a vy nemôžete nijako pochopiť dôvod, možný spôsob Na objasnenie situácie je analýza skládky odpadu (crash dump). Môžete si prečítať o tom, čo to je, ako to urobiť a analyzovať to v článku Marka Russinovicha „Analýza nárazových skládok pamäte“ http://www.osp.ru/win2000/2001/03/025.htm. Táto záležitosť (analýza) je veľmi ťažká, ale myslím si, že na to nepríde.

Som posraný teoretik, takže všetky vyššie uvedené skutočnosti možno považovať za veľmi základné informácie o tých zásadách, ktoré je nevyhnutné pochopiť. Nemôžete začať vyvíjať ovládače režimu jadra bez toho, aby ste vedeli, aký je kontext vlákna, úrovne prerušenia a priority vlákien, režim jadra / používateľa atď. atď. Nebojte sa niektorých otázok - zoznam referencií je uvedený nižšie.

Teraz poukážeme na niekoľko praktickejších vecí (v ďalších článkoch sa stanú úplne praktickými), konkrétne na to, čo potrebujeme na premenu celej tejto teórie na prax.

Sada pre vývoj ovládačov

Prvým je samozrejme Device Driver Development Kit (Windows 2000 Driver Development Kit, 2KDDK), ktorý je možné voľne stiahnuť z webových stránok spoločnosti Microsoft (v každom prípade som ho úplne zadarmo zlúčil odtiaľto: http: // www.microsoft.com/ddk/). Tento balík obsahuje dokumentáciu, ktorá je bohatým zdrojom informácií o interných dátových štruktúrach a interných systémových funkciách používaných ovládačmi zariadení.

Okrem dokumentácie obsahuje DDK aj sadu súborov knižnice (* .lib), ktoré budú nevyhnutné na prepojenie. DDK obsahuje dve sady týchto súborov: pre konečnú verziu systému Windows (nazýva sa bezplatné zostavenie); a pre ladenie (nazýva sa kontrolovaná zostava). Tieto súbory sa nachádzajú v adresároch% ddk% \ libfre \ i386 a% ddk% \ libchk \ i386. Verzia ladenia má prísnejšiu kontrolu chýb. Súbory zodpovedajúce vašej verzii systému musíte použiť tak, že ich umiestnite do adresára \ masm32 \ lib \ w2k.

Zahrnúť súbory

Potrebujeme tiež zahrnúť súbory (* .inc) s definíciami prototypov funkcií. Aj my (alebo skôr ja) si ich budeme musieť urobiť sami. Vyskúšal som mnoho rôznych nástrojov, ktoré prevádzajú * .lib -> * .inc, oba zahrnuté v balíku masm32 by hutch, a ktoré som v rôznych časoch zlúčil z obrovských oblastí internetu. Zo všetkého, čo mám na sklade, sa s touto úlohou vyrovnal iba protoize.exe od f0dder a prakticky som nemusel nič ručne upravovať. Tento úžasný nástroj bude umiestnený v adresári \ tools \ protoize. Stránka autora: http://f0dder.didjitalyphrozen.com/. Len ju tam nenájdeš. f0dder zaslal tento nástroj niekoľkokrát na http://board.win32asmcommunity.net/. Zahrnutia budú v adresári \ include \ w2k. Mali by byť umiestnené v adresári \ masm32 \ include \ w2k. Na konverziu sme použili * .lib pre bezplatnú edíciu systému Windows 2000, pretože mám túto možnosť (a vy určite tiež).

Ďalší problém je vážnejší. Toto je takmer úplná absencia zahrnutých súborov s definíciami potrebných štruktúr, symbolických konštánt a makier. Na internete len ťažko nájdete niečo hodnotné - je príliš exotické písať ovládače v režime jadra v assembleri. Niečo sa dá nájsť na EliCZ http://www.anticracking.sk/EliCZ/. Niečo z Y0da http://mitglied.lycos.de/yoda2k/index.htm (čiastočne vyrobený sám, čiastočne prevzatý z rovnakého EliCZ). Ale to sa robí veľmi zle (pri všetkej mojej hlbokej úcte k našim slovenským a nemeckým kolegom): mená členov mnohých štruktúr sa líšia od tých, ktoré sú definované v pôvodných hlavičkových súboroch z DDK; vnorené štruktúry a odbory nemajú žiadne názvy; aj keď sú pomenované v origináli. A vôbec, všetko je v nejakom neporiadku a pri pohľade to pôsobí deprimujúcim dojmom. Len ntstatus.inc je dobre urobený. Je to čiastočne spôsobené skutočnosťou, že EliCZ začal vytvárať svoje vlastné inklúzie aj pri absencii DDK (ako sám hovorí). V každom prípade vám neodporúčam používať ich, aspoň bez dôkladného testovania. Na konferencii http://board.win32asmcommunity.net/ niečo zablesklo, ale kvalita tiež nie je nijako zvlášť pôsobivá. Stručne povedané, jediné správne riešenie v tejto situácii je urobiť všetko sami a ručne, pretože nepoznám žiadne nástroje, ktoré by vám umožnili automatizovať tento proces. Ak zrazu narazíte na niečo hodnotné, nepokladáte to za prácu - dajte mi vedieť.

Ladiace ovládače

Potrebujeme tiež debugger a keďže kód režimu jadra bude potrebné odladiť, je potrebný aj príslušný debugger. Najlepšou voľbou bude SoftICE. Alebo môžete použiť ladiaci program jadra, ktorý je súčasťou DDK. Tento debugger vyžaduje dva počítače, master a slave, ktoré si nemôže dovoliť každý. Mark Russinovich (http://www.sysinternals.com/) napísal nástroj LiveKd, ktorý vám umožňuje používať nástroj Kernel Debugger bez pripojenia druhého počítača. Neviem, či je na webe (nekontroloval som ho), ale na disku ku knihe "Vnútorná štruktúra" Microsoft Windows K dispozícii je 2 000 ". Tento debugger je tiež veľmi užitočný pri skúmaní vnútornej štruktúry systému za predpokladu, že ste nainštalovali symboly ladenia, ktoré je možné (alebo by bolo možné) voľne stiahnuť z webových stránok spoločnosti Microsoft.

  • David Solomon, Mark Russinovich, „Interiér systému Microsoft Windows 2000“, vyd. Peter, 2001.

    Napriek tomu, že táto kniha neobsahuje ani jeden riadok zdrojového kódu, je primárne pre programátorov.

  • Sven Schreiber, „Nedokumentované Možnosti systému Windows 2000 ", ed." Peter ", 2002.

    Čisto praktická kniha, ktorá odhaľuje mnohé z tajomstiev systému Windows 2000.

  • Walter Oney, „Programovanie modelu ovládača Microsoft“, Microsoft Press, 1999

    Táto kniha sa zameriava na ovládače hry Plag "n" Play, ale ani v najmenšom to nespomína jej zásluhy, pretože základné princípy vývoja ovládačov sú univerzálne.

  • Jeffrey Richter, Windows for Professionals: Building Effective Win32 Applications for Windows 64-Bit, ed. Peter, 2000.

    Táto kniha nemá nič spoločné s programovaním ovládačov, ale je tiež veľmi zaujímavá ;-)

    Tento zoznam nie je v žiadnom prípade myslený ako úplný. Veľa, najmä v angličtine, je možné nájsť na internete (okrem Schreibera sú všetky knihy v elektronickej forme). Pokiaľ ide o knihy, chcela by som povedať, že všetky patria do kategórie „must have“. Uvidíte - kupujte bez pozerania. Všetci okrem Waltera “a Oneyho sú preložení do nášho„ veľkého a mocného “.

    A posledná vec. Nie som veľký odborník v oblasti vývoja ovládačov, takže chyby alebo nepresnosti, či už v tomto alebo vo všetkých nasledujúcich článkoch, sú veľmi pravdepodobné. Nájdite - smelo vystrčte nos. Poďakujem vám.