EVT_WDF_IO_IN_CALLER_CONTEXT fonction de rappel (wdfdevice.h)
[S’applique uniquement à KMDF]
La fonction de rappel d’événements EvtIoInCallerContext pilote prétraite une requête d’E/S avant que l’infrastructure le 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 vers un objet d’appareil framework.
[in] Request
Handle vers un objet de requête de framework.
Valeur de retour
Aucun
Remarques
L’infrastructure appelle la fonction de rappel EvtIoInCallerContext d’un pilote afin que le pilote puisse examiner chaque requête d’E/S et éventuellement effectuer un traitement préliminaire sur la demande, avant que l’infrastructure ne le 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 un EvtIoInCallerContext fonction de rappel pour un appareil, l’infrastructure appelle la fonction de rappel chaque fois qu’elle 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 requête d’E/S au pilote. Ce processus est soit le pilote de niveau supérieur suivant, soit, si le pilote se trouve en haut de la pile des pilotes, une application en mode utilisateur.
L’objectif principal de cette fonction de rappel est d’activer les pilotes basés sur le framework pour prendre en charge la méthode d’accès à la mémoire tampon appelée ni mise en mémoire tampon nidirectes d’E/S. 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’expéditeur.
Une fois que la fonction de rappel a obtenu les mémoires tampons d’une requête, elle peut stocker des adresses de mémoire tampon ou des handles 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 Framework-Based Pilotes.
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 en l’appelant WdfRequestComplete (si une erreur est détectée).
Pour plus d’informations sur la fonction de rappel EvtIoInCallerContext, consultez Intercepter une requête d’E/S avant qu’elle ne soit mise en file d’attente et accès aux mémoires tampons de données dans Framework-Based Pilotes.
Si un pilote a configuré une file d’attente d’E/S pour prendre en charge progression vers l’avant garantie, l’infrastructure peut ne pas appeler la evtIoInCallerContext fonction de rappel pendant des situations de mémoire faible. Si tous les objets de requête réservée 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 demande réservée soit disponible. Dans ce cas, le framework ne peut pas appeler la EvtIoInCallerContext fonction de rappel pour la demande d’E/S différée, car, lorsqu’un objet de demande réservée devient disponible, l’infrastructure ne s’exécute plus dans le contexte de thread du processus qui a envoyé la requête d’E/S au pilote.
La fonction de rappel EvtIoInCallerContext est appelée au niveau du runtime d’intégration du thread appelant. Si le thread appelant provient d’une application en mode utilisateur, la fonction de rappel est appelée à IRQL = PASSIVE_LEVEL. Si le thread appelant provient d’un pilote en mode noyau de niveau supérieur, la fonction de rappel evtIoInCallerContext evtIoInCallerContext peut être appelée à irQL <= DISPATCH_LEVEL si la fonction de rappel et le pilote de niveau supérieur sont conçus pour transmettre la requête au <IRQL = DISPATCH_LEVEL.
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Universel |
version minimale de KMDF | 1.0 |
d’en-tête | wdfdevice.h (include Wdf.h) |
IRQL | Voir la section Remarques. |