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 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 de 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 mémoires tampons d’entrée et de sortie doivent être mappées. Le mode demandeur de l’IRP est utilisé lors de la détection 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 chaque en-tête par rapport à ce client, ou zéro si aucune validation n’est à effectuer. Si elle est utilisée, il est supposé que l’intégralité de la mémoire tampon passée est un multiple de cette taille d’en-tête, sauf si la mémoire tampon contient à la place un seul en-tête de modification de format.
Valeur de retour
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 mdL et non pour sonder et verrouiller les adresses, l’appelant doit disposer d’une routine d’achèvement pour nettoyer le MDL. Par exemple, un mécanisme de verrouillage juste-à-temps peut allouer la liste MDL, mais uniquement verrouiller la mémoire si nécessaire. Le client doit fournir le 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 déjà avoir été copiés dans une mémoire tampon système, il n’est pas validé à nouveau. En règle générale, 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 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 :
valeur ProbeFlags | 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 doivent être allouées pour les mémoires tampons de flux s’ils n’ont pas déjà été alloués. 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 avoir une routine d’achèvement afin de nettoyer les MDL s’ils n’ont pas tous été correctement sondés et verrouillés. |
KSPROBE_PROBEANDLOCK | Si la KSPROBE_ALLOCATEMDL est définie, indique que la mémoire référencée par les DLL pour les mémoires tampons de flux doit être sonde 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 détection est déterminée par le type d’IRP 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 MDL appropriés sont initialisés plutôt que de probiser et de verrouiller. |
KSPROBE_SYSTEMADDRESS | Récupère une adresse système pour chaque MDL de 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 été précédemment sondes. |
KSPROBE_ALLOWFORMATCHANGE | Pour un flux d’écriture, permet à l’indicateur KSSTREAM_HEADER_OPTIONSF_TYPECHANGED d’être défini dans l’en-tête de flux. Cela implique que l’en-tête de flux n’est pas de longueur étendue, même si une taille d’en-tête étendue a été indiquée. En outre, il se peut qu’il n’y ait 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. |
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Universel |
d’en-tête | ks.h (include Ks.h) |
bibliothèque | Ks.lib |