Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ibland måste drivrutiner tillhandahålla drivrutinsspecifik synkronisering av I/O-begäranderelaterade återanropsfunktioner, antingen utöver eller som ersättning för synkronisering som tillhandahålls av ramverket. Drivrutiner kan använda återanropssynkroniseringslås, spinnlås, väntelås och avbrottslås för att synkronisera drivrutinskod.
Återanropssynkroniseringslås
Om du har konfigurerat drivrutinen för att använda ramverkets automatiska synkroniseringsfunktion hämtar ramverket ett synkroniseringslås innan drivrutinens I/O-funktioner för begärandeåteranrop anropas.
Dessa synkroniseringslås för återanrop, som är associerade med ramverksenhetsobjekt och köobjekt, kan också hämtas av drivrutiner. För att hämta ett synkroniseringslås anropar en drivrutin WdfObjectAcquireLock. För att frigöra låset anropar drivrutinen WdfObjectReleaseLock.
Du kanske vill att drivrutinen ska använda återanropssynkroniseringslåsen om drivrutinen använder ramverkets synkronisering på enhetsnivå eller på könivå av I/O-begäranderelaterade återanropsfunktioner, men måste synkronisera viss kod som körs på IRQL = PASSIVE_LEVEL med återanropsfunktioner som körs på IRQL = DISPATCH_LEVEL. Det beror på att drivrutiner endast kan använda automatisk synkronisering för återanropsfunktioner som körs på samma IRQL.
En drivrutin kan till exempel bara använda automatisk synkronisering för ett arbetsobjektobjekt om körningsnivån för arbetsobjektobjektets överordnade objekt är WdfExecutionLevelPassive (eftersom ett arbetsobjekts återanropsfunktion alltid körs på IRQL= PASSIVE_LEVEL). Om en drivrutin anger WdfExecutionLevelDispatch i ExecutionLevel-medlemmen i ett enhetsobjekts WDF_OBJECT_ATTRIBUTES struktur kan drivrutinen därför inte ange automaticSerialization-medlemmen i ett underordnat arbetsobjekts konfigurationsstruktur. I stället måste drivrutinen hämta ett återanropssynkroniseringslås för att synkronisera EvtWorkItem-återanropsfunktionerna med det överordnade enhetsobjektets återanropsfunktioner.
Ramverkväntelås
Använd ramverksväntelås för att synkronisera åtkomst till drivrutinsdata från kod som körs på IRQL = PASSIVE_LEVEL. Innan en drivrutin kan använda ett ramverksväntelås måste den anropa WdfWaitLockCreate för att skapa ett väntelåsobjekt. Drivrutinen kan sedan anropa WdfWaitLockAcquire för att hämta låset och WdfWaitLockRelease för att släppa det.
Ramverksspinnlås
Använd ramverksspinnlås för att synkronisera åtkomst till drivrutinsdata från kod som körs på IRQL <= DISPATCH_LEVEL. När en drivrutinstråd hämtar ett spinnlås ställer systemet in trådens IRQL till DISPATCH_LEVEL. När tråden släpper låset återställer systemet trådens IRQL till den tidigare nivån.
En drivrutin som inte använder automatisk ramverkssynkronisering kan använda ett spinnlås för att synkronisera åtkomsten till ett enhetsobjekts kontextutrymme, om kontextutrymmet är skrivbart och om mer än en av förarens funktioner för händelseåteranrop kommer åt utrymmet.
Innan en drivrutin kan använda ett ramverksspinnlås måste den anropa WdfSpinLockCreate för att skapa ett spin-lock-objekt. Drivrutinen kan sedan anropa WdfSpinLockAcquire för att hämta låset och WdfSpinLockRelease för att släppa det.
Ett exempel på användning av spinnlås finns i Synkronisera annullering av skickade begäranden.
Ramverksavbrottslås
För avbrottsobjekt som stöder DIRQL-avbrottshantering är ramverksavbrottslås spinnlås. När drivrutinen har hämtat ett avbrottsspinnlås körs drivrutinen på enhetens DIRQL tills den släpper låset. Mer information om hur du använder avbrottslås finns i Synkronisera avbrottskod.
För avbrottsobjekt som stöder hantering på passiv nivå är ramverksavbrottslås väntelås. När drivrutinen skaffar ett avbrottsväntelås körs drivrutinen på IRQL = PASSIVE_LEVEL tills låset friges. Mer information om hantering på passiv nivå finns i Stöd för avbrott på passiv nivå.