DXGKDDI_NOTIFY_SURPRISE_REMOVAL funzione di callback (dispmprt.h)
DXGKDDI_NOTIFY_SURPRISE_REMOVAL viene chiamato dal sistema operativo quando un utente disconnette un dispositivo di visualizzazione esterno senza notificare al sistema.
Sintassi
DXGKDDI_NOTIFY_SURPRISE_REMOVAL DxgkddiNotifySurpriseRemoval;
NTSTATUS DxgkddiNotifySurpriseRemoval(
[in] PVOID MiniportDeviceContext,
[in] DXGK_SURPRISE_REMOVAL_TYPE RemovalType
)
{...}
Parametri
[in] MiniportDeviceContext
Handle a un blocco di contesto associato a una scheda di visualizzazione. La funzione DxgkDdiAddDevice del driver di visualizzazione ha fornito in precedenza questo handle al sottosistema del kernel della grafica DirectX.
[in] RemovalType
Valore di tipo DXGK_SURPRISE_REMOVAL_TYPE che identifica il tipo di evento di rimozione delle sorprese.
Valore restituito
Restituisce STATUS_SUCCESS se le risorse software sono state pulite per RemoveType = DxgkRemovalHibernation. Se il driver restituisce invece un codice di errore, il sistema operativo tenterà di riavviare il sistema, come descritto nella sezione Osservazioni seguenti.
Commenti
Questo callback può essere implementato facoltativamente da Windows Display Driver Model (WDDM) 1.2 e versioni successive visualizzano i driver miniport.
Nota
Il sistema operativo chiama DxgkDdiNotifySurpriseRemoval solo se il driver miniport visualizzato indica il supporto impostando il membro SupportSurpriseRemovalInHibernation della struttura DXGK_DRIVERCAPS su 1.
Quando il sistema operativo rileva una rimozione sorpresa, notifica il driver il più rapidamente possibile. DxgkDdiNotifySurpriseRemoval è una funzione DDI di livello zero , il che significa che può essere chiamato quando un driver ha carico di lavoro GPU in sospeso e/o è in esecuzione all'interno di altre funzioni DDI. Poiché una chiamata a questa funzione indica che l'hardware grafico è stato rimosso fisicamente o è scomparso dal sistema, qualsiasi ulteriore tentativo di accesso all'hardware potrebbe causare problemi come un blocco rigido.
Il sistema operativo classifica la rimozione delle sorprese come indicato di seguito:
La rimozione delle sorprese si verifica quando il sistema e il dispositivo grafico si trovano in uno stato di bassa potenza, ad esempio sospensione o ibernazione. Quando il sistema operativo riprende dallo stato a bassa potenza, rileva questa rimozione sorpresa e chiama immediatamente il callback dxgkDdiNotifySurpriseRemoval con RemoveType = DxgkRemovalHibernation. Probabilmente non ci saranno chiamate GPU in sospeso o DDI in questo caso, quindi dovrebbe essere relativamente sicuro e facile per il driver da gestire. I dettagli sullo stato restituiti sono i seguenti:
- Il sistema operativo prevede che il driver gestisca correttamente la chiamata DxgkDdiNotifySurpriseRemoval e restituisca STATUS_SUCCESS.
- Se il dispositivo grafico rimosso è il dispositivo auto-test (POST), il sistema operativo tenterà di riavviare il sistema in modo normale indipendentemente dallo stato restituito.
- Per un dispositivo non POST, se il driver ha esito negativo la chiamata e supporta solo SupportSurpriseRemovalInHibernation nel relativo DXGK_DRIVERCAPS, il sistema operativo riavvia correttamente il sistema. Se supporta SupportSurpriseRemoval in DXGK_DRIVERCAPS, il sistema operativo ignora lo stato restituito e continua a arrestare il dispositivo grafico. Vedere note restituite aggiuntive di seguito.
Il dispositivo grafico è sorpreso rimosso/scollegato quando è ancora in esecuzione. Quando il sistema operativo rileva questo tipo di rimozione sorpresa, chiama immediatamente il callback dxgkDdiNotifySurpriseRemoval con RemoveType = DxgkRemovalPnPNotify. In questo caso potrebbero essere presenti ancora alcune chiamate GPU in sospeso o DDI da completare. Quando il driver riceve questa notifica e può gestire questa rimozione delle sorprese, il driver deve contrassegnare immediatamente questo dispositivo come rimozione sorpresa nel proprio contesto del dispositivo per evitare l'accesso hardware e quindi restituire STATUS_SUCCESS tornare al sistema operativo. Il sistema operativo continuerà a chiamare altre funzioni DDI per pulire le risorse e arrestare il dispositivo grafico. Come indicato di seguito, il driver deve rilasciare o pulire solo le risorse software e non deve toccare o accedere a qualsiasi hardware in queste chiamate DDI. Se il driver non riesce a gestire questa rimozione sorpresa, dovrebbe restituire un errore appropriato al sistema operativo. Per eventuali errori, il sistema operativo controlla immediatamente il sistema per evitare ulteriori danni hardware o dati.
Se il driver miniport visualizzato restituisce STATUS_SUCCESS, il sottosistema kernel della grafica DirectX continuerà a rimuovere la scheda di visualizzazione esterna dallo stack di grafica e chiamerà altre funzioni dxgkDdiXxx implementate dal driver per rilasciare tutte le risorse. In questo caso, il driver deve completare la pulizia delle risorse software in risposta alle chiamate dal sistema operativo, ma non deve toccare o pulire alcuna impostazione hardware. Se nessun altro hardware usa il driver, il sistema operativo scarica il driver.
Se il driver restituisce un codice di errore, non imposta DXGK_DRIVERCAPS. SupportSurpriseRemovalInHibernation o non implementa questa funzione, il sottosistema del kernel della grafica DirectX non chiamerà più funzioni DxgkDdiXxx implementate dal driver e tenterà di riavviare il sistema. In questo caso, la risorsa allocata prima della disconnessione del dispositivo di visualizzazione esterno non verrà rilasciata.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 8 |
Server minimo supportato | Windows Server 2012 |
Piattaforma di destinazione | Desktop |
Intestazione | dispmprt.h |
IRQL | PASSIVE_LEVEL |