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


функция обратного вызова DXGKDDI_GETDISPLAYSTATEINTRUSIVE (dispmprt.h)

Операционная система (ОС) вызывает подпрограмму DxgkDdiGetDisplayStateNonIntrusive драйвера минипорта дисплея для сбора сведений о состоянии отображения от драйвера.

Синтаксис

DXGKDDI_GETDISPLAYSTATEINTRUSIVE DxgkddiGetdisplaystateintrusive;

NTSTATUS DxgkddiGetdisplaystateintrusive(
  [in]     HANDLE Context,
  [in/out] PDXGKARG_GETDISPLAYSTATEINTRUSIVE pArgs
)
{...}

Параметры

[in] Context

Указатель на частный контекст, возвращенный DxgkDdiQueryInterface.

[in/out] pArgs

Указатель на структуру DXGKARG_GETDISPLAYSTATEINTRUSIVE .

Возвращаемое значение

DxgkDdiGetDisplayStateIntrusive возвращает STATUS_SUCCESS в случае успешного выполнения. В противном случае возвращается код ошибки, например один из следующих.

Код ошибки Значение
STATUS_DRIVER_INTERNAL_ERROR В драйвере произошла общая ошибка программного обеспечения.
STATUS_ACCESS_DENIED Оборудование в настоящее время используется другими потоками, и этот DDI не может получить доступ к нему.
STATUS_DEVICE_HARDWARE_ERROR Произошла общая ошибка HW.
STATUS_DEVICE_POWERED_OFF Устройство отключено.

Комментарии

ОС вызывает DxgkDdiGetDisplayStateIntrusive для сбора сведений о состоянии отображения от драйвера, когда пользователь уже находится в плохом состоянии. В отличие от DxgkDdiGetDisplayStateNonIntrusive, подпрограмма DxgkDdiGetDisplayStateIntrusive драйвера может выполнять более навязчивые операции, которые имеют видимые побочные эффекты для пользователя . Интрузивная операция определяется следующим образом (неинтрузивные операции не имеют ни одного из этих свойств):

  • Это вызывает побочные эффекты (сбои), которые видны пользователю (например, временное прекращение сканирования и разрушительное подключение монитора проверка).

  • Она работает медленно и влияет на производительность системы или дисплея при частом вызове (несколько раз в секунду).

  • Он прямо или косвенно изменяет состояние подсистемы отображения (или любой другой подсистемы).

Драйвер не должен намеренно изменять состояние системы при сборе данных.

Операционная система будет вызывать эту подпрограмму гораздо реже по сравнению с вызовами DxgkDdiGetDisplayStateNonIntrusive. В большинстве сценариев ошибок ОС сначала вызывает DxgkDdiGetDisplayStateNonIntrusive , а затем вызывает DxgkDdiGetDisplayStateIntrusive , чтобы убедиться, что любой непреднамеренный эффект навязчивого вызова не влияет на сбор неинтрузивных данных.

DXGKRNL вызовет эту подпрограмму с параметром NumOfTargets , равным количеству целевых объектов, на которых ОС сообщает о наличии монитора, подключенного к соответствующему заполнению VidPnTargetId . Если драйвер считает, что на заданном целевом объекте нет подключенного монитора, он должен задать значение ReturnSubStatus для этого целевого объекта, чтобы он был DXGK_DIAG_GETDISPLAYSTATE_MONITOR_NOT_CONNECTED.

Примечание

Если драйвер при сборе сведений завершается ошибкой в заданном объекте vidpntarget, он должен использовать ReturnSubStatus , чтобы задать состояние ошибки и перейти к следующему vidpntarget и не завершать общий вызов, если только не произошел сбой всех путей. В идеале драйверы должны записывать ошибки, возникающие во время этого вызова, в некоторых внутренних журналах ошибок, чтобы при вызове ОС DxgkDdiCollectDiagnosticInfo для сбора сведений о черном ящике эти ошибки записывались как часть внутренней коллекции журналов, чтобы помочь в отладке IHV.

Ос будет иметь достаточно времени ожидания (около 5 секунд) для завершения DxgkDdiGetDisplayStateIntrusive , что дает драйверу больше времени для сбора всех соответствующих состояний. После истечения времени ожидания ОС может проверять компьютер и собирать дамп, если драйвер зависает в этом вызове, поэтому мини-порт должен пытаться всегда выполнять этот вызов в течение интервала времени.

Уровень синхронизации для этого DDI — синхронизация нулевого уровня.

Требования

Требование Значение
Минимальная версия клиента Windows 10 версии 2004
Верхняя часть dispmprt.h

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

DXGKARG_GETDISPLAYSTATEINTRUSIVE

DxgkDdiCollectDiagnosticInfo

DxgkDdiGetDisplayStateNonIntrusive

DxgkDdiQueryInterface