Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rutiny odebrání zámku poskytují způsob, jak sledovat počet nevyřízených vstupně-výstupních operací v zařízení a určit, kdy je bezpečné odpojit a odstranit objekt zařízení ovladače. Systém tyto rutiny poskytuje zapisovačům ovladačů jako alternativu k implementaci vlastního mechanismu sledování.
Ovladač může tento mechanismus použít pro dva účely:
Aby se zajistilo, že rutina DispatchPnP ovladače nedokončí požadavek IRP_MN_REMOVE_DEVICE během uzamčení (například když k zařízení přistupuje jiná rutina ovladače).
Pokud chcete spočítat počet důvodů, proč by ovladač neměl odstranit jeho objekt zařízení, a nastavit událost, když tento počet přejde na nulu.
Pokud chcete inicializovat zámek pro odebrání, ovladač by měl přidělit strukturu IO_REMOVE_LOCK v jeho rozšíření zařízení a potom volat IoInitializeRemoveLock. Ovladač obvykle volá IoInitializeRemoveLock v rutině AddDevice , když ovladač inicializuje zbytek rozšíření zařízení pro objekt zařízení.
Ovladač musí při každém spuštění vstupně-výstupní operace volat IoAcquireRemoveLock . Ovladač musí volat IoReleaseRemoveLock pokaždé, když dokončí vstupně-výstupní operaci. Ovladač může zámek získat více než jednou. Rutiny odebrání zámku udržují počet nevyřízených pořízení zámku. Každé volání IoAcquireRemoveLock zvýší počet a IoReleaseRemoveLock sníží počet.
Ovladač by měl také volat IoAcquireRemoveLock , když předává odkaz na jeho kód (pro časovače, DPC, zpětné volání atd.). Ovladač pak musí volat IoReleaseRemoveLock , když se událost vrátila.
V kódu odeslání pro IRP_MN_REMOVE_DEVICE musí ovladač získat zámek ještě jednou a pak volat IoReleaseRemoveLockAndWait. Tato rutina se nevrací, dokud nebudou uvolněna všechna zbývající držení zámku. Pokud chcete povolit dokončení vstupně-výstupních operací ve frontě, měl by každý ovladač zavolat IoReleaseRemoveLockAndWait, jakmile předá požadavek IRP_MN_REMOVE_DEVICE na další nižší ovladač, a předtím, než uvolní paměť, zavolá IoDetachDevice nebo zavolá IoDeleteDevice. Po volání IoReleaseRemoveLockAndWait pro konkrétní zámek remove všechny následné volání IoAcquireRemoveLock pro stejný zámek odebrání selžou.
Jakmile IoReleaseRemoveLockAndWait vrátí, měl by ovladač považovat zařízení za ve stavu, ve kterém je připravené k odebrání a není schopné provádět vstupně-výstupní operace. Ovladač proto nesmí volat IoInitializeRemoveLock k opětovné inicializaci zámku "remove". Porušení tohoto pravidla při ověření ovladače nástrojem Driver Verifier způsobí kontrolu chyb.
Vzhledem k tomu, že ovladač ukládá strukturu IO_REMOVE_LOCK do rozšíření objektu zařízení, zámek pro odebrání se odstraní, když ovladač odstraní toto rozšíření při zpracování požadavku IRP_MN_REMOVE_DEVICE.