Eszközsorok beállítása és használata

Az illesztőprogram beállít egy eszközsor-objektumot a KeInitializeDeviceQueue meghívásával az illesztőprogram vagy az eszköz inicializálásakor. Az eszköz(ek) elindítása után az illesztőprogram a KeInsertDeviceQueue vagy a KeInsertByKeyDeviceQueue meghívásával IRP-kat illeszt be ebbe az sorba. Az alábbi ábra ezeket a hívásokat szemlélteti.

eszközsorok beállítása és használata.

Az ábrán látható, hogy az illesztőprogramnak biztosítania kell a tárolót egy eszközsor-objektum számára, amelynek rezidensnek kell lennie. Az eszközsor-objektumot létrehozó illesztőprogramok általában az illesztőprogram által létrehozott eszközobjektum eszközbővítményében biztosítják a szükséges tárterületet, de a tároló egy vezérlőbővítményben is lehet, ha az illesztőprogram vezérlőobjektumot használ, vagy az illesztőprogram által lefoglalt nem lapalapú készletben.

Ha az illesztőprogram egy eszközbővítményben tárterületet biztosít az eszközsor-objektum számára, meghívja a KeInitializeDeviceQueue-t az eszközobjektum létrehozása és az eszköz elindítása előtt. Más szóval, az illesztőprogram inicializálhatja a sort az AddDevice rutin során, vagy amikor egy PnP IRP_MN_START_DEVICE kérést kezel. A KeInitializeDeviceQueue hívásában az illesztőprogram egy mutatót ad át az eszközsor-objektum számára biztosított tárterületre.

Az eszköz(ek) elindítása után az illesztőprogram beszúrhat egy IRP-t az eszközsorba a KeInsertDeviceQueue meghívásával, amely az IRP-t az üzenetsor végén helyezi el, vagy a KeInsertByKeyDeviceQueue, amely az IRP-t egy illesztőprogram által meghatározott SortKey érték szerint helyezi az üzenetsorba, ahogyan az az előző ábrán látható.

A támogató rutinok mindegyike logikai értéket ad vissza, amely jelzi, hogy az IRP be lett-e szúrva a sorba. Ezek a hívások az eszközvárakozási sor objektumának állapotát is foglaltra állítják, ha a sor jelenleg üres (Not-Busy). Ha azonban az üzenetsor üres (Not-Busy), a KeInsertXxxDeviceQueue rutin sem szúrja be az IRP-t az üzenetsorba. Ehelyett az eszközsor-objektum állapotát Foglalt értékre állítja, és HAMIS értéket ad vissza. Mivel az IRP nem lett várólistára állítva, az illesztőprogramnak át kell adnia azt egy másik illesztőprogram-rutinnak a további feldolgozáshoz.

Kiegészítő eszközsorok beállításakor kövesse az alábbi megvalósítási útmutatót:

Ha a KeInsertXxxDeviceQueuehívása HAMIS értéket ad vissza, a hívónak át kell adnia azt az IRP-t, amelyet további feldolgozásra egy másik illesztőprogram-rutinba próbált meg várólistára tenni. A KeInsertXxxDeviceQueue hívása azonban Foglalt állapotúra módosítja az eszközsor objektumának állapotát, így a következő beérkező IRP be lesz szúrva az eszközsorba, hacsak az illesztőprogram nem hívja meg először a KeRemoveXxxDeviceQueue hívást.

Ha az eszközsor-objektum állapota Foglalt értékre van állítva, az illesztőprogram az alábbi támogatási rutinok egyikének hívásával lekérhet egy IRP-t további feldolgozás céljából, vagy az állapotot visszaállíthatja a Not-Busy értékre.

  • KeRemoveDeviceQueue az üzenetsor elején lévő IRP eltávolítására

  • KeRemoveByKeyDeviceQueue az illesztőprogram által meghatározott SortKey érték alapján kiválasztott IRP eltávolításához

  • KeRemoveEntryDeviceQueue egy adott IRP eltávolításához az üzenetsorban, vagy annak megállapításához, hogy egy adott IRP szerepel-e az üzenetsorban

    A KeRemoveEntryDeviceQueue egy logikai értéket ad vissza, amely jelzi, hogy az IRP szerepel-e az eszközsorban.

Ezen rutinok bármelyikének meghívásával eltávolíthat egy bejegyzést egy üres, de foglalt eszközsorból, ami az üres sor állapotát nem foglaltra módosítja.

Minden eszközsor-objektumot egy beépített vezetői pörgetési zár véd (ez nem jelenik meg az Eszközsor-objektum használata ábrán). Ennek eredményeképpen az illesztőprogram beillesztheti az IRP-ket az üzenetsorba, és többprocesszoros-biztos módon eltávolíthatja őket minden olyan illesztőprogram-rutinból, amely az IRQL = DISPATCH_LEVEL értéken vagy az alatt fut. Az IRQL-korlátozás miatt az illesztőprogram nem hívhat meg semmilyen KeXxxDeviceQueue rutint az ISR- vagy SynchCritSection rutinjaiból, amelyek a DIRQL-n futnak.

További információ: Hardverprioritások és pörgetési zárolások kezelése. Az adott támogatási rutinRA vonatkozó IRQL-követelményekért tekintse meg a rutin referenciaoldalát.