Jste zde

Přímý přístup na IO porty počítače pod Windows 2000/XP

Článek se zabývá problematikou přímého přístupu na I/O porty PC pod operačním systémem Windows

založeným na jádře NT a poskytuje návod jak zprovoznit stávající aplikace pomocí univerzálních

ovladačů.

Problematika přímého přístupu na porty

Problém přímého přístupu na vstupně/výstupní porty počítače sice vzniká při používání operačních systémů založených na jádře NT, tedy Windows NT/2000/XP, ale svůj původ má zcela jinde. Zodpovědný je totiž za něj tzv. chráněný režim činnosti procesorů, jenž je systémy založenými na jádře NT využíván a který de facto sám vykonává operace spojené s využíváním portů, adresováním paměti apod., tedy operace dříve realizované prostřednictvím operačního systému či samotných aplikací.

Chráněný režim procesorů pochází již z doby 8386 a poskytuje čtyři různé úrovně přístupu k hardware. Tyto úrovně, nazývané ring, jsou číslovány od nuly do tří, kdy ring 0 má nejvyšší úroveň zpracování a pod Windows v něm běží pouze samotné jádro operačního systému spolu s ovladači zařízení. Kód v ring 0 zpracovávaný může obsahovat libovolné instrukce včetně instrukcí pro přímý přístup do paměti a k portům, neboť ochranu těmto instrukcím poskytuje samotný mikroprocesor. Běžné aplikace pak běží vždy na vyšších úrovních.

Procesory Intel 386 a vyšší mapují každý port ring 3 programů pomocí IOPM (Input/Output Privilege Mask), tzv. povolovací masky. každý z bitů této masky odpovídá jedné vstupně/výstupní adrese. Když se ring 3 program pokusí provést instrukci in nebo out, testuje procesor povolovací maku proto, aby určil, zda lze k portu přistoupit. Pokud přístup k danému portu není povolen, generuje procesor výjimku. Když tuto výjimku operační systém zachytí, nedovolí daný proces dokončit. Pokud se ring 3 programy pokoušejí přistoupit k portu, chovají se Win95/98/ME a WinNT/2000/XP odlišně:

  • Win95/98/ME reaguje povolením přístupových práv úpravou povolovací masky. První použití instrukce in nebo out nad daným portem sice vyvolá výjimku, která je však odchycena operačním systémem a následně zpracována tak, že je daný bit povolovací masky upraven pro povolení přístupu k danému portu. Další volání in a out pak již probíhá bez jakéhokoli zpoždění.
     
  • WinNT/2000/XP je více striktní, protože se jedná o robustnější systém se zvýšenou bezpečností. Je-li operačním systémem detekována výjimka, vyvolaná pokusem o přístup na port, je provinilý ring 3 program přerušen a instrukce přístupu na port není provedena.

U operačních systémů založených na jádře NT nejsou využívány úrovně ring 1 a ring 2, ale až ring 3. Instrukce prováděné na této úrovni mají velmi výrazně omezené pravomoci. Chtějí-li využívat vstupně/výstupních portů, musí žádat ovladače zařízení běžící v ring 0. Tyto aplikace přistupují k ovladačům pomocí tzv. povolovací masky, kde každý z bitů odpovídá jedné IO adrese. Pokud se aplikace běžící v ring 3 pokusí provést instrukci podléhající povolovací masce, procesor otestuje, zdali je příslušný bit nastaven, či nikoliv, a podle toho povoluje či zakazuje přístup k portům. Operační systém poté nepovolí zpracování instrukce.

Chceme-li proto ve Windows 2000 či XP realizovat přímý přístup na disk, lze tak učinit pouze pomocí tří možností:

  • Napsat si vlastní ovladač zařízení – toto řešení je nejčistší, avšak z pohledu programátora velmi náročné.
     
  • Využít ovladač zařízení vytvořený pro jiný podobný hardware, nebo použít některý z nabízených univerzálních ovladačů – rovněž čisté řešení, avšak finančně velmi náročné.
     
  • Použít pro přístup některý z univerzálních „ovladačů“, které jsou volně šířené internetem, avšak o jejich bezpečnosti a stabilitě by bylo možné vést polemiky. Přesto jich v následujícím textu budeme i nadále využívat, neboť lze předpokládat, že nebudou nasazovány do provozu masově, a bude tak možné řešit individuální problémy.

Volně dostupné ovladače

