Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az alábbi ábra egy értesítési időzítő használatát mutatja be egy művelet időtúllépési időközének beállításához, majd várakozáshoz, amíg más illesztőprogram-rutinok feldolgoznak egy I/O-kérést.
Ahogy az előző ábrán is látható, az illesztőnek biztosítania kell a tárolót az időzítőobjektum számára, amelyet a KeInitializeTimer hívásának kell inicializálnia a tárhoz mutató mutatóval. Az illesztőprogram általában az AddDevice rutinból indítja el ezt a hívást.
Egy adott szál, például egy illesztőprogram által létrehozott szál vagy szinkron I/O-műveletet kérő szál kontextusában az illesztő megvárhatja az időzítőobjektumot az előző ábrán látható módon:
A szál meghívja a KeSetTimert az időzítő objektumra mutató mutatóval és egy adott DueTime értékkel, 100 nanoszekundumos egységekben kifejezve. A DueTime pozitív értéke azt az abszolút időpontot adja meg, amikor az időzítő objektumot el kell távolítani a kernel időzítő üzenetsorából, és a jelzett állapotra kell állítani. A DueTime negatív értéke az aktuális rendszeridőhöz viszonyított időközt adja meg.
Vegye figyelembe, hogy a szál (vagy a rendszerszálon futó illesztőprogram-rutin) null mutatót ad át a DPC-objektumnak (ez az ábrán korábban egy CustomTimerDpc-rutin időzítő- és DPC-objektumait szemléltető ábrán látható), amikor meghívja a KeSetTimert , ha a CustomTimerDpc-rutin helyett az időzítőobjektumon várakozik.
A szál meghívja a KeWaitForSingleObjectet az időzítőobjektumra mutató mutatóval, amely várakozási állapotba helyezi a szálat, miközben az időzítőobjektum a kernel időzítősorában van.
A megadott határidő lejár.
A kernel lekérdezi az időzítőobjektumot, beállítja a Jeles állapotra, és a szál állapotát várakozásról készre módosítja.
A kernel a processzor rendelkezésre állása után azonnal küldi el a szálat végrehajtásra: vagyis jelenleg nincs más, magasabb prioritású szál, és nincsenek kernel módú rutinok, amelyeket magasabb IRQL-vel kell futtatni.
Azok az illesztőprogram-rutinok, amelyek az IRQL >= DISPATCH_LEVEL szinten futnak, időzítőobjektum és a hozzá kapcsolódó DPC-objektum használatával időzíthetik ki a kéréseket, az illesztőprogram által megadott CustomTimerDpc rutin sorba állításához. Ahogyan az előző ábrán is látható, csak a nem önkényes szál kontextusában futó illesztőprogram-rutinok várhatnak az időzítőobjektum nemnulla időintervallumára.
Mint minden más szál, az illesztőprogram által létrehozott szálat is egy kernelszál-objektum képviseli, amely szintén egy diszpécserobjektum. Ezért az illesztőprogramnak nem szükséges az általa létrehozott szálat egy időzítőobjektummal használnia ahhoz, hogy önkéntes várakozási állapotba lépjen egy adott időtartamra. Ehelyett a szál meghívhatja a KeDelayExecutionThread parancsot egy hívó által megadott időközzel. Erről a technikáról további információt az Eszköz lekérdezése című témakörben talál.
A DriverEntry, az Reinitialize és a Unload rutinok rendszerszál-környezetben is futnak, így az illesztők meghívhatják a KeWaitForSingleObject-et egy illesztőprogram-inicializált időzítőobjektummal vagy KeDelayExecutionThreadtal az inicializálás vagy a törlés során. Az eszközillesztők nagyon rövid ideig (lehetőleg 50 mikroszekundumnál kisebb ideig) meghívhatják a KeStallExecutionProcessort , ha várniuk kell, amíg az eszköz frissül az inicializálás során.
A magasabb szintű illesztőprogramok azonban általában egy másik szinkronizálási mechanizmust használnak a DriverEntryben , és időzítőobjektum helyett újraincializálják a rutinokat. A magasabb szintű illesztőprogramokat mindig úgy kell megtervezni, hogy egy adott típusú vagy típusú eszközök alacsonyabb szintű illesztőprogramjai fölé rétegeződjenek magukat. Ezért a magasabb szintű illesztőprogramok általában lassan töltődnek be, ha egy időzítőobjektumon várakozik, vagy meghívja a KeDelayExecutionThread parancsot, mert az ilyen illesztőprogramnak elég hosszú ideig kell várnia ahhoz, hogy elférjen a lehető leglassabb eszköz, amely támogatja azt. Azt is vegye figyelembe, hogy egy ilyen várakozás minimális "biztonságos" időtartamának meghatározása nagyon nehéz.
Hasonlóképpen, a PnP-illesztőprogramok nem várnak más műveletekre, hanem a PnP-kezelő értesítési mechanizmusát kell használniuk.