Partager via


KsProbeStreamIrp, fonction (ks.h)

La fonction KsProbeStreamIrp apporte les modifications spécifiées aux mémoires tampons d’entrée et de sortie de l’IRP donné en fonction des indicateurs passés, puis valide l’en-tête de flux. Cela est utile lors de la localisation de la gestion des exceptions ou de l’exécution d’un travail asynchrone sur un IRP. L’IRP résultant est essentiellement au format METHOD_OUT_DIRECT ou METHOD_IN_DIRECT, à l’exception du fait que l’accès à la mémoire tampon de données peut être IoModifyAccess, en fonction des indicateurs passés à cette fonction ou des indicateurs dans l’en-tête du flux.

Syntaxe

KSDDKAPI NTSTATUS KsProbeStreamIrp(
  [in, out]      PIRP  Irp,
  [in]           ULONG ProbeFlags,
  [in, optional] ULONG HeaderSize
);

Paramètres

[in, out] Irp

Spécifie l’IRP dont les tampons d’entrée et de sortie doivent être mappés. Le mode demandeur de l’IRP est utilisé lors de l’analyse des mémoires tampons.

[in] ProbeFlags

Spécifie des indicateurs spécifiant comment sonder l’IRP de streaming ; les indicateurs sont répertoriés dans le tableau suivant.

[in, optional] HeaderSize

Spécifie la taille à valider par rapport à chaque en-tête passé à ce client, ou zéro si aucune validation n’est effectuée. S’il est utilisé, il est supposé que la mémoire tampon entière passée est un multiple de cette taille d’en-tête, sauf si la mémoire tampon contient plutôt un en-tête de modification de format unique.

Valeur retournée

La fonction KsProbeStreamIrp retourne STATUS_SUCCESS si elle réussit, ou renvoie une erreur de mémoire ou d’accès.

Remarques

Si la fonction est utilisée uniquement pour allouer des MDL et non pour sonder et verrouiller les adresses, l’appelant doit disposer d’une routine d’achèvement pour propre mdl. Par instance, un mécanisme de verrouillage juste-à-temps peut allouer la liste MDL, mais verrouiller uniquement la mémoire en fonction des besoins. Le client doit fournir un code de nettoyage pour supprimer la liste MDL partiellement verrouillée avant la fin de l’IRP, probablement dans une routine d’achèvement.

Si les en-têtes semblent avoir déjà été copiés dans une mémoire tampon système, ils ne sont pas validés à nouveau. En général, l’appel de la fonction KsProbeStreamIrp plusieurs fois avec un IRP n’est pas dangereux. Après avoir appelé la fonction, les en-têtes de flux sont disponibles dans PIRP. AssociatedIrp.SystemBuffer. Si les dll MDL de mémoire tampon de flux ont été allouées, elles sont disponibles via le PIRP. MdlAddress.

Les définitions suivantes sont utilisées pour la variable ProbeFlags :

ProbeFlags Valeur Description
KSPROBE_READ Indique que l’opération est un flux lu sur l’appareil. Il s’agit de la valeur par défaut.
KSPROBE_WRITE Indique que l’opération est une écriture de flux sur l’appareil.
KSPROBE_ALLOCATEMDL Indique que les dll MDL doivent être allouées pour les mémoires tampons de flux si elles n’ont pas déjà été allouées. Si aucune mémoire tampon de flux n’est présente, l’indicateur est ignoré. Si KSPROBE_PROBEANDLOCK n’est pas spécifié en même temps que cet indicateur, l’appelant doit disposer d’une routine de saisie semi-automatique afin de propre toutes les MDL si toutes les MDL n’ont pas été correctement sondées et verrouillées.
KSPROBE_PROBEANDLOCK Si le KSPROBE_ALLOCATEMDL est défini, indique que la mémoire référencée par les DLL MDL pour les mémoires tampons de flux doit être sondée et verrouillée. Si l’indicateur d’allocation MDL n’est pas défini, cet indicateur est ignoré même si l’allocation MDL a déjà eu lieu. La méthode de sondage est déterminée par le type d’IRP qui est passé. Pour une opération d’écriture, IoReadAccess est utilisé. Pour une opération de lecture, IoWriteAccess est utilisé. Si le client qui a envoyé les données utilise le pool non paginé, les dll MDL appropriées sont initialisées au lieu de sonder et de verrouiller.
KSPROBE_SYSTEMADDRESS Récupère une adresse système pour chaque MDL dans la chaîne afin que l’appelant n’ait pas besoin de le faire dans une étape distincte. Cela est ignoré si l’indicateur de sonde et de verrouillage n’est pas défini, même si les dll MDL ont déjà été sondées.
KSPROBE_ALLOWFORMATCHANGE Pour une écriture Stream, permet de définir l’indicateur KSSTREAM_HEADER_OPTIONSF_TYPECHANGED dans l’en-tête du flux. Cela implique que l’en-tête de flux n’est pas d’une longueur étendue, même si une taille d’en-tête étendue a été indiquée. En outre, il ne peut y avoir qu’un seul en-tête de flux contenu dans l’IRP dans ce cas. La mémoire tampon associée à cet en-tête contient le nouveau format de données. Pour les flux de données de mémoire système, la mémoire tampon ne doit pas avoir été acquise à partir de l’allocateur négocié, car elle ne fait pas partie du flux de données.

Configuration requise

Condition requise Valeur
Plateforme cible Universal
En-tête ks.h (inclure Ks.h)
Bibliothèque Ks.lib