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


функция обратного вызова 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, если ресурсы программного обеспечения были удалены для удаления Type = DxgkRemovalHibernation. Если драйвер возвращает код ошибки, операционная система попытается перезагрузить систему, как описано в следующем разделе примечания.

Замечания

Этот обратный вызов может быть реализован моделью драйвера Windows (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