Pointeurs de flux et annulation d’IRP
Si un frame a un pointeur de flux verrouillé qui le référence, l’IRP qui correspond à ce frame ne peut pas être annulée. Consultez Verrouillage et déverrouillage des pointeurs de flux.
Le tableau suivant répertorie les techniques que votre minidriver peut utiliser pour prendre en charge l’annulation IRP. Votre stratégie d’annulation doit être basée sur les exigences d’accès au flux de votre minidriver, comme décrit dans la colonne la plus à gauche.
Si vous avez besoin. | Action | Commentaires |
---|---|---|
Accès bref pour diffuser des données en continu à un point d’accès unique |
Appelez KsPinGetLeadingEdgeStreamPointer avec le paramètre State défini sur KSSTREAM_POINTER_STATE_LOCKED. Appelez ensuite KsStreamPointerUnlock ou KsStreamPointerAdvanceOffsetsAndUnlock immédiatement après le traitement. |
Fournit une réactivité rapide à l’annulation, sauf si le thread se bloque entre l’acquisition du pointeur et son déverrouillage. |
Durée d’accès indéfinie, mais peut abandonner la revendication dans le contexte d’un rappel d’annulation |
Appelez KsStreamPointerClone pour cloner un pointeur de flux verrouillé (généralement le bord d’avant), le déverrouiller et répondre à CancelCallback. Le rappel se produit avec le verrouillage de rotation de la file d’attente maintenu, donc à DISPATCH_LEVEL. Par conséquent, la routine CancelCallback fournie par le fournisseur ne peut pas effectuer de manipulation de file d’attente ou appeler des fonctions qui acquièrent un mutex. Au lieu de cela, dans la routine de rappel, le minidriver vérifie que les données associées ne seront pas accessibles ultérieurement, puis appelle KsStreamPointerDelete. |
Peut être plus difficile à implémenter, mais fournit souvent le meilleur équilibre entre un accès efficace et une réponse rapide à l’annulation. |
Accès périodique à un frame et peut tolérer la disparition du frame entre les accès |
Conservez un clone déverrouillé et appelez KsStreamPointerLock pour le verrouiller au moment de l’accès. Si le frame est annulé, la prochaine tentative de verrouillage du pointeur de flux échoue et le minidriver peut appeler KsStreamPointerDelete. |
Comme avec la première option, la réactivité à l’annulation est une fonction de la durée pendant laquelle le pointeur de flux est verrouillé. |
Durée d’accès indéfinie et ne peut pas abandonner la revendication en réponse à un rappel |
Conservez un pointeur de flux de clone verrouillé pendant toute la durée pour empêcher l’annulation. Pour créer un pointeur de flux de clone, appelez KsStreamPointerClone. Appelez ensuite KsStreamPointerLock et KsStreamPointerUnlock pour verrouiller ou déverrouiller le clone. |
La réactivité à l’annulation peut être médiocre. Envisagez d’utiliser des délais d’expiration de pointeur de flux avec cette technique. |
Si un frame a un pointeur de flux qui la référence, le minidriver peut appeler KsStreamPointerGetIrp pour accéder à l’IRP correspondant à ce frame. Pour récupérer la liste de descripteurs mémoire (MDL) associée à un frame, appelez KsStreamPointerGetMdl.