Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az exportálási illesztőprogramok olyan kernelmódú DLL-ek, amelyeket számos más hardverspecifikus vagy eszközspecifikus összetevő tölt be, de nem rendelkezik a teljes kernelmódú illesztőprogram néhány jellemzővel. Az exportálási illesztők nem rendelkeznek diszpécsertáblával, nincs helye az illesztőprogram-veremben, és nincs olyan bejegyzése a szolgáltatásvezérlő-kezelő adatbázisában, amely rendszerszolgáltatásként definiálja azt. Bár az exportálási illesztőprogram nem rendelkezik diszpécsertáblával, a szokásos illesztőprogramok számára is elláthatja a küldési rutinokat . A standard vezérlőprogram beszúrja a küldési rutinokat a saját diszpécsertáblájába. Az exportálási illesztőnek van egy stub DriverEntry rutinja, amelyet soha nem hívnak meg.
A kernel módú export-illesztőprogramok különösen alkalmasak olyan illesztőprogram-párok azon részének megvalósítására, amely független az alapul szolgáló verem és a hardver jellemzőitől.
A Windows számos olyan exportálási illesztőprogramot tartalmaz, amelyeket más illesztőprogramok töltenek be, például:
- SCSI-portillesztő
- Szalagos osztálymeghajtó
- Az IDE vezérlőillesztők mind rendszer által biztosított exportálási illesztőprogramok
A standard illesztőprogramok exportálási illesztőprogramokként is működhetnek. Ahhoz, hogy az illesztőprogram mindkét módon működjön, exportálási illesztőprogramként kell létrehozni, és normál illesztőprogramként kell betölteni.
Exportálási illesztőprogram létrehozása
Az exportálási illesztő Visual Studióban való létrehozásához kövesse az alábbi eljárást:
- Hozzon létre egy új projektet egy sablonból, például üres WDM-illesztőprogramból.
- Adjon hozzá egy moduldefiníciós fájlt a projekthez, például:
LIBRARY mydriver.sys
EXPORTS
DllInitialize PRIVATE
DllUnload PRIVATE
A kernel módú DLL belépési pontja mindig DllInitialize. A rendszer a DLL betöltése után azonnal meghívja a kernel módú DLL DllInitialize rutinját. Az exportálási illesztőprogramoknak dllInitialize rutinokat kell biztosítaniuk. A DllInitialize rutin használatával beszerezheti vagy inicializálhatja a DLL más rutinjai által igényelt erőforrásokat.
A DLLENTRY makróval nem adhatja meg a belépési pontot.
NTSTATUS DllInitialize(
_In_ PUNICODE_STRING RegistryPath
);
A RegistryPath egy megszámlált Unicode-sztringre mutató mutató, amely megadja a DLL beállításkulcsának elérési útját, HKEY_LOCAL_MACHINE\CurrentControlSet\Services\DllName. A DLL-rutinok ezt a kulcsot használhatják a DLL-specifikus információk tárolására. A RegistryPath által mutatott puffer felszabadul a DllInitialize kilépése után. Ezért ha a DLL használja a kulcsot, a DllInitialize-nek meg kell duplikálnia a kulcs nevét.
A létrehozási folyamat egy .lib kiterjesztésű exportálási kódtárat és egy .sys kiterjesztésű exportálási illesztőprogramot hoz létre.
Függvények importálása exportálási illesztőprogramból
Az exportálási illesztőprogram által exportált függvények importálásához deklarálnia kell a függvényeket az Ntdef.h-ban definiált DECLSPEC_IMPORT makróval. Például:
DECLSPEC_IMPORT int LoadPrinterDriver (int arg1);
Ez a makró __declspec(dllimport) tárolási osztály deklarációra képződik azokon a platformokon, ahol szükséges, és semmit azoknál a platformoknál, ahol nincs rá szükség.
Az exportálási illesztőben az exportálandó függvényt a DECLSPEC_EXPORT makróval kell deklarálni. Ez a makró feloldódik a __declspec(dllexport) tár-osztály deklarációjaként azokon a platformokon, ahol szükséges, és nem oldódik fel azokon a platformokon, ahol nem. Ha egy exportálási illesztőprogram egy szabványos illesztőprogramnak küldi el a küldési rutint, akkor ezt a rutint nem kell exportálni.
Export meghajtó betöltése és kirakása
Az exportálási illesztőprogramokat a %Windir%\System32\Drivers könyvtárba kell telepíteni. A Windows 2000-től kezdve az operációs rendszer egy hivatkozásszámot tart fenn, amely azt jelzi, hogy az exportálási illesztőprogram funkcióit hányszor importálták más illesztőprogramok. A rendszer csökkenti ezt a számot, valahányszor az importáló illesztőprogramok egyike kicsomagol. Ha a referenciaszám nullára csökken, a rendszer eltávolítja az exportálási illesztőprogramot. Az exportálási illesztőprogramnak azonban tartalmaznia kell a szokásos belépési pontot és -kiürítési rutinokat, a DllInitialize-t és a DllUnload-t, vagy az operációs rendszer nem aktiválja ezt a hivatkozásszám-mechanizmust.
A rendszer meghívja a kernel módú DLL DllUnload-rutinját, amikor eltávolítja a DLL-t.
NTSTATUS DllUnload(void);
Az exportálási illesztőprogramoknak DllUnload-rutinokat kell biztosítaniuk. A DllUnload rutin használatával felszabadíthatja a DLL rutinjai által használt erőforrásokat.