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.
Někdy musí ovladače poskytovat synchronizaci funkcí zpětného volání souvisejícího s vstupně-výstupními operacemi specifické pro ovladače, a to buď kromě nebo jako náhradu za synchronizaci zadanou architekturou. Ovladače můžou k synchronizaci kódu ovladače použít zpětnovazební zámky, spin locky, zámky čekání a zámky přerušení.
Zámky synchronizace zpětného volání
Pokud jste ovladač nastavili tak, aby používal funkci automatické synchronizace, rozhraní získá zámek synchronizace před voláním funkcí zpětného volání pro události související s I/O požadavky ovladače.
Tyto zámky synchronizace zpětného volání, které jsou přidružené k objektům zařízení architektury a objektům fronty, mohou být také získány ovladači. K získání zámku synchronizace ovladač volá WdfObjectAcquireLock. Chcete-li uvolnit zámek, ovladač volá WdfObjectReleaseLock.
Možná budete chtít, aby váš ovladač používal synchronizační zámky zpětného volání, pokud ovladač využívá synchronizaci na úrovni zařízení nebo fronty pro zpětné volací funkce související se vstupně-výstupními požadavky, ale potřebuje synchronizovat kód, který běží na IRQL = PASSIVE_LEVEL s funkcemi, které běží na IRQL = DISPATCH_LEVEL. Důvodem je, že ovladače můžou používat automatickou synchronizaci pouze pro funkce zpětného volání, které se spouštějí ve stejné technologii IRQL.
Ovladač může například použít automatickou synchronizaci pro objekt pracovní položky pouze v případě, že úroveň provádění nadřazeného objektu pracovní položky je WdfExecutionLevelPassive (protože funkce zpětného volání pracovní položky se vždy spouští v IRQL= PASSIVE_LEVEL). Proto pokud ovladač zadá WdfExecutionLevelDispatch ve členu ExecutionLevel struktury objektu zařízení v WDF_OBJECT_ATTRIBUTES, ovladač nemůže nastavit AutomaticSerialization členu konfigurační struktury podřízené pracovní položky. Místo toho musí ovladač získat zámek synchronizace zpětného volání pro synchronizaci zpětného volání funkcí EvtWorkItem s funkcemi zpětného volání nadřazeného objektu zařízení.
Zámky čekání rámce
Pomocí zámků frameworku pro čekání můžete synchronizovat přístup k datům ovladačů z kódu, který běží na IRQL = PASSIVE_LEVEL. Než může ovladač použít čekací zámek rozhraní, musí zavolat WdfWaitLockCreate k vytvoření objektu čekacího zámku. Ovladač pak může zavolat WdfWaitLockAcquire k získání zámku a WdfWaitLockRelease k jeho uvolnění.
Zámek číselníku architektury
Pomocí spin locků architektury můžete synchronizovat přístup k datům ovladače z kódu, který běží na IRQL <= DISPATCH_LEVEL. Když vlákno ovladače získá zámek otáčení, systém nastaví IRQL vlákna na DISPATCH_LEVEL. Když vlákno uvolní zámek, systém obnoví IRQL vlákna na předchozí úroveň.
Ovladač, který nepoužívá automatickou synchronizaci rozhraní, může k synchronizaci přístupu ke kontextovému prostoru objektu zařízení použít spinlock, pokud je tento prostor zapisovatelný a pokud k němu přistupuje více než jedna z funkcí zpětného volání událostí ovladače.
Než může ovladač použít "framework spinlock", musí zavolat WdfSpinLockCreate k vytvoření objektu spinlock. Ovladač pak může volat WdfSpinLockAcquire k získání zámku a WdfSpinLockRelease k jeho uvolnění.
Příklad použití spinlocků najdete v sekci Synchronizace zrušení odeslaných požadavků.
Zámky přerušení rámce
U objektů přerušení, které podporují zpracování přerušení DIRQL, jsou zámky přerušení frameworku spin zámky. Jakmile ovladač získá zámek přerušení, ovladač se spustí v DIRQL zařízení, dokud zámek neuvolní. Další informace o používání zámků přerušení naleznete v tématu Synchronizace kódu přerušení.
U objektů přerušení, které podporují zpracování pasivní úrovně, jsou zámky přerušení architektury zámky čekání. Jakmile si ovladač získá zámek čekání na přerušení, běží na IRQL = PASSIVE_LEVEL, dokud zámek neuvolní. Další informace o zpracování pasivní úrovně naleznete v tématu Podpora přerušení na pasivní úrovni.