Filtrer des allocateurs spécifiques
Les filtres qui nécessitent des allocateurs pour la mémoire embarquée ou d’autres méthodes de stockage dépendantes de l’appareil peuvent fournir un allocateur spécifique en prenant en charge les propriétés et méthodes d’allocation. Pour plus d’informations, consultez KSPROPERTY_STREAM_ALLOCATOR.
Un filtre reçoit une IRP_MJ_CREATE de type KSCREATE_REQUEST_ALLOCATOR spécifiant les options de cadrage pour l’allocateur. La routine de création de l’allocateur du minidriver valide la demande de création en appelant KsValidateAllocatorCreateRequest. Si l’appel réussit, cette routine retourne un pointeur vers la structure KSALLOCATOR_FRAMING appropriée.
Si le filtre ne peut pas répondre aux exigences de cadrage, il retourne un code d’échec en réponse à l’IRP. Sinon, le filtre joint un pointeur vers une structure au membre FsContext de l’objet de fichier et fournit les requêtes d’allocation résultantes.
Si les mémoires tampons passées à l’interface de streaming doivent être modifiées sur place par le filtre, le client en mode utilisateur définit l’indicateur KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER sur la structure KSALLOCATOR_FRAMING appropriée.
L’allocateur dispose de deux interfaces. Tout d’abord, tous les allocateurs doivent prendre en charge les KSMETHODSETID_StreamAllocator basées sur IRP. Les répartiteurs utilisant ce mécanisme sont limités à un nombre maximal d’images allouées. Les demandes d’allocation d’images au-delà de cette limite sont marquées en attente.
Deuxièmement, le minidriver peut prendre en charge l’accès à la table de fonctions si le type de pool d’allocation peut être pris en charge à DISPATCH_LEVEL. La fourniture d’un accès à la table de fonctions est facultative. Pour ce faire, prise en charge des propriétés dans KSPROPSETID_StreamAllocator.
L’interface DISPATCH_LEVEL fonctionne comme suit :
Lorsqu’une demande d’allocation est envoyée à l’allocateur, l’allocateur retourne un pointeur vers une image, le cas échéant. Si ce n’est pas le cas, elle retourne immédiatement la valeur NULL.
Lorsqu’une demande gratuite est envoyée à l’allocateur, l’allocateur signale l’événement « cadre libre » de l’allocateur de flux, informant le client qu’une image libre est disponible. En outre, si des IRP de demande d’allocation attendent d’être terminés, l’allocateur doit planifier un élément worker (si l’IRQL actuel n’est pas PASSIVE_LEVEL) et terminer la demande avec le cadre libre.
Il est possible que l’interface DISPATCH_LEVEL et l’interface basée sur L’IRP se disputent les images libres. KS synchronise cette file d’attente à l’aide du verrou d’annulation de rotation.