IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)
O driver de uma VF (função virtual) PCI Express (PCIe) emite o IOCTL_VPCI_INVALIDATE_BLOCK solicitação IOCTL para ser notificado sobre alterações nos dados em um ou mais blocos de configuração de VF. O driver é notificado sobre essas alterações quando o IOCTL é concluído. Depois de notificado, o driver deve assumir que todos os dados lidos anteriormente dos blocos de configuração de VF especificados se tornaram inválidos. Portanto, o driver deve atualizar seu cache lendo os dados do bloco de configuração novamente.
O driver emite esse IOCTL para o próximo driver inferior na pilha de driver.
- Preparando uma estrutura de pacotes de solicitação de E/S
- Preparando uma estrutura de localização de pilha de E/S
- Emitindo a solicitação IOCTL
- Resultados da conclusão da solicitação IOCTL
Código principal
Bloco de status
Irp-IoStatus.Status> será definido como STATUS_SUCCESS se a solicitação for bem-sucedida.
Caso contrário, Status para a condição de erro apropriada como um código NTSTATUS.
Para obter mais informações, consulte [Valores XREF-LINK:NTSTATUS].
Comentários
Preparando uma estrutura de pacotes de solicitação de E/S
O driver deve primeiro alocar ou reutilizar um IRP (pacote de solicitação de E/S). Você pode usar a rotina IoBuildDeviceIoControlRequest para alocar especificamente um IRP IOCTL. Você também pode usar rotinas de criação e inicialização de IRP de uso geral, como IoAllocateIrp, IoReuseIrp ou IoInitializeIrp. Para obter mais informações sobre alocação de IRP, consulte Criando IRPs para drivers de Lower-Level.Em seguida, o driver deve definir os membros da estrutura IRP , conforme descrito na tabela a seguir.
Membro IRP | Valor |
---|---|
UserBuffer | NULL |
UserEvent |
O endereço do objeto de evento que foi inicializado na chamada para a rotina KeInitializeEvent . Nota Se a conclusão assíncrona da solicitação IOCTL não for necessária, esse membro deverá ser definido como NULL. Para obter mais informações, consulte Criando solicitações IOCTL em drivers.
|
UserIosb | O endereço de uma estrutura de IO_STATUS_BLOCK alocada pelo chamador. Essa estrutura é atualizada pelo driver inferior para indicar o status final da solicitação de E/S. |
Preparando uma estrutura de localização de pilha de E/S
O driver chama a rotina IoGetNextIrpStackLocation para acessar o local de pilha de E/S do driver inferior. Essa função retorna um ponteiro para uma estrutura IO_STACK_LOCATION que contém os parâmetros para o local da pilha de E/S.Em seguida, o driver deve definir os membros na estrutura IO_STACK_LOCATION , conforme descrito na tabela a seguir.
membro IO_STACK_LOCATION | Valor |
---|---|
MajorFunction | |
Parâmetros. DeviceIoControl. Iocontrolcode | |
Parâmetros. DeviceIoControl. Type3InputBuffer | Um ponteiro para uma estrutura de VPCI_INVALIDATE_BLOCK_OUTPUT . O driver formata essa estrutura com os parâmetros para a solicitação de E/ S IOCTL_VPCI_INVALIDATE_BLOCK . |
Parâmetros I. DeviceIoControl. InputBufferLength | O tamanho, em bytes, da estrutura VPCI_INVALIDATE_BLOCK_OUTPUT . |
Parâmetros. DeviceIoControl. OutputBufferLength |
O tamanho, em bytes, do buffer alocado pelo chamador que conterá os dados de configuração a serem lidos. Nota Esse valor deve ser o mesmo que o valor do membro BytesRequested da estrutura VPCI_INVALIDATE_BLOCK_OUTPUT .
|
Emitindo a solicitação IOCTL
Para emitir essa solicitação IOCTL, o driver chama a rotina IoCallDriver para passar a solicitação para o driver mais baixo na pilha do driver. O driver define os parâmetros de IoCallDriver conforme descrito na tabela a seguir.Parâmetro IoCallDriver | Valor |
---|---|
DeviceObject | O objeto do dispositivo do driver inferior. |
Irp | O endereço do IRP que foi alocado e inicializado anteriormente. Para obter mais informações, consulte Preparando uma estrutura de pacotes de solicitação de E/S. |
Resultados da conclusão da solicitação IOCTL
Quando o IOCTL_VPCI_INVALIDATE_BLOCK solicitação IOCTL é concluído, os membros da estrutura de IO_STATUS_BLOCK alocada pelo chamador são definidos como os valores na tabela a seguir.
Valor de status | Valor |
---|---|
Status | STATUS_SUCCESS |
Informações | Zero |
Quando o IOCTL_VPCI_INVALIDATE_BLOCK IOCTL é emitido e concluído, o driver VF é notificado de que o driver PF alterou (invalidado) dados em um ou mais blocos de configuração de VF.
- O driver VF, que é executado no sistema operacional convidado. Esse sistema operacional é executado em uma partição filho do Hyper-V.
-
O driver PF, que é executado no sistema operacional de gerenciamento.
Esse sistema operacional é executado dentro da partição pai do Hyper-V.
- No sistema operacional convidado, o NDIS emite uma solicitação de IOCTL_VPCI_INVALIDATE_BLOCK .
-
No sistema operacional de gerenciamento, as seguintes etapas ocorrem:
- O driver de miniporto PF chama a função NdisMInvalidateConfigBlock para notificar o NDIS de que os dados de configuração do VF foram alterados e não são mais válidos. O driver define o parâmetro BlockMask como uma máscara de bits ULONGLONG que especifica quais blocos de configuração de VF foram alterados. Cada bit na máscara de bits corresponde a um bloco de configuração de VF. Se um bit for definido como um, os dados no bloco de configuração de VF correspondente serão alterados.
-
O NDIS sinaliza a pilha de virtualização, que é executada no sistema operacional de gerenciamento, sobre a alteração nos dados do bloco de configuração do VF. A pilha de virtualização armazena em cache os dados do parâmetro BlockMask .
Nota Sempre que o driver de miniporto PF chama NdisMInvalidateConfigBlock, a pilha de virtualização OUé os dados do parâmetro BlockMask com o valor atual em seu cache.
- A pilha de virtualização notifica o driver VPCI (PCI virtual), que é executado no sistema operacional convidado, sobre a invalidação dos dados de configuração do VF. A pilha de virtualização envia os dados do parâmetro BlockMask armazenados em cache para o driver VPCI.
-
No SO convidado, as seguintes etapas ocorrem:
- O driver VPCI salva os dados de parâmetro BlockMask armazenados em cache no membro BlockMask da estrutura VPCI_INVALIDATE_BLOCK_OUTPUT associada à solicitação IOCTL_VPCI_INVALIDATE_BLOCK .
-
O driver VPCI conclui com êxito a solicitação de IOCTL_VPCI_INVALIDATE_BLOCK . Quando isso acontece, o NDIS emite uma solicitação de OID (identificador de objeto) de OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK para o driver de miniporta VF. Um ponteiro para uma estrutura de NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO é passado na solicitação OID. Essa estrutura contém os dados de parâmetro BlockMask armazenados em cache.
O NDIS também emite outra solicitação IOCTL_VPCI_INVALIDATE_BLOCK para lidar com notificações sucessivas de alterações nos dados de configuração do VF.
- Quando o driver VF lida com a solicitação de OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK , ele lê dados dos blocos de configuração de VF especificados.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Com suporte em Windows Server 2012 e versões posteriores do Windows. |
Cabeçalho | vpci.h (inclua Wdm.h) |
IRQL | DISPATCH_LEVEL |
Confira também
IRP_MJ_INTERNAL_DEVICE_CONTROL
Criando solicitações IOCTL em drivers
OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO