EVT_WDF_IO_IN_CALLER_CONTEXT fonction de rappel (wdfdevice.h)

[S’applique à KMDF uniquement]

La fonction de rappel d’événement EvtIoInCallerContext d’un pilote prétraite une demande d’E/S avant que l’infrastructure ne la place dans une file d’attente d’E/S.

Syntaxe

EVT_WDF_IO_IN_CALLER_CONTEXT EvtWdfIoInCallerContext;

void EvtWdfIoInCallerContext(
  [in] WDFDEVICE Device,
  [in] WDFREQUEST Request
)
{...}

Paramètres

[in] Device

Handle pour un objet d’appareil d’infrastructure.

[in] Request

Handle pour un objet de requête d’infrastructure.

Valeur de retour

None

Remarques

L’infrastructure appelle la fonction de rappel EvtIoInCallerContext d’un pilote afin que le pilote puisse examiner chaque demande d’E/S et éventuellement effectuer un traitement préliminaire sur la demande, avant que l’infrastructure ne la place dans une file d’attente d’E/S. Pour inscrire une fonction de rappel EvtIoInCallerContext pour un appareil, le pilote appelle WdfDeviceInitSetIoInCallerContextCallback.

Si un pilote inscrit une fonction de rappel EvtIoInCallerContext pour un appareil, l’infrastructure appelle la fonction de rappel chaque fois qu’il reçoit une demande d’E/S pour l’appareil. La fonction de rappel est appelée dans le contexte de thread du processus qui a envoyé la demande d’E/S au pilote. Ce processus est le pilote de niveau supérieur suivant ou, si le pilote se trouve en haut de la pile de pilotes, une application en mode utilisateur.

L’objectif principal de cette fonction de rappel est de permettre aux pilotes basés sur l’infrastructure de prendre en charge la méthode d’accès à la mémoire tampon qui n’est appelée ni e/S en mémoire tampon ni directe. Pour cette méthode d’accès à la mémoire tampon, le pilote doit accéder aux mémoires tampons reçues dans le contexte de processus de l’initiateur.

Une fois que la fonction de rappel a obtenu les mémoires tampons d’une requête, elle peut stocker les adresses ou les handles de mémoire tampon dans le stockage contextuel de l’objet de requête. (Le pilote définit la taille de la zone de stockage de contexte de l’objet de requête en appelant WdfDeviceInitSetRequestAttributes.)

Étant donné que la requête n’appartient pas encore à une file d’attente d’E/S, l’infrastructure ne verrouille pas ou ne synchronise pas la requête. Le pilote est responsable de toute synchronisation qui peut être nécessaire. Pour plus d’informations sur la synchronisation, consultez Techniques de synchronisation pour les pilotes Framework-Based.

Une fois que la fonction de rappel a terminé le prétraitement de la requête, elle doit soit la mettre en file d’attente en appelant WdfDeviceEnqueueRequest, soit la terminer en appelant WdfRequestComplete (si une erreur est détectée).

Pour plus d’informations sur la fonction de rappel EvtIoInCallerContext , consultez Interception d’une demande d’E/S avant qu’elle ne soit mise en file d’attente et Accès aux mémoires tampons de données dans les pilotes Framework-Based.

Si un pilote a configuré une file d’attente d’E/S pour prendre en charge la progression vers l’avant garantie, l’infrastructure peut ne pas appeler la fonction de rappel EvtIoInCallerContext du pilote dans les situations de mémoire insuffisante. Si tous les objets de requête réservés de l’infrastructure sont en cours d’utilisation, l’infrastructure reporte le traitement de la demande d’E/S jusqu’à ce qu’un objet de requête réservé soit disponible. Dans ce cas, l’infrastructure ne peut pas appeler la fonction de rappel EvtIoInCallerContext pour la demande d’E/S différée, car, lorsqu’un objet de requête réservé devient disponible, l’infrastructure ne s’exécute plus dans le contexte de thread du processus qui a envoyé la demande d’E/S au pilote.

La fonction de rappel EvtIoInCallerContext est appelée au niveau de l’IRQL du thread appelant. Si le thread appelant provient d’une application en mode utilisateur, la fonction de rappel est appelée à l’adresse IRQL = PASSIVE_LEVEL. Si le thread appelant provient d’un pilote de niveau supérieur en mode noyau, la fonction de rappel EvtIoInCallerContext de votre pilote peut être appelée à IRQL <= DISPATCH_LEVEL si la fonction de rappel et le pilote de niveau supérieur sont tous deux conçus pour transmettre la requête à IRQL <= DISPATCH_LEVEL.

Configuration requise

Condition requise Valeur
Plateforme cible Universal
Version KMDF minimale 1.0
En-tête wdfdevice.h (inclure Wdf.h)
IRQL Consultez la section Notes.

Voir aussi

EvtDeviceWdmIrpPreprocess