Megosztás:


Eszközbővítmények

A legtöbb köztes és legalacsonyabb szintű illesztőprogram esetében az eszközbővítmény az eszközobjektumhoz társított legfontosabb adatstruktúra. Belső struktúrája illesztőprogram-definiált, és általában a következő célokra használatos:

  • Eszközállapot-információk karbantartása.

  • Tárhely biztosítása az illesztőprogram által használt, a kernel által definiált objektumokhoz vagy más rendszererőforrásokhoz, például forgózárakhoz.

  • Tároljon minden olyan adatot, amelynek az illesztőprogramnak memóriarezidensnek kell lennie és a rendszertérben kell lennie az I/O-műveletek végrehajtásához.

Mivel a legtöbb busz-, függvény- és szűrőillesztő (legalacsonyabb szintű és köztes illesztőprogramok) tetszőleges szálkörnyezetben futnak (bármilyen szál is legyen aktuális), az eszközbővítmény az egyes illesztőprogramok elsődleges helye az eszközállapot és az illesztőprogram által igényelt összes egyéb eszközspecifikus adat fenntartásához. A CustomTimerDpc - vagy CustomDpc-rutint megvalósító illesztőprogramok például általában tárterületet biztosítanak az eszközbővítmény szükséges kernelalapú időzítői és/vagy DPC-objektumai számára.

Minden olyan illesztőprogramnak, amely rendelkezik ISR-sel, biztosítania kell a tárterületet a kernel által definiált megszakítási objektumok egy csoportjához, és a legtöbb eszközillesztő ezt a mutatót egy eszközbővítményben tárolja. Minden illesztőprogram meghatározza az eszközbővítmény méretét, amikor létrehoz egy eszközobjektumot, és minden illesztőprogram meghatározza a saját eszközbővítményeinek tartalmát és szerkezetét.

Az I/O-kezelő IoCreateDevice és IoCreateDeviceSecure rutinjai memóriát foglalnak le az eszközobjektumhoz és a bővítményhez a nem lapozott memóriakészletből.

Az IRP-t fogadó szokásos illesztőprogram-rutinok a kért I/O-művelet céleszközét képviselő eszközobjektumra mutató mutatót is kapnak. Ezek az illesztőprogram-rutinok ezen a mutatón keresztül érhetik el a megfelelő eszközbővítményt. A DeviceObject-mutató általában a legalacsonyabb szintű illesztőprogram ISR-jének bemeneti paramétere is.

Az alábbi ábrán az illesztőprogram által definiált adatok reprezentatív halmaza látható a legalacsonyabb szintű illesztőprogram eszközobjektumának eszközbővítményéhez. Egy magasabb szintű illesztő nem biztosít tárolót az IoConnectInterrupt által visszaadott , a KeSynchronizeExecution és az IoDisconnectInterrupt számára átadott megszakításobjektum-mutató számára. A magasabb szintű illesztőprogramok azonban az alábbi ábrán látható időzítő- és DPC-objektumok számára biztosítanak tárhelyet, ha az illesztőprogram CustomTimerDpc rutinnal rendelkezik. A magasabb szintű illesztőprogram tárterületet is biztosíthat egy executive spin lockhoz és egy interlocked munkasorhoz.

a legalacsonyabb szintű illesztőhöz tartozó példaeszköz-bővítményt szemléltető diagram.

A megszakításobjektum-mutató tárhelyének biztosítása mellett a legalacsonyabb szintű eszközillesztőknek tárolót kell biztosítaniuk a megszakítási pörgetési zárhoz, ha az ISR két vagy több eszköz megszakításait kezeli különböző vektorokon, vagy ha több ISR-sel rendelkezik. Az ISR-regisztrációval kapcsolatos további információkért lásd: IsR regisztrálása.

Az illesztőprogramok általában az eszközbővítményeikben tárolják az eszközobjektumok mutatóit, ahogy az ábrán látható. Előfordulhat, hogy az illesztőprogram megőrzi az eszköz erőforráslistájának másolatát a bővítményben.

A magasabb szintű illesztőprogramok általában a következő alsóbb szintű illesztőprogram eszközobjektumára mutató mutatót tárolnak az eszközbővítményben. A magasabb szintű illesztőprogramnak át kell adnia egy mutatót a következő alsóbb szintű illesztőprogram eszközobjektumára az IoCallDriver függvénynek, miután beállította az IRP-ben a következő alsóbb szintű illesztőprogram I/O veremhelyét, ahogy azt az IRP-k kezelése rész ismerteti.

Vegye figyelembe azt is, hogy bármely magasabb szintű illesztőprogramnak, amely I/O kérelemcsomagokat allokál alacsonyabb szintű illesztőprogramok számára, meg kell adnia, hány veremhelyet kell tartalmaznia az új I/O kérelemcsomagoknak. Különösen akkor, ha egy magasabb szintű illesztőprogram meghívja az IoMakeAssociatedIrp, az IoAllocateIrp vagy az IoInitializeIrp parancsot, a következő alsó szintű illesztőprogram céleszköz-objektumához kell hozzáférnie a StackSize értékének olvasásához, hogy a megfelelő StackSize argumentumként adja meg ezeket a támogatási rutinokat.

Míg egy magasabb szintű illesztőprogram az IoAttachDeviceToDeviceStack által visszaadott mutatón keresztül képes adatokat olvasni a következő alsó szintű illesztőprogram eszközobjektumából, az ilyen illesztőprogramnak az alábbi megvalósítási irányelveket kell követnie:

  • Soha ne kíséreljen meg adatokat írni az alsó illesztőprogram eszközobjektumára.

    A fájlrendszerek képezik az egyetlen kivételt az útmutató alól, amelyek beállítják és törlik a DO_VERIFY_VOLUME jelzőt az alsó szintű cserélhető adathordozó-illesztőprogramok eszközobjektumaiban.

  • Soha ne próbálja meg elérni az alsó illesztőprogram eszközbővítményét a következő okokból:

    • Nincs biztonságos módja annak, hogy két illesztőprogram között egyetlen eszközbővítményhez való hozzáférést szinkronizálja.

    • Az ilyen hátsó ajtós kommunikációs sémát megvalósító illesztőprogram-párokat nem lehet egyenként frissíteni, nem helyezhetők be közéjük köztes illesztőprogramok a meglévő illesztőprogramforrás megváltoztatása nélkül, és nem lehet őket könnyen újrafordítani és áthelyezni az egyik Windows platformról a másikra.

Az alacsonyabb szintű illesztőprogramokkal való interoperabilitás megőrzéséhez egyik Windows-platformról vagy verzióról a másikra, a magasabb szintű illesztőprogramoknak vagy újra kell használniuk a megadott IRP-ket, vagy új IRP-ket kell létrehozniuk, és az IoCallDriver használatával kell megosztaniuk a kéréseket az alacsonyabb szintű illesztőprogramokkal.