Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 satisfaire aux exigences de trame, il retourne un code d’échec en réponse à l’IRP. Sinon, le filtre attache un pointeur à une structure au membre FsContext de l’objet de fichier et traite les requêtes d’allocation résultantes.
Si les mémoires tampons transmises à l’interface de diffusion en continu 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 de KSALLOCATOR_FRAMING appropriée.
Il existe deux interfaces disponibles pour l’allocateur. Tout d’abord, tous les allocateurs doivent prendre en charge le KSMETHODSETID_StreamAllocator basé sur l'IRP. Les allocateurs utilisant ce mécanisme sont limités à un nombre maximal de trames 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 géré à DISPATCH_LEVEL. Fournir l’accès à la table de fonctions est facultatif. Pour ce faire, prenez en charge les 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 renvoie un pointeur vers une trame si une trame est disponible. Si ce n’est pas le cas, elle retourne immédiatement NULL.
Lorsqu'une demande de libération est envoyée à l'allocateur, ce dernier signale l'événement « trame libre » du flux, indiquant au client qu'une trame libre est disponible. En outre, s’il existe des IRP de demande d’allocation en attente d’achèvement, l’allocateur doit planifier un élément de travail (si le niveau IRQL actuel n’est pas PASSIVE_LEVEL) et terminer la requête avec le cadre libre.
Il est possible que l’interface DISPATCH_LEVEL et l’interface basée sur IRP se disputent des cadres libres. KS synchronise cette file d’attente à l’aide du verrou de rotation d’annulation.