IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)
Il driver per una funzione virtuale PCI Express (PCIe) rilascia la richiesta IOCTL_VPCI_INVALIDATE_BLOCK IOCTL per ricevere una notifica delle modifiche ai dati in uno o più blocchi di configurazione VF. Il driver riceve una notifica di queste modifiche al completamento dell'IOCTL. Dopo la notifica, il driver deve presupporre che tutti i dati letti in precedenza dai blocchi di configurazione VF specificati non siano validi. Di conseguenza, il driver deve aggiornare la cache leggendo nuovamente i dati del blocco di configurazione.
Il driver rilascia questo IOCTL al driver inferiore successivo nello stack di driver.
- Preparazione di una struttura di pacchetti di richiesta di I/O
- Preparazione di una struttura di posizione dello stack di I/O
- Emissione della richiesta IOCTL
- Risultati del completamento della richiesta IOCTL
Codice principale
Blocco dello stato
Irp-IoStatus.Status> è impostato su STATUS_SUCCESS se la richiesta ha esito positivo.
In caso contrario, stato alla condizione di errore appropriata come codice NTSTATUS.
Per altre informazioni, vedere [XREF-LINK:NTSTATUS Values].
Commenti
Preparazione di una struttura di pacchetti di richiesta di I/O
Il driver deve prima allocare o riutilizzare un pacchetto di richiesta di I/O . È possibile usare la routine IoBuildDeviceIoControlRequest per allocare in modo specifico un IOCTL IRP. È anche possibile usare routine di creazione e inizializzazione di IRP per utilizzo generico, ad esempio IoAllocateIrp, IoReuseIrp o IoInitializeIrp. Per altre informazioni sull'allocazione di IRP, vedere Creazione di provider di integrazione per i driver Lower-Level.Il driver deve quindi impostare i membri della struttura IRP come descritto nella tabella seguente.
Membro IRP | Valore |
---|---|
UserBuffer | NULL |
UserEvent |
Indirizzo dell'oggetto evento inizializzato nella chiamata alla routine KeInitializeEvent . Nota Se il completamento asincrono della richiesta IOCTL non è obbligatorio, questo membro deve essere impostato su NULL. Per altre informazioni, vedere Creazione di richieste IOCTL nei driver.
|
UserIosb | Indirizzo di una struttura di IO_STATUS_BLOCK allocata dal chiamante. Questa struttura viene aggiornata dal driver inferiore per indicare lo stato finale della richiesta di I/O. |
Preparazione di una struttura di posizione dello stack di I/O
Il driver chiama la routine IoGetNextIrpStackLocation per accedere alla posizione dello stack I/O del driver inferiore. Questa funzione restituisce un puntatore a una struttura IO_STACK_LOCATION che contiene i parametri per la posizione dello stack di I/O.Il driver deve quindi impostare i membri nella struttura IO_STACK_LOCATION come descritto nella tabella seguente.
membro IO_STACK_LOCATION | Valore |
---|---|
MajorFunction | |
Parametri. DeviceIoControl. IoControlCode | |
Parametri. DeviceIoControl. Type3InputBuffer | Puntatore a una struttura VPCI_INVALIDATE_BLOCK_OUTPUT . Il driver formatta questa struttura con i parametri per la richiesta di I /O IOCTL_VPCI_INVALIDATE_BLOCK. |
Parametri I. DeviceIoControl. InputBufferLength | Dimensione, in byte, della struttura VPCI_INVALIDATE_BLOCK_OUTPUT . |
Parametri. DeviceIoControl. OutputBufferLength |
Dimensioni, in byte, del buffer allocato dal chiamante che conterrà i dati di configurazione da leggere. Nota Questo valore deve essere uguale al valore del membro BytesRequested della struttura VPCI_INVALIDATE_BLOCK_OUTPUT .
|
Emissione della richiesta IOCTL
Per eseguire questa richiesta IOCTL, il driver chiama la routine IoCallDriver per passare la richiesta al driver inferiore successivo nello stack di driver. Il driver imposta i parametri di IoCallDriver come descritto nella tabella seguente.Parametro IoCallDriver | Valore |
---|---|
DeviceObject | Oggetto dispositivo del driver inferiore. |
Irp | Indirizzo dell'IRP allocato e inizializzato in precedenza. Per altre informazioni, vedere Preparazione di una struttura di pacchetti di richiesta di I/O. |
Risultati del completamento della richiesta IOCTL
Al termine della richiesta IOCTL IOCTL_VPCI_INVALIDATE_BLOCK , i membri della struttura IO_STATUS_BLOCK allocata dal chiamante vengono impostati sui valori della tabella seguente.
Valore di stato | Valore |
---|---|
Status | STATUS_SUCCESS |
Informazioni | Zero |
Quando il IOCTL_VPCI_INVALIDATE_BLOCK IOCTL viene rilasciato e completato, il driver VF riceve una notifica che indica che il driver PF è stato modificato (invalidato) dati in uno o più blocchi di configurazione VF.
- Driver VF, che viene eseguito nel sistema operativo guest. Questo sistema operativo viene eseguito all'interno di una partizione figlio Hyper-V.
-
Driver PF, che viene eseguito nel sistema operativo di gestione.
Questo sistema operativo viene eseguito all'interno della partizione padre hyper-V.
- Nel sistema operativo guest NDIS invia una richiesta di IOCTL_VPCI_INVALIDATE_BLOCK .
-
Nel sistema operativo di gestione vengono eseguiti i passaggi seguenti:
- Il driver miniport PF chiama la funzione NdisMInvalidateConfigBlock per notificare a NDIS che i dati di configurazione VF sono stati modificati e non sono più validi. Il driver imposta il parametro BlockMask su una maschera di bit ULONGLONG che specifica quali blocchi di configurazione VF sono stati modificati. Ogni bit nella maschera di bit corrisponde a un blocco di configurazione VF. Se un bit è impostato su uno, i dati nel blocco di configurazione VF corrispondente sono stati modificati.
-
NDIS segnala lo stack di virtualizzazione, che viene eseguito nel sistema operativo di gestione, sulla modifica nei dati del blocco di configurazione VF. Lo stack di virtualizzazione memorizza nella cache i dati dei parametri BlockMask .
Nota Ogni volta che il driver miniport PF chiama NdisMInvalidateConfigBlock, lo stack di virtualizzazione Oi dati del parametro BlockMask con il valore corrente nella cache.
- Lo stack di virtualizzazione invia una notifica al driver PCI virtuale (VPCI), che viene eseguito nel sistema operativo guest, sull'invalidazione dei dati di configurazione VF. Lo stack di virtualizzazione invia i dati dei parametri BlockMask memorizzati nella cache al driver VPCI.
-
Nel sistema operativo guest vengono eseguiti i passaggi seguenti:
- Il driver VPCI salva i dati dei parametri BlockMask memorizzati nella cache nel membro BlockMask della struttura VPCI_INVALIDATE_BLOCK_OUTPUT associata alla richiesta di IOCTL_VPCI_INVALIDATE_BLOCK .
-
Il driver VPCI completa correttamente la richiesta di IOCTL_VPCI_INVALIDATE_BLOCK . In questo caso, NDIS genera una richiesta OID (Object Identifier) di OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK al driver miniport VF. Un puntatore a una struttura NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO viene passato lungo la richiesta OID. Questa struttura contiene i dati dei parametri BlockMask memorizzati nella cache.
NDIS genera anche un'altra richiesta di IOCTL_VPCI_INVALIDATE_BLOCK per gestire le notifiche successive delle modifiche ai dati di configurazione VF.
- Quando il driver VF gestisce la richiesta di OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK , legge i dati dai blocchi di configurazione VF specificati.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Supportato in Windows Server 2012 e versioni successive di Windows. |
Intestazione | vpci.h (include Wdm.h) |
IRQL | DISPATCH_LEVEL |
Vedi anche
IRP_MJ_INTERNAL_DEVICE_CONTROL
Creazione di richieste IOCTL nei driver
OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO