Not
Å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.
Ett ramverksobjekts "livscykel" sträcker sig över tiden från när ett objekt skapas till när det tas bort. Ett objekts referensantal styr när det ska tas bort.
Skapa ett ramverksobjekt
De flesta ramverksobjekt skapas av ett drivrutinsanrop till objektets skapandemetod. Varje ramverksdrivrutin måste till exempel anropa WdfDriverCreate för att skapa ett ramverksdrivrutinsobjekt.
Andra ramverksobjekt skapas av ramverket. När ett användarprogram till exempel öppnar en enhet för läs- eller skrivåtgärder skapar ramverket ett ramverksfilobjekt och skickar det till drivrutinens EvtDeviceFileSkapa återanropsfunktion.
Några ramverksobjekt kan skapas av antingen ramverket eller av en drivrutin. När I/O-chefen till exempel levererar en I/O-begäran till en drivrutin skapar ramverket ett ramverksbegärandeobjekt och levererar det till drivrutinen, vanligtvis genom att anropa en av drivrutins begärandehanterare. En drivrutin kan också skapa ramverksbegärandeobjekt och leverera dem till andra drivrutiner.
Använda referensräkningar
Ramverket upprätthåller ett referensantal för varje objekt. När ett objekt skapas anger ramverket sitt referensantal till ett. Om referensantalet blir noll tar ramverket bort objektet.
Drivrutiner kan ändra ett objekts referensantal genom att anropa WdfObjectReference för att öka referensantalet eller WdfObjectDereference för att minska referensantalet. (En drivrutin kan bara anropa WdfObjectDereference om den tidigare har anropat WdfObjectReference.)
I de flesta fall behöver drivrutiner inte öka eller minska ett objekts referensantal. Ramverket ökar antalet innan det skickar objektets handtag till drivrutinen och minskar antalet när drivrutinen inte längre behöver objektet.
Drivrutiner anropar WdfObjectReference för att säkerställa att ett objekt inte tas bort (av ramverket eller av en drivrutinstråd) innan drivrutinen har slutfört användningen. Ett exempel på en situation där en drivrutin ska anropa WdfObjectReference och WdfObjectDereferencefinns i Synkronisera annullering av skickade begäranden.
Ta bort ett ramverksobjekt
Objekt tas bort antingen för att en drivrutin anropar WdfObjectDelete eller för att ramverket anropar en intern borttagningsrutin, men ett objekt tas bara bort om referensantalet är noll. När drivrutinen eller ramverket har försökt ta bort ett objekt förblir objektets handtag giltigt tills referensantalet blir noll. En drivrutin kan inte ta bort ett objekt genom att bara anropa WdfObjectDereference för att minska objektets referensantal till noll – drivrutinen måste också anropa WdfObjectDelete.
Om ett objekt är ett underordnat objekt till ett överordnat objekt och det överordnade objektet tas bort, försöker ramverket ta bort det underordnade objektet före det överordnade objektet. Objektborttagningen börjar längst bort från det överordnade objektet och fungerar uppåt i objekthierarkin mot roten.
Drivrutiner kan registrera följande två återanropsfunktioner som ramverket anropar när drivrutinen eller ramverket tar bort ett objekt:
En EvtCleanupCallback-återanropsfunktion som ramverket anropar så att drivrutinen kan anropa WdfObjectDereference om den tidigare hade anropat WdfObjectReference för objektet som tas bort.
En EvtDestroyCallback återanropsfunktion, som ramverket anropar efter att objektets referensantal har minskats till noll.
En av dessa återanropsfunktioner måste frigöra alla objektspecifika resurser som drivrutinen allokerade när objektet skapades.
Ramverket hanterar alltid borttagning av vissa ramverksobjekt och drivrutiner får inte försöka ta bort dessa objekt. En lista över ramverksobjekt som drivrutiner inte kan ta bort finns i WdfObjectDelete.