Pro stávající aplikace napsané pro Windows 95/98/ME jsou volně k dispozici dva typy ovladačů umožňujících využívat přímého přístupu k portům pod Windows 2000 a XP. Jedním z nich je ovladač User Port SYS vytvářející bránu pro všechny aplikace spuštěné pod Windows 2000/XP a vyžadující přímý přístup k portům, které prostřednictvím ovladače povolíme. Používání User Portu je velmi jednoduché, avšak umožňuje vícenásobný přístup k jednomu portu, což může vést k nemalým nepříjemnostem v reálném provozu. Spustíme-li například některou aplikaci dvakrát a ta se prostřednictvím User Portu pokusí o přímý přístup na port, budou její instrukce vykonány bez ohledu na skutečnost, že port je již obsazen. Doporučujeme tedy ji používat obezřetně. Druhým a poněkud čistším řešením je využití univerzálního ovladače PortTalk. Ten umožňuje změnu povolovací masky aplikaci běžící v ring 3, což sice rovněž vede ke snížení bezpečnosti, a mimo jiné také rychlosti přístupu, ale protože spouštění aplikací touto metodou je poněkud náročnější než v případě User Portu, je zde menší pravděpodobnost, že by docházel k chybovým stavům.

Použití User Portu

Nejprve je třeba rozbalit soubor archivu a nakopírovat soubor userport.sys do %systemroot%/system32/drivers, kde %systemroot% je cesta do systémového adresáře Windows NT/2000 (pro Windows 2000 defaultně WinNT, pro Windows XP Windows). Dále spustíme pomocnou aplikaci userport.exe a tlačítkem Remove vymažeme všechny položky v obou oknech. Do pravého okna poté zadáme adresu požadovaného portu v hexadecimální podobě a stiskem Add ji přidáme do seznamu povolených portů. Tlačítkem Default rovněž můžeme zpřístupnit všechny tři stupně/výstupní porty (LPT, COM1, COM2) počítače. Následně stiskem tlačítka Start zavedeme ovladač a restartujeme počítač. Po znovuspuštění počítače je k portům povolen přímý přístup, a stačí tedy vybrat požadovanou aplikaci a tu spustit. Pozor: Pro korektní chod programu je ještě nutné nadefinovat Compatibility Mode pro Windows (viz článek Spouštění aplikací pod Windows).

Použití ovladače PortTalk

Instalace i spouštění ovladače PortTalk je poněkud náročnější. Po rozbalení distribučního balíčku je třeba nejprve nakopírovat soubor porttalk.sys do adresáře %systemroot%/system32/drivers a poklepáním na ikonu souboru porttalk.reg upravit registry operačního systému. Úpravou registrů dosáhneme automatického zavádění ovladače při startu počítače. Následně počítač restartujeme a můžeme přistoupit ke spouštění aplikace. Oproti User Portu zde nestačí pouhé poklepání na ikonu spustitelného souboru, ale spouštění je nutné provádět prostřednictvím utility Allowio distribuované s ovladačem PortTalk. Spouštění se následně provádí z příkazové řádky nebo prostřednictvím dávkového souboru. Syntaxe použití Allowio je následující:

Allowio soubor.exe c 

Kde c představuje přepínače portů, které mají být aplikaci uvolněny. Zadávat je lze buďto v hexadecimální podobě, nebo prostřednictvím přepínače /A, který uvolní všechny porty. Používání přepínače /A je však z bezpečnostních důvodů nevhodné. Utilita Allowio zajistí, že příslušný port v počítači bude mít přidělena pouze aplikace spouštěná prostřednictvím utility. To však nijak nebrání tomu, aby touto utilitou nemohlo dojít k vícenásobnému přidělení přístupu jedné aplikaci.

Distribuce ovladače PortTalk rovněž uživateli umožňuje psát aplikace, které budou mít přímý přístup k portům umožněný prostřednictvím dodávané dynamické knihovny driver.dll pracující na podobném principu bez potřeby používání utility Allowio. Využití této knihovny má oproti použití porttalk.sys navíc tu výhodu, že si je schopna zapamatovat, které porty jsou již obsazeny a nepovolí na ně přístup. Protože však sama využívá pro svoji činnost samotný ovladač, je nutné aby porttalk.sys byl zaveden do systému. Více informací o využívání ovladače PortTalk získáte z článku Psaní aplikací s přímým přístupem na port.

Známé problémy s používáním ovladačů pro stávající aplikace

Userport.sys je ovladač sice jednodušší, ale některé aplikace si s ním v prostředí Windows 2000 neumějí poradit. Proto je lépe pod tímto operačním systémem používat raději ovladač PortTalk. V prostředí Windows XP se při použití User Portu zpravidla žádné problémy nevyskytují. Pochopitelně však závisí na tom, jak je která konkrétní aplikace napsaná.

 

Oldřich Mrázek
mrazek@ HW.cz

DOWNLOAD & Odkazy

Hodnocení článku: