функция обратного вызова DXGKDDI_NOTIFY_SURPRISE_REMOVAL (dispmprt.h)
DXGKDDI_NOTIFY_SURPRISE_REMOVAL вызывается операционной системой, когда пользователь отключает внешнее устройство отображения без уведомления системы.
Синтаксис
DXGKDDI_NOTIFY_SURPRISE_REMOVAL DxgkddiNotifySurpriseRemoval;
NTSTATUS DxgkddiNotifySurpriseRemoval(
[in] PVOID MiniportDeviceContext,
[in] DXGK_SURPRISE_REMOVAL_TYPE RemovalType
)
{...}
Параметры
[in] MiniportDeviceContext
Дескриптор для блока контекста, связанного с видеоадаптером. Функция DxgkDdiAddDevice драйвера мини-порта дисплея ранее предоставляла этот дескриптор подсистеме графического ядра DirectX.
[in] RemovalType
Значение типа DXGK_SURPRISE_REMOVAL_TYPE , определяющее тип события неожиданного удаления.
Возвращаемое значение
Возвращает STATUS_SUCCESS , если программные ресурсы были очищены для функции RemovalType = DxgkRemovalHibernation. Если вместо этого драйвер возвращает код ошибки, операционная система попытается перезагрузить систему, как описано в следующем разделе Примечаний.
Комментарии
При необходимости этот обратный вызов может быть реализован с помощью модели windows Display Driver Model (WDDM) 1.2 и более поздних версий.
Примечание
Операционная система вызывает DxgkDdiNotifySurpriseRemoval , только если драйвер мини-порта дисплея указывает на поддержку, задав элементу SupportSurpriseRemovalInHibernation структуры DXGK_DRIVERCAPS значение 1.
Когда ОПЕРАЦИОННая система обнаруживает неожиданное удаление, она уведомляет драйвер как можно быстрее. DxgkDdiNotifySurpriseRemoval — это функция DDI нулевого уровня , что означает, что ее можно вызывать, когда драйвер имеет ожидающую рабочую нагрузку GPU и (или) выполняется в других функциях DDI. Так как вызов этой функции указывает, что графическое оборудование было физически удалено или исчезло из системы, любая дальнейшая попытка получить доступ к оборудованию может вызвать проблемы, такие как жесткий зависание.
Операционная система классифицирует неожиданное удаление следующим образом:
Неожиданное удаление происходит, когда система и графическое устройство находятся в состоянии с низким энергопотреблением, например в спящем режиме или гибернации. Когда ОС возобновляет работу из состояния низкого энергопотребления, она обнаруживает это неожиданное удаление и немедленно вызывает обратный вызов DxgkDdiNotifySurpriseRemoval драйвера с RemovalType = DxgkRemovalHibernation. В этом случае, скорее всего, не будет ожидающих работы GPU или вызовов DDI, поэтому они должны быть относительно безопасными и простыми для драйвера. Сведения о состоянии возврата приведены ниже.
- Ос ожидает, что драйвер правильно обрабатывает вызов DxgkDdiNotifySurpriseRemoval и возвращает STATUS_SUCCESS.
- Если удаленное графическое устройство является самотестировщиком (POST), ос будет пытаться корректно перезагрузить систему независимо от возвращаемого состояния.
- Для устройства, отличного от POST, если драйвер не выполняет вызов и поддерживает только SupportSurpriseRemovalInHibernation в своем DXGK_DRIVERCAPS, ос будет корректно перезагружать систему. Если она поддерживает SupportSurpriseRemoval в DXGK_DRIVERCAPS, ОПЕРАЦИОННая система проигнорирует состояние возврата и продолжит останавливать графическое устройство. Дополнительные примечания о возврате см. ниже.
Графическое устройство неожиданно удаляется или отключается, когда оно все еще работает. Когда ОС обнаруживает этот тип неожиданного удаления, она немедленно вызывает обратный вызов DxgkDdiNotifySurpriseRemoval драйвера с removalType = DxgkRemovalPnPNotify. В этом случае все еще могут выполняться некоторые ожидающие работы GPU или вызовы DDI. Когда драйвер получает это уведомление и может справиться с этим неожиданным удалением, драйвер должен немедленно пометить это устройство как неожиданное удаление в собственном контексте устройства, чтобы избежать доступа к оборудованию, а затем вернуть STATUS_SUCCESS обратно в ОС. ОС продолжит вызывать другие функции DDI для очистки ресурсов и остановки графического устройства. Как отмечалось ниже, драйвер должен освобождать или очищать только программные ресурсы и не должен касаться оборудования в этих вызовах DDI или получать доступ к ним. Если драйвер не может справиться с этим неожиданным удалением, он должен вернуть в ОС правильный сбой. При любом сбое ОПЕРАЦИОННая система немедленно проверит ошибку, чтобы избежать дальнейшего повреждения оборудования или данных.
Если драйвер мини-порта дисплея возвращает STATUS_SUCCESS, подсистема ядра графики DirectX продолжит удалять внешний видеоадаптер из графического стека и будет вызывать другие функции dxgkDdiXxx в режиме ядра, чтобы освободить все ресурсы. В этом случае драйвер должен завершить очистку программных ресурсов в ответ на вызовы из операционной системы, но не должен касаться или очищать какие-либо параметры оборудования. Если драйвер не используется другим оборудованием, операционная система выгрузит драйвер.
Если драйвер возвращает код ошибки, не задает DXGK_DRIVERCAPS. SupportSurpriseRemovalInHibernation, или не реализует эту функцию, подсистема графического ядра DirectX больше не будет вызывать функции DxgkDdiXxx , реализованные драйвером, и попытается перезагрузить систему. В этом случае ресурс, выделенный до отключения внешнего устройства отображения, не будет освобожден.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8 |
Минимальная версия сервера | Windows Server 2012 |
Целевая платформа | Персональный компьютер |
Верхняя часть | dispmprt.h |
IRQL | PASSIVE_LEVEL |