Upozornění: tento projekt není součástí knihy Jádro systému Windows.
V roce 2013 jsem potřeboval zjišťovat různé interní informace o běžících ovladačích jádra, jejich zařízeních a řetězech těchto zařízení. Jelikož již nějaký ten pátek znám aplikaci DeviceTree, která tyto údaje zobrazuje, rozhodl jsem se využít jejích služeb i tentokrát. Ukázalo se však, že tento program na novějších verzích Windows (Vista/7) často tuhne, alespoň v mém případě. Jelikož žádnou další utilitu podobného charakteru neznám, došel jsem k rozhodnutí ji vytvořit vlastním úsilím. A tak byl položen základní kámen VrtuleTree.
Primárním cílem VrtuleTree bylo tedy zjišťování a zobrazování informací o ovladačích a jejich zařízeních. Neméně důležitý požadavek však představovala stabilita na všech verzích Windows od Windows XP SP2 (verze jádra 5.1.2600), a to na platformách x86 a x64. Z tohoto důvodu množství informací zobrazované ve VrtuleTree je menší, než ukazuje DeviceTree. VrtuleTree však používá téměř pouze dokumentované postupy, jak informace získat; například se nesnaží posílat zařízením požadavky, kterými je dle dokumentace může obtěžovat pouze Správce Plug&Play. Jedinou výjimkou je použití funkce ObReferenceObjectByName, která sice dokumentována není, ale v daném kontextu se zdá, že plní svůj účel bez vedlejších účinků.
Popis rozhraní a funkcionality
Na obrázku níže vidíte grafické uživatelské rozhraní programu. Plocha okna je rozdělena na dvě části: vlevo se nachází strom ovladačů a zařízení, do pravé části jsou zobrazovány informace o právě označeném objektu, nebo je zde možno měnit různá nastavení aplikace.
Strom ovladačů a zařízení obsahuje dva typy uzlů. Kořenové uzly reprezentují jednotlivé běžící ovladače, přesněji struktury DRIVER_OBJECT, kterými je jádro systému reprezentuje. ostatní uzly reprezentují zařízení. Přítomnost určitého uzlu zařízení pod daným (kořenovým) uzlem ovladače znamená, že tyto dva objekty mezi sebou mají nějaký vztah. Tento vztah blíže určuje prefix v názvu uzlu zařízení, který může nabývat jedné následujících hodnot:
- [Žádný prefix]. Zařízení přísluší k danému ovladači, pravděpodobně jím i bylo vytvořeno.
- UPP. Zařízení se nachází v řetězu zařízení výše než některé ze zařízení daného ovladače.
LOW. Zařízení se nachází v řetězu zařízení níže než některé ze zařízení daného ovladače.
Pod každým (kořenovým) uzlem ovladače se nacházejí řetězy zařízení, jejichž součástí jsou i zařízení daného ovladače. Čím blíže se nachází uzel zařízení k uzlu reprezentujícího ovladač, tím níže je dané zařízení položeno v řetězu.
Na obrázku například vidíte, že ovladač DriverDisk disponuje dvěma zařízeními: DeviceHarddisk0DR0 a DeviceHarddisk0DR1. Každé z těchto zařízení reprezentuje jeden disk a nachází se v jednom řetězu, přičemž je nad ním vždy umístěno jedno nepojmenované zařízení ovladače Driverpartmgr (partmgr.sys) a pod ním se nachází zařízení ovladače, který daný disk obsluhuje; v tomto příkladu se jedná o ovladače Driveratapi (atapi.sys) a DriverUSBSTOR (USBSTOR.SYS).
V pravé části grafického rozhraní jsou zobrazovány různé informace o aktuálně vybraném objektu (ovladači či zařízení). VrtuleTree v této oblasti také dovoluje měnit různá nastavení, která se v aktuální verzi týkají výhradně tvorby logů – uložení informací získaných o ovladačích a zařízeních do souboru.
O ovladačích VrtuleTreee zjišťuje následující informace:
- adresu struktury DRIVER_OBJECT,
- Jméno ovladače,
- Jméno, velikost a adresu souboru ovladače,
- Adresy rutin DriverEntry, StartIo a DriverUnload,
- příznaky,
- zařízení,
- adresy rutin pro obsluhu požadavků IRP na zařízení ovladače.
O zařízeních jsou zjišťovány tyto údaje:
- adresa struktury DEVICE_OBJECT, která zařízení reprezentuje,
- jméno zařízení,
- typ zařízení, příznaky a charakteristiky,
- adresy zařízení, se kterými dané zařízení sdílí řetěz,
- aadresa zařízení svazku (pouze pro zařízení souborových systémů),
- informace Plug&Play (čitelný název zařízení, popis, výrobce, umístění, třída zařízení, enumerator, vztahy (removal relations, ejection relations), device ID (volitelně), instance ID, hardware IDs, compatible IDs, device capabilities).
VrtuleTree dovoluje zobrazované údaje uložit do souboru. Zatím je možné ukládat tyto informace pouze jako čistý text, v budoucnu plánuji přidat podporu dalších formátů, zvláště HTML. Program dovoluje relativně přesně specifikovat, jaké informace se mají do souboru uložit a jaké ne.
Kompatibilita
Program by měl správně fungovat na všech verzích Windows počínaje Windows XP SP2. Ovladač je digitálně podepsán důvěryhodným certifikátem za použití algoritmu SHA-1, takže by neměl být problém program spustit i na starších a neaktualizovaných Windows.
Ke stažení
Poznámky k překladu zdrojových kódů
Zdrojové kódy se skládají ze dvou projektů: ovladače a aplikace. Projekt ovladače se nachází ve složce vtdrv a byl vytvořen v prostředí Microsoft Visual Studio 2013 Professional. Aplikace je napsána v prostředí Emberacero Delphi XE2 a její zdrojové kódy se nachází v adresáři app. Oba projekty jsou nastaveny tak, že výsledné .exe a .sys soubory se vytvářejí v adresáři bin v podsložce dle aktuální platformy (x86 nebo x64) a nastavení překladu (Debug či Release).
Pokud disponujete nástroji uvedenými výše, překlad zdrojových kódů by měl probíhat bez problémů. Drobnější komplikace mohou nastat hlanvě v případě, že máte starší verzi Delphi, ačkoliv by neměl být problém projekt zkompilovat i v Delphi 2009, samozřejmě pouze pro platformu x86. Microsoft Visual Studio 2010 Professional je také potřeba zejména z důvodu překladu pro platformu x64, jinak by mělo vše fungovat i při použití Express edice.