Software > Ostatní
32-bitové aplikace na platformě x64
64-bitová Windows se snaží 32-bitovým aplikacím vytvořit běhové prostředí, které co nejvěrohodněji kopíruje prostředí opravdového 32-bitového operačního systému. V tomto článku se zaměříme na změny v obsluze volání souborového systému a registru a ukážeme si, že mohou způsobit zajímavé problémy. 64-bitové verze operačních systémů Windows jsou stále populárnější. Krom toho, že lépe využívají možnosti současných procesorů, například v podobě většího počtu větších registrů a možností instrukcí pracujících s 64-bitovými operandy, což se může projevit zrychlením výpočetně náročnějších aplikací, dovolují jednotlivým běžícím procesům využívat větší množství virtuální paměti. Také disponují lepším zabezpečením (vynucení digitálně podepsaných ovladačů, ASLR, Patchguard).
Ne všechny programy však lze do podoby nativního 64-bitového kódu převést. Jednak proto, že jejich zdrojové kódy skončily kdesi v propadlišti dějin, druhak z toho důvodu, že programátoři při, když tyto aplikace tvořili, předpokládali platnost invariantů, které na platformě x64 neplatí. Například že velikost adresy je vždy 4 bajty (32 bitů).
Protože 32-bitových aplikací je velké množství, 64-bitové verze Windows jejich běh dokáží emulovat. Nejedná se přitom o emulaci na bázi virtuálního stroje – procesory disponují speciálním režimem kompatibility, který dovoluje provádět i 32-bitový kód v 64-bitovém prostředí. Operační systém emuluje pouze systémová volání a několik dalších aspektů života těchto aplikací, ostatní se odehrává přímo na procesoru.
64-bitová Windows se snaží 32-bitovým aplikacím vytvořit běhové prostředí, které co nejvěrohodněji kopíruje prostředí opravdového 32-bitového operačního systému. V tomto článku se zaměříme na změny v obsluze volání souborového systému a registru a ukážeme si, že mohou způsobit zajímavé problémy.
Souborový systém
Adresář %windir%\system32 obsahuje mnoho důležitých systémových knihoven a programů. Na 32-bitových systémech se jedná o 32-bitové binárky, 64-bitová Windows používají 64-bitové.
V rámci vytváření iluze prostředí opravdového 32-bitového operačního systému i 64-bitové verze Windows zobrazují 32-bitovým aplikacím ve výše zmíněné složce 32-bitové binární soubory jednotlivých programů a systémových knihoven. Tento trik zajišťuje přesměrování všech operací 32-bitových aplikacínad adresářem %windir%\system32 do složky %windir%\SysWOW64. Přesměrování probíhá pro aplikace zcela transparentně a zajišťuje jej součást systému zvaná File System Redir<>ector.
Tímto způsobem vytvářená iluze prostředí 32-bitového operačního systému však nepostačuje ve všech případech. Jako příklad poslouží moje nedávná osobní zkušenost. Nedávno jsem potřeboval zjistit názvy souborů, ve kterých se nachází systémové části stromu registru. Vím, že všechny tyto soubory se nachází v adresáři %windir%\system32\config.
Pro zobrazení obsahu příslušné složky jsem se rozhodl použít můj oblíbený správce souborů, Total Commander, jehož spustitelný soubor má 32-bitový formát. Jaké bylo mé překvapení, když se ve složce c:\windows\sytem32\config žádné soubory registru nenacházely! Vysvětlení je jednoduché: komponenta File System Redirector přesměrovala požadavek na zjištění seznamu souborů do složky c:\windows\SysWOW64\config, která sice existuje, ale žádné informace o registru neobsahuje.
Z příkladu je patrné, že File System Redirector může neočekávaně zkreslit výsledky vyhledávání. Možností, jak se této nepříjemnosti vyhnout, je několik:
-
Nepoužívat pro účely vyhledávání a prohlížení obsahu adresářů 32-bitové aplikace. Přesměrování se 64-bitových aplikací netýká.
-
Pokud programujeme 32-bitovou aplikaci, u které záleží na tom, aby pracovala bez (ač transparentního) zásahu součásti File System Redirector, může pro povolení a pozdější zákaz přesměrování použít rutiny Wow64EnableWow64FsRedirection a Wow64EnableWow64FsRedirection.
Jelikož s automatickým přesměrováním počítají některé knihovní funkce, jmenujme například LoadLibrary z knihovny kernel32.dll (kernelbase.dll), nevyplácí se File System Redirector zakazovat ne delší než nezbytnou dobu.
-
Místo system32 použít v zadané cestě slovo sysnative. Jedná se o virtuální adresář viditelný pouze pro 32-bitové aplikace, který systému říká, že program chce přistoupit přímo do složky s 64-bitovými systémovými binárkami.
Pro řešení mého problému se ukázala jako nejvhodnější třetí metoda (Total Commander je 32-bitová aplikace a nemám k dispozici jeho zdrojové kódy). Po zobrazení obsahu složky c:\windows\sysnative\config jsem si mohl přečíst názvy všech souborů registru, které jsem potřeboval.
Registr
V rámci registru funguje podobný mechanismus jako v souborovém systému. Nazývá se Registry Redirector a zajišťuje transparentní přesměrování operací 32-bitových aplikací nad některými klíči, které většinou pocházejí z podstromu HKLM\SOFTWARE. Cílovým bodem je v případě tohoto klíče podstrom HKLM\SOFTWARE\Wow6432Node.
Analogický problém k mé zkušenosti s vyhledáváním souborů vzniká i při operacích nad registrem. Představme si pro ilustraci, že 32-bitová a 64-bitová aplikace se pokusí zjistit seznam podklíčů klíče HKLM\SOFTWARE\X, který patří do objektů, jejichž čtení a modifikace Registry Redirector monitoruje a přesměrovává. 64-bitová aplikace získá všechny podklíče skutečného objektu HKLM\SOFTWARE\X, kdežto 32-bitový program ve skutečnosti obdrží podklíče položky HKLM\SOFTWARE\Wow6432Node\X. Získané výsledky se mohou výrazně lišit, jak prokázala moje další nedávná osobní zkušenost.
Aplikace předejte tomuto problému tak, že při získávání přístupu (handle) ke klíči, jehož podklíče chce znát, v parametru rutin RegOpenKeyEx či RegCreateKeyEx sloužícímu k určení požadovaných oprávnění, specifikuje nejvýše jeden z následujících příznaků:
Program si tak může vybrat, zda ho systém z pohledu operací nad registrem bude vnímat jako 32-bitovou, nebo nativní 64-bitovou aplikaci. Implicitně s ním Registry Redirector zachází podle formátu spustitelného souboru.
Stejnou dvojicí příznaků může aplikace ovlivnit chování systému i při mazání klíče. K tomuto účelu slouží rutina RegDeleteKeyEx.
Na rozdíl od souborového systému Registry Redirector nevytváří žádný virtuální klíč, který by sloužil jako obdoba složky sysnative. Pravděpodobně z toho důvodu, že oficiální program pro práci s registrem (regedit.exe) se vyskytuje jak v 32-bitové (c:\windows\SysWOW64\regedit.exe), tak i 64-bitové (c:\windows\regedit.exe) podobě.
Závěr
V tomto článku jste se dozvěděli, že ani vyhledávání či jiné manipulace se soubory nemusí být na 64-bitových verzích Windows tak jednoduché, jak se na první pohled může zdát. Obdobné tvrzení lze vyslovit i o registru; myslím si však, že v rámci souborového systému na tyto zajímavosti člověk, který neustále něco systémového neprogramuje, narazí častěji.
Článek si neklade za cíl popsat do nejmenších detailů fungování komponent File System Redirector a Registry Redirector či dalších jevů, se kterými se mohou 32-bitové aplikace na 64-bitovém systému setkat. Snaží se pouze poukázat na fakt, že něco takového existuje a můžete se s tím reálně potkat. Pokud vás ale tyto jevy dále zajímají, prozkoumejte některé z níže uvedených odkazů.
Poznámky
Zástupný symbol %windir% v tomto článku označuje adresář, kde jsou Windows nainstalována. Obvykle se jedná o c:\windows.
Zkratka HKLM v terminologii registru označuje klíč HKEY_LOCAL_MACHINE.
File System Redirector přesměrovává krom přístupů do adresáře system32 i operace nad souborem %windir%\regedit.exe na jeho 32-bitovou variantu.
Užitečné odkazy a zdroje
|