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.
Objektkontextutrymme är extra, icke-sidbart, minnesutrymme som en drivrutin kan allokera och tilldela till ett objekt. Varje ramverksbaserad drivrutin kan skapa ett eller flera objektspecifika kontextutrymmen för varje ramverksobjekt som drivrutinen tar emot eller skapar.
Ramverksbaserade drivrutiner bör lagra alla objektspecifika data, antingen efter värde eller pekare, inom kontextutrymmet för det objekt som data tillhör.
En drivrutin för USB-enheter kan till exempel skapa kontextutrymme för dess ramverksenhetsobjekt. I kontextutrymmet kan drivrutinen lagra sådan enhetsspecifik information som enhetens USB_DEVICE_DESCRIPTOR och USB_CONFIGURATION_DESCRIPTOR strukturer, plus ett handtag till ett samlingsobjekt som representerar ett enhetsgränssnitts rör.
Ramverket skickar inte ramverksobjekt från en drivrutin till en annan, så du kan inte använda ett objekts kontextutrymme för att skicka data mellan två drivrutiner.
Om du vill definiera ett objekts kontextutrymme måste du skapa en eller flera strukturer. Varje struktur representerar ett separat kontextutrymme. Drivrutinen använder varje strukturmedlem för att lagra en objektspecifik information. Dessutom måste drivrutinen be ramverket att generera en åtkomstmetod för varje struktur. Den här accessormetoden accepterar ett objekthandtag som indata och returnerar adressen för objektets kontextutrymme.
När drivrutinen anropar en metod för att skapa objekt, till exempel WdfDeviceCreate, allokerar metoden eventuellt kontextutrymme. Alla metoder för att skapa objekt accepterar en valfri WDF_OBJECT_ATTRIBUTES struktur som indata. Den här strukturen beskriver det kontextutrymme som du vill att ramverket ska allokera för objektet.
Om du vill lägga till ytterligare kontextutrymme i ett objekt när drivrutinen har anropat objektets skapandemetod kan drivrutinen anropa metoden WdfObjectAllocateContext – som, precis som metoderna för att skapa objekt, accepterar en WDF_OBJECT_ATTRIBUTES struktur som indata.
När ramverket allokerar plats för ett objekts kontext, initieras även platsen med noll.
När ramverket eller en drivrutin tar bort ett ramverksobjekt tar ramverket bort hela objektets kontextutrymme.
Om drivrutinen använder kontextutrymme för att lagra pekare till buffertar som drivrutinen allokerar när den skapar ett objekt, bör drivrutinen tillhandahålla en EvtCleanupCallback-funktion som frigör buffertarna när objektet tas bort.
Om du vill definiera ett objekts kontextutrymmesstruktur och åtkomstmetod för de objekt som din drivrutin skapar, måste drivrutinen använda följande steg:
Definiera en struktur som beskriver de data som du vill lagra. Om du till exempel vill skapa kontextdata för drivrutinens enhetsobjekt kan drivrutinen definiera en struktur som kallas MY_DEVICE_CONTEXT.
Använd antingen WDF_DECLARE_CONTEXT_TYPE makrot eller WDF_DECLARE_CONTEXT_TYPE_WITH_NAME makrot. Båda dessa makron gör följande:
- Skapa och initiera en WDF_OBJECT_CONTEXT_TYPE_INFO struktur.
 - Definiera en accessor-metod som drivrutinen senare ska använda för att komma åt ett objekts kontextutrymme. Accessor-metodens returvärde är en pekare till objektets kontextutrymme.
 
Makrot WDF_DECLARE_CONTEXT_TYPE skapar namnet på accessormetoden från din strukturs namn. Om kontextstrukturens namn till exempel är MY_DEVICE_CONTEXT skapar makrot en accessormetod med namnet WdfObjectGet_MY_DEVICE_CONTEXT.
Med makrot WDF_DECLARE_CONTEXT_TYPE_WITH_NAME kan du ange namnet på accessormetoden. Du kan till exempel ange GetMyDeviceContext som namn på kontextåtkomstmetoden för enhetsobjekt.
Anropa WDF_OBJECT_ATTRIBUTES_INIT för att initiera objektets WDF_OBJECT_ATTRIBUTES struktur.
Använd makrot WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE för att ange ContextTypeInfo-medlemmen i WDF_OBJECT_ATTRIBUTES struktur till adressen för WDF_OBJECT_CONTEXT_TYPE_INFO struktur.
Anropa en metod för att skapa objekt, till exempel WdfEnhetSkapa.
När drivrutinen har skapat ett objekt kan drivrutinen anropa WdfObjectAllocateContext när som helst för att lägga till ytterligare kontextutrymme i objektet.
Eftersom steg 1 och 2 definierar globala datastrukturer och skapar en drivrutinsanropsbar rutin måste drivrutinen utföra de här stegen i ett område i drivrutinen som deklarerar globala data – vanligtvis en huvudfil. De här stegen får inte slutföras inifrån förarens rutiner.
Din drivrutin måste slutföra steg 3, 4 och 5 ifrån en drivrutinsrutin som skapar ett objekt, till exempel en callback-funktion såsom EvtDriverDeviceAdd som anropar WdfDeviceCreate.
Ramverket kan skapa två typer av objekt – ramverksbegärandeobjekt och ramverksfilobjekt – för drivrutinens räkning. Drivrutinen kan registrera kontextutrymme för dessa objekt genom att anropa WdfDeviceInitSetRequestAttributes respektive WdfDeviceInitSetFileObjectConfig. Drivrutinen kan också kalla på WdfObjectAllocateContext för att tilldela kontextutrymme åt dessa objekt.
När ett objekt har skapats kan drivrutinen hämta en pekare till objektets kontextutrymme med hjälp av någon av följande tekniker:
Anropa den kontextåtkomstmetod som du skapade i steg 2 i föregående procedur med hjälp av antingen WDF_DECLARE_CONTEXT_TYPE eller WDF_DECLARE_CONTEXT_TYPE_WITH_NAME makro.
Anropa WdfObjectGetTypedContext och ange namnet på din drivrutinsdefinierade kontextstruktur.
Om drivrutinen har en kontextutrymmespekare kan den hitta det objekt som kontextutrymmet tillhör genom att anropa WdfObjectContextGetObject.