IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE IOCTL (nfpdev.h)
Le client envoie la demande de IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE au handle d’abonnement à plusieurs reprises afin de recevoir les messages abonnés à mesure qu’ils arrivent. En règle générale, ce IOCTL est suspendu dans le handle d’abonnement jusqu’à ce qu’un message correspondant au type abonné arrive réellement.
Code principal
Mémoire tampon d'entrée
None
Mémoire tampon de sortie
Une mémoire tampon valide est requise pour retourner les données de message à leur arrivée. Le premier DWORD de cette mémoire tampon est réservé pour un indicateur au client pour la prochaine taille de la mémoire tampon à retourner. Cette mémoire tampon est généralement initialement de 255 octets, mais le pilote peut demander au client d’envoyer une mémoire tampon plus importante en fournissant uniquement l’indicateur et en terminant le IOCTL avec STATUS_BUFFER_OVERFLOW.
Bloc d’état
Irp-IoStatus.Status> a la valeur STATUS_SUCCESS si la demande réussit.
Sinon, indiquez la condition d’erreur appropriée en tant que code NTSTATUS.
Pour plus d’informations, consultez Valeurs NTSTATUS.
Remarques
- Le client doit envoyer un autre IOCTL chaque fois que le délai suspendu est terminé. Le pilote DOIT utiliser les verrous appropriés pour garantir que le nombre de réussites de ce IOCTL équivaut au nombre de réceptions de messages réussies pour le type d’abonnement.
-
Les actions suivantes sont obligatoires lors de l’utilisation de ce IOCTL :
- Si ce IOCTL est reçu sur un handle qui n’a pas été ouvert auparavant dans l’espace de noms d’appareil « Subs\ », le pilote DOIT le terminer avec STATUS_INVALID_DEVICE_STATE.
- Le pilote doit conserver une file d’attente « Reçu » de messages reçus qui correspondent au type d’abonnement dans le handle de fichier d’abonnement.
-
Lorsque ce IOCTL est reçu dans le pilote :
- Si la file d’attente « Reçu » est vide, le pilote DOIT mettre fin à IOCTL pour une exécution ultérieure.
- Si la file d’attente « Reçu » n’est pas vide, le pilote DOIT mettre la file d’attente d’une mémoire tampon de message, copier la mémoire tampon de message dans la mémoire tampon de sortie du IOCTL et terminer la liste IOCTL avec STATUS_SUCCESS immédiatement.
- Si un message correspondant au type est reçu et qu’aucun IOCTL n’est actuellement suspendu, le pilote DOIT ajouter la mémoire tampon de message à la file d’attente « Reçu ».
- Si un message correspondant au type est reçu et qu’un IOCTL suspendu est disponible (la file d’attente « Reçu » est vide), le pilote DOIT copier la mémoire tampon de message dans la mémoire tampon de sortie du IOCTL et terminer l’IRP suspendu avec STATUS_SUCCESS. La file d’attente « Reçu » DOIT continuer à être vide après l’achèvement de l’IRP suspendu.
- Si le pilote termine cette IOCTL avec STATUS_SUCCESS, le premier DWORD [4 octets] de la mémoire tampon de sortie DOIT contenir un indicateur de la taille de la mémoire tampon client suivante et le champ Informations du IOCTL DOIT contenir la taille de ce message plus sizeof(DWORD) (4 octets).
- Si le IOCTL contient une mémoire tampon d’entrée, le pilote DOIT effectuer le IOCTL avec STATUS_INVALID_PARAMETER.
- Si un message reçu a une charge utile de longueur nulle, le pilote DOIT ignorer le message. Il s’agit d’une optimisation des performances, car Windows supprimera les messages avec des charges utiles de longueur nulle.
- Si un message reçu est trop volumineux pour être copié dans la mémoire tampon de ce IOCTL, le pilote DOIT copier la taille de mémoire tampon requise dans les 4 premiers octets de la mémoire tampon de sortie, définir le champ « Informations » du IOCTL sur sizeof (DWORD) (« 4 ») et compléter le iocTL avec STATUS_BUFFER_OVERFLOW. La mémoire tampon de message doit être laissée dans la file d’attente « Received ».
- Si ce IOCTL est reçu alors qu’un autre est actuellement suspendu dans le handle d’abonnement, le deuxième (ou une version ultérieure) doit être terminé avec STATUS_INVALID_DEVICE_STATE.
- Le pilote DOIT prendre en charge CancelIo du IOCTL suspendu.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 8 |
En-tête | nfpdev.h |
Voir aussi
Guide de conception globale de la communication en champ proche (NFC)