Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ovladač pro export je knihovna DLL v režimu jádra, kterou lze načíst celou řadou jiných komponent specifických pro hardware nebo komponent specifických pro zařízení, ale nemá některé vlastnosti kompletního ovladače režimu jádra. Konkrétně ovladač exportu nemá tabulku odeslání, nemá místo v zásobníku ovladačů a nemá položku v databázi správce řízení služeb, která ji definuje jako systémovou službu. I když ovladač exportu nemá dispečerskou tabulku, může poskytovat dispečerské rutiny standardnímu ovladači. Standardní ovladač vloží dispečerské rutiny do své vlastní tabulky dispečera. Ovladač exportu má podprogram DriverEntry, který se nikdy nevolá.
Exportní ovladače v režimu jádra jsou zvláště vhodné pro implementaci části ovladačového páru, která je nezávislá na podkladových vlastnostech zásobníku a hardwaru.
Systém Windows obsahuje několik ovladačů exportu načtených jinými ovladači, například:
- Ovladač portu SCSI
- Ovladač páskové třídy
- Ovladače řadiče IDE jsou všechny exportní ovladače dodané systémem.
Standardní ovladače můžou také fungovat jako ovladače exportu. Aby ovladač fungoval oběma způsoby, musí být vytvořen jako ovladač pro export a načten jako běžný ovladač.
Vytvoření ovladače exportu
Pokud chcete vytvořit ovladač exportu v sadě Visual Studio, použijte následující postup:
- Vytvořte nový projekt ze šablony, například prázdný ovladač WDM.
- Do projektu přidejte definiční soubor modulu, například:
LIBRARY mydriver.sys
EXPORTS
DllInitialize PRIVATE
DllUnload PRIVATE
Vstupním bodem knihovny DLL v režimu jádra je vždy DllInitialize. Systém volá rutinu DllInitialize v režimu jádra ihned po načtení knihovny DLL. Ovladače exportu musí poskytovat rutiny DllInitialize . Pomocí rutiny DllInitialize můžete získat nebo inicializovat prostředky vyžadované jinými rutinami v knihovně DLL.
Vstupní bod nelze zadat pomocí makra DLLENTRY .
NTSTATUS DllInitialize(
_In_ PUNICODE_STRING RegistryPath
);
RegistryPath je ukazatel na počítaný řetězec Unicode určující cestu ke klíči registru knihovny DLL HKEY_LOCAL_MACHINE\CurrentControlSet\Services\DllName. Rutiny knihovny DLL mohou tento klíč použít k ukládání informací specifických pro knihovnu DLL. Vyrovnávací paměť, na kterou ukazuje RegistryPath, se uvolní po ukončení DllInitialize. Proto pokud knihovna DLL používá klíč, dllInitialize musí duplikovat název klíče.
Proces sestavení vygeneruje knihovnu exportu s příponou .lib a ovladač exportu s rozšířením .sys.
Import funkcí z ovladače exportu
Pokud chcete importovat funkce exportované ovladačem exportu, měli byste deklarovat funkce pomocí DECLSPEC_IMPORT makra, které je definováno v ntdef.h. Například:
DECLSPEC_IMPORT int LoadPrinterDriver (int arg1);
Toto makro se přeloží na deklaraci úložištní třídy __declspec(dllimport) na těch platformách, kde je to vyžadováno, a neprovádí žádnou změnu tam, kde to vyžadováno není.
V ovladači exportu by měla být funkce, která se má exportovat, deklarována pomocí DECLSPEC_EXPORT makra. Toto makro se přeloží na deklaraci třídy úložiště __declspec(dllexport) na platformách, kde je to vyžadováno, a na platformách, kde to vyžadováno není, se nepřekládá na nic. Pokud exportní ovladač dodává rutinu odeslání standardnímu ovladači, nemusí být tato rutina exportována.
Načítání a uvolňování ovladače exportu
Ovladače exportu musí být nainstalovány v adresáři %Windir%\System32\Drivers. Od systému Windows 2000 operační systém uchovává referenční počet, který označuje, kolikrát byly funkce exportu ovladače importovány jinými ovladači. Systém tento počet sníží pokaždé, když dojde k odpojení jednoho z importovaných ovladačů. Když počet odkazů klesne na nulu, systém uvolní ovladač exportu. Ovladač exportu však musí obsahovat standardní vstupní bod a unload rutiny, DllInitialize a DllUnload, nebo operační systém neaktivuje tento mechanismus počtu odkazů.
Systém volá rutinu DllUnload v režimu jádra, když uvolňuje knihovnu DLL.
NTSTATUS DllUnload(void);
Ovladače exportu musí poskytovat rutiny DllUnload. Rutinu DllUnload můžete použít k uvolnění všech prostředků používaných rutinami v knihovně DLL.