Delen via


Specifieke toewijzingen filteren

Filters die allocators vereisen voor intern geheugen of andere apparaatafhankelijke opslagmethoden, kunnen een specifieke allocator bieden door allocator-eigenschappen en -methoden te ondersteunen. Zie KSPROPERTY_STREAM_ALLOCATOR voor meer informatie.

Een filter ontvangt een IRP_MJ_CREATE van het type KSCREATE_REQUEST_ALLOCATOR die de frameringsopties voor de allocator specificeert. De routine voor het maken van de allocator van de minidriver valideert de aanvraag door KsValidateAllocatorCreateRequest aan te roepen. Als de aanroep is geslaagd, retourneert deze routine een aanwijzer naar de relevante KSALLOCATOR_FRAMING structuur.

Als het filter niet aan de framevereisten kan voldoen, retourneert het een foutcode als reactie op de IRP. Anders koppelt het filter een aanwijzer aan een structuur van het FsContext-lid van het bestandsobject en verwerkt de resulterende allocatoraanvragen.

Als buffers die aan de streaming-interface worden doorgegeven in de plaats moeten worden gewijzigd door het filter, stelt de gebruikersmodusclient de KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER-vlag in op de relevante KSALLOCATOR_FRAMING-structuur.

Er zijn twee interfaces beschikbaar voor de allocator. Ten eerste moeten alle allocators de op IRP gebaseerde KSMETHODSETID_StreamAllocator ondersteunen. Toewijzers die dit mechanisme gebruiken, zijn beperkt tot een maximum aantal toegewezen frames. Aanvragen voor het toewijzen van frames buiten deze limiet worden gemarkeerd als in behandeling.

Ten tweede kan de minidriver toegang tot functietabellen ondersteunen als het type geheugentoewijzing bij DISPATCH_LEVEL kan worden uitgevoerd. Het bieden van toegang tot functietabellen is optioneel. Doe dit door de eigenschappen in KSPROPSETID_StreamAllocator te ondersteunen.

De DISPATCH_LEVEL-interface werkt als volgt:

Wanneer een toewijzingsaanvraag wordt ingediend bij de allocator, retourneert de allocator een aanwijzer naar een frame als deze beschikbaar is. Als dat niet zo is, wordt NULL onmiddellijk geretourneerd.

Wanneer een vrij verzoek naar de allocator wordt verzonden, meldt de allocator het 'free frame'-evenement van de stream aan de client, waarbij wordt aangegeven dat er een vrij frame beschikbaar is. Bovendien moet de allocator een werkitem plannen (als de huidige IRQL niet is PASSIVE_LEVEL) en de aanvraag met het gratis frame voltooien als er toewijzingsaanvraag-IRP's zijn die wachten om te worden voltooid.

Het is mogelijk dat zowel de DISPATCH_LEVEL interface als de op IRP gebaseerde interface voor gratis frames strijden. KS synchroniseert deze wachtrij met behulp van het annuleer-spinlock.