Поделиться через


функция обратного вызова 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

См. также раздел

D3DKMT_WDDM_1_2_CAPS

DXGK_DRIVERCAPS

DXGK_SURPRISE_REMOVAL_TYPE

DxgkDdiAddDevice