IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)
Le pilote d’une fonction virtuelle PCI Express (PCIe) émet la IOCTL_VPCI_INVALIDATE_BLOCK requête IOCTL afin d’être informé des modifications apportées aux données dans un ou plusieurs blocs de configuration VF. Le conducteur est informé de ces modifications lorsque le IOCTL est terminé. Une fois averti, le pilote doit supposer que toutes les données lues précédemment à partir des blocs de configuration VF spécifiés sont devenues non valides. Par conséquent, le pilote doit mettre à jour son cache en lisant à nouveau les données du bloc de configuration.
Le pilote émet ce IOCTL au pilote inférieur suivant dans la pile des pilotes.
- Préparation d’une structure de paquets de demandes d’E/S
- Préparation d’une structure d’emplacement de pile d’E/S
- Émission de la demande IOCTL
- Résultats de l’achèvement de la demande IOCTL
Code principal
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 [XREF-LINK :NTSTATUS Values].
Remarques
Préparation d’une structure de paquets de demandes d’E/S
Le pilote doit d’abord allouer ou réutiliser un paquet de demande d’E/S (IRP). Vous pouvez utiliser la routine IoBuildDeviceIoControlRequest pour allouer spécifiquement un IRP IOCTL. Vous pouvez également utiliser des routines de création et d’initialisation IRP à usage général, telles que IoAllocateIrp, IoReuseIrp ou IoInitializeIrp. Pour plus d’informations sur l’allocation IRP, consultez Création d’IRP pour les pilotes Lower-Level.Le pilote doit ensuite définir les membres de la structure IRP comme décrit dans le tableau suivant.
Membre IRP | Valeur |
---|---|
UserBuffer | NULL |
UserEvent |
Adresse de l’objet d’événement initialisé dans l’appel à la routine KeInitializeEvent . Note Si l’exécution asynchrone de la demande IOCTL n’est pas requise, ce membre doit être défini sur NULL. Pour plus d’informations, consultez Création de demandes IOCTL dans les pilotes.
|
UserIosb | Adresse d’une structure de IO_STATUS_BLOCK allouée à l’appelant . Cette structure est mise à jour par le pilote inférieur pour indiquer la status finale de la demande d’E/S. |
Préparation d’une structure d’emplacement de pile d’E/S
Le pilote appelle la routine IoGetNextIrpStackLocation pour accéder à l’emplacement de la pile d’E/S du pilote inférieur. Cette fonction retourne un pointeur vers une structure de IO_STACK_LOCATION qui contient les paramètres de l’emplacement de la pile d’E/S.Le pilote doit ensuite définir les membres dans la structure IO_STACK_LOCATION comme décrit dans le tableau suivant.
IO_STACK_LOCATION membre | Valeur |
---|---|
MajorFunction | |
Paramètres. DeviceIoControl. IoControlCode | |
Paramètres. DeviceIoControl. Type3InputBuffer | Pointeur vers une structure VPCI_INVALIDATE_BLOCK_OUTPUT . Le pilote met en forme cette structure avec les paramètres de la demande d’E /S IOCTL_VPCI_INVALIDATE_BLOCK. |
I Paramètres. DeviceIoControl. InputBufferLength | Taille, en octets, de la structure VPCI_INVALIDATE_BLOCK_OUTPUT . |
Paramètres. DeviceIoControl. OutputBufferLength |
Taille, en octets, de la mémoire tampon allouée à l’appelant qui contiendra les données de configuration à lire. Note Cette valeur doit être identique à la valeur du membre BytesRequested de la structure VPCI_INVALIDATE_BLOCK_OUTPUT .
|
Émission de la demande IOCTL
Pour émettre cette demande IOCTL, le pilote appelle la routine IoCallDriver pour transmettre la demande au pilote inférieur suivant dans la pile des pilotes. Le pilote définit les paramètres d’IoCallDriver comme décrit dans le tableau suivant.Paramètre IoCallDriver | Valeur |
---|---|
DeviceObject | Objet d’appareil du pilote inférieur. |
Irp | Adresse de l’IRP précédemment allouée et initialisée. Pour plus d’informations, consultez Préparation d’une structure de paquets de demandes d’E/S. |
Résultats de l’achèvement de la demande IOCTL
Une fois la demande IOCTL IOCTL_VPCI_INVALIDATE_BLOCK terminée, les membres de la structure de IO_STATUS_BLOCK allouées à l’appelant sont définis sur les valeurs du tableau suivant.
Valeur d’état | Valeur |
---|---|
Statut | STATUS_SUCCESS |
Information | Zéro |
Lorsque le IOCTL_VPCI_INVALIDATE_BLOCK IOCTL est émis et terminé, le pilote VF est averti que le pilote PF a modifié (invalidé) les données dans un ou plusieurs blocs de configuration VF.
- Pilote VF, qui s’exécute dans le système d’exploitation invité. Ce système d’exploitation s’exécute dans une partition enfant Hyper-V.
-
Pilote PF, qui s’exécute dans le système d’exploitation de gestion.
Ce système d’exploitation s’exécute dans la partition parente Hyper-V.
- Dans le système d’exploitation invité, NDIS émet une demande de IOCTL_VPCI_INVALIDATE_BLOCK .
-
Dans le système d’exploitation de gestion, les étapes suivantes se produisent :
- Le pilote pf miniport appelle la fonction NdisMInvalidateConfigBlock pour notifier NDIS que les données de configuration VF ont changé et ne sont plus valides. Le pilote définit le paramètre BlockMask sur un masque de bits ULONGLONG qui spécifie les blocs de configuration VF qui ont été modifiés. Chaque bit dans le masque de bits correspond à un bloc de configuration VF. Si un bit est défini sur un, les données du bloc de configuration VF correspondant ont changé.
-
NDIS signale à la pile de virtualisation, qui s’exécute dans le système d’exploitation de gestion, la modification des données de blocs de configuration VF. La pile de virtualisation met en cache les données du paramètre BlockMask .
Note Chaque fois que le pilote PF miniport appelle NdisMInvalidateConfigBlock, la pile de virtualisation OUles données du paramètre BlockMask avec la valeur actuelle dans son cache.
- La pile de virtualisation avertit le pilote PCI virtuel (VPCI), qui s’exécute dans le système d’exploitation invité, de l’invalidation des données de configuration VF. La pile de virtualisation envoie les données de paramètre BlockMask mises en cache au pilote VPCI.
-
Dans le système d’exploitation invité, les étapes suivantes se produisent :
- Le pilote VPCI enregistre les données de paramètre BlockMask mises en cache dans le membre BlockMask de la structure VPCI_INVALIDATE_BLOCK_OUTPUT associée à la requête IOCTL_VPCI_INVALIDATE_BLOCK .
-
Le pilote VPCI termine correctement la demande IOCTL_VPCI_INVALIDATE_BLOCK . Dans ce cas, NDIS émet une demande d’identificateur d’objet (OID) de OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK au pilote VF miniport. Un pointeur vers une structure NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO est transmis dans la requête OID. Cette structure contient les données de paramètre BlockMask mises en cache.
NDIS émet également une autre demande IOCTL_VPCI_INVALIDATE_BLOCK pour gérer les notifications successives des modifications apportées aux données de configuration VF.
- Lorsque le pilote VF gère la requête OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK , il lit les données des blocs de configuration VF spécifiés.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Pris en charge dans Windows Server 2012 et versions ultérieures de Windows. |
En-tête | vpci.h (include Wdm.h) |
IRQL | DISPATCH_LEVEL |
Voir aussi
IRP_MJ_INTERNAL_DEVICE_CONTROL
Création de requêtes IOCTL dans les pilotes
OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO