Compartilhar via


DXGKDDI_NOTIFY_SURPRISE_REMOVAL função de retorno de chamada (dispmprt.h)

DXGKDDI_NOTIFY_SURPRISE_REMOVAL é chamado pelo sistema operacional quando um usuário desconecta um dispositivo de exibição externo sem notificar o sistema.

Sintaxe

DXGKDDI_NOTIFY_SURPRISE_REMOVAL DxgkddiNotifySurpriseRemoval;

NTSTATUS DxgkddiNotifySurpriseRemoval(
  [in] PVOID MiniportDeviceContext,
  [in] DXGK_SURPRISE_REMOVAL_TYPE RemovalType
)
{...}

Parâmetros

[in] MiniportDeviceContext

Um identificador para um bloco de contexto associado a um adaptador de exibição. A função DxgkDdiAddDevice do driver de miniporto de exibição anteriormente forneceu esse identificador para o subsistema de kernel de elementos gráficos DirectX.

[in] RemovalType

Um valor do tipo DXGK_SURPRISE_REMOVAL_TYPE que identifica o tipo de evento de remoção surpresa.

Valor de retorno

Retorna STATUS_SUCCESS se os recursos de software foram limpos para RemovalType = DxgkRemovalHibernation. Se o driver retornar um código de erro, o sistema operacional tentará reinicializar o sistema, conforme descrito na seção Comentários a seguir.

Observações

Opcionalmente, esse retorno de chamada pode ser implementado pelo WDDM (Modelo de Driver de Exibição do Windows) 1.2 e, posteriormente, exibir drivers de miniporto.

Nota

O sistema operacional chama DxgkDdiNotifySurpriseRemoval somente se o driver de miniporto de exibição indicar suporte definindo o SupportSurpriseRemovalInHibernation membro da estrutura DXGK_DRIVERCAPS como 1.

Quando o sistema operacional detecta uma remoção surpresa, ele notifica o driver o mais rápido possível. DxgkDdiNotifySurpriseRemoval é uma função DDI de nível zero, o que significa que ela pode ser chamada quando um driver tem carga de trabalho de GPU pendente e/ou está em execução dentro de outras funções DDI. Como uma chamada para essa função indica que o hardware gráfico foi fisicamente removido ou desapareceu do sistema, qualquer outra tentativa de acessar o hardware pode causar problemas como um travamento rígido.

O sistema operacional categoriza a remoção surpresa da seguinte maneira:

  • A remoção surpresa ocorre quando o sistema e o dispositivo gráfico estão em um estado de baixa potência, como suspensão ou hibernação. Quando o sistema operacional é retomado do estado de baixa potência, ele detecta essa remoção surpresa e imediatamente chama o do driver DxgkDdiNotifySurpriseRemoval retorno de chamada com RemovalType = DxgkRemovalHibernation. Provavelmente não haverá nenhum trabalho de GPU pendente ou chamadas DDI nesse caso, portanto, deve ser relativamente seguro e fácil para o driver lidar. Os detalhes de status de retorno são os seguintes:

    • O sistema operacional espera que o driver manipule a chamada DxgkDdiNotifySurpriseRemoval corretamente e retorne STATUS_SUCCESS.
    • Se o dispositivo gráfico removido for o dispositivo POST (auto-teste de energia), o sistema operacional tentará reinicializar o sistema normalmente, independentemente do status retornado.
    • Para um dispositivo não POST, se o driver falhar na chamada e só oferecer suporte a SupportSurpriseRemovalInHibernation em seu DXGK_DRIVERCAPS, o sistema operacional reiniciará o sistema normalmente. Se ele der suporte a SupportSurpriseRemoval no DXGK_DRIVERCAPS, o sistema operacional ignorará o status de retorno e continuará interrompendo o dispositivo gráfico. Veja as notas adicionais de retorno abaixo.
  • O dispositivo gráfico é removido/desconectado quando ainda está em execução. Quando o sistema operacional detecta esse tipo de remoção surpresa, ele chama imediatamente o do driver DxgkDdiNotifySurpriseRemoval retorno de chamada com RemovalType = DxgkRemovalPnPNotify. Ainda pode haver algumas chamadas de DDI ou trabalho de GPU pendentes para serem concluídas nesse caso. Quando o driver recebe essa notificação e pode lidar com essa remoção surpresa, o driver deve marcar imediatamente esse dispositivo como remoção surpresa em seu próprio contexto de dispositivo para evitar qualquer acesso de hardware e, em seguida, retornar STATUS_SUCCESS de volta ao sistema operacional. O sistema operacional continuará chamando outras funções DDI para limpar os recursos e parar o dispositivo gráfico. Conforme observado abaixo, o driver só deve liberar ou limpar os recursos de software e não deve tocar ou acessar nenhum hardware nessas chamadas DDI. Se o driver não puder lidar com essa remoção surpresa, ele deverá retornar uma falha adequada ao sistema operacional. Para qualquer falha, o sistema operacional verificará o sistema imediatamente para evitar danos adicionais de hardware ou dados.

Se o driver de miniporto de exibição retornar STATUS_SUCCESS, o subsistema kernel de elementos gráficos DirectX continuará removendo o adaptador de exibição externo da pilha de elementos gráficos e chamará outros DxgkDdiXxx implementados pelo driver funções de modo kernel para liberar todos os recursos. Nesse caso, o driver deve concluir sua limpeza de recursos de software em resposta a chamadas do sistema operacional, mas não deve tocar ou limpar nenhuma configuração de hardware. Se nenhum outro hardware estiver usando o driver, o sistema operacional descarregará o driver.

Se o driver retornar um código de erro, não definirá DXGK_DRIVERCAPS.SupportSurpriseRemovalInHibernationou não implementa essa função, o subsistema de kernel de elementos gráficos DirectX não chamará mais funções de DxgkDdiXxx implementadas pelo driver e tentará reinicializar o sistema. Nesse caso, o recurso que foi alocado antes do dispositivo de exibição externo ser desconectado não será liberado.

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows 8
servidor com suporte mínimo Windows Server 2012
da Plataforma de Destino Área de trabalho
cabeçalho dispmprt.h
IRQL PASSIVE_LEVEL

Consulte também

D3DKMT_WDDM_1_2_CAPS

DXGK_DRIVERCAPS

DXGK_SURPRISE_REMOVAL_TYPE

DxgkDdiAddDevice