Dela via


Filtrera specifika allokerare

Filter som kräver allokerare för inbyggt minne eller andra enhetsberoende lagringsmetoder kan ge en specifik allokerare genom att stödja allokeringsegenskaper och metoder. Mer information finns i KSPROPERTY_STREAM_ALLOCATOR.

Ett filter tar emot en IRP_MJ_CREATE av typen KSCREATE_REQUEST_ALLOCATOR som specificerar inramningsalternativen för allokeraren. Minidrivarens allokeringsrutin validerar skapandebegäran genom att anropa KsValidateAllocatorCreateRequest. Om anropet lyckas returnerar den här rutinen en pekare till relevant KSALLOCATOR_FRAMING struktur.

Om filtret inte uppfyller inramningskraven returneras en felkod som svar på IRP. Annars bifogar filtret en pekare till en struktur till FsContext-medlemmen i filobjektet och servar de resulterande allokeringsbegäranden.

Om buffertar som skickas till strömningsgränssnittet ska modifieras direkt av filtret, anger klienten i användarläge flaggan KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER på den relevanta KSALLOCATOR_FRAMING strukturen.

Det finns två gränssnitt tillgängliga för allokeraren. För det första måste alla allokerare ha stöd för den IRP-baserade KSMETHODSETID_StreamAllocator. Allokerare som använder den här mekanismen är begränsade till ett maximalt antal allokerade ramar. Begäranden om att allokera ramar utöver den här gränsen markeras som väntande.

För det andra kan minidrivrutinen ha stöd för åtkomst till funktionstabellen om allokeringspooltypen kan hanteras på DISPATCH LEVEL. Det är valfritt att tillhandahålla åtkomst till funktionstabeller. Gör detta genom att stödja egenskaperna i KSPROPSETID_StreamAllocator.

Gränssnittet DISPATCH_LEVEL fungerar på följande sätt:

När en allokeringsbegäran skickas till allokeraren returnerar allokeraren en pekare till en ram om en är tillgänglig. Annars returnerar den omedelbart NULL.

När en kostnadsfri begäran skickas till allokeraren signalerar allokeraren streamallokerarens "kostnadsfria ram"-händelse som meddelar klienten att en kostnadsfri ram är tillgänglig. Om det finns IRP:er för allokeringsbegäran som väntar på att slutföras måste allokeraren schemalägga ett arbetsobjekt (om den aktuella IRQL:en inte är PASSIVE_LEVEL) och slutföra begäran med den lediga ramen.

Det är möjligt för både DISPATCH_LEVEL-gränssnittet och det IRP-baserade gränssnittet att kämpa för lediga ramar. KS synkroniserar den här kön med hjälp av avbrottspinnlåset.