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 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.
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.