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

Функция DxgkCbEvalAcpiMethod оценивает указанный метод ACPI на видеоадаптере или на дочернем устройстве видеоадаптера.

Синтаксис

DXGKCB_EVAL_ACPI_METHOD DxgkcbEvalAcpiMethod;

NTSTATUS DxgkcbEvalAcpiMethod(
  [in]  HANDLE DeviceHandle,
  [in]  ULONG DeviceUid,
  [in]  PACPI_EVAL_INPUT_BUFFER_COMPLEX AcpiInputBuffer,
  [in]  ULONG AcpiInputSize,
  [out] PACPI_EVAL_OUTPUT_BUFFER AcpiOutputBuffer,
  [in]  ULONG AcpiOutputSize
)
{...}

Параметры

[in] DeviceHandle

Дескриптор, представляющий видеоадаптер. Драйвер мини-порта дисплея ранее получил этот дескриптор в элементе DeviceHandleструктуры DXGKRNL_INTERFACE , переданной в DxgkDdiStartDevice.

[in] DeviceUid

Уникальный идентификатор устройства ACPI, на котором будет оцениваться метод. Если устройство ACPI является дочерним элементом адаптера дисплея, это элемент ChildUidструктуры DXGK_CHILD_DESCRIPTOR , которую драйвер мини-порта дисплея заполняет во время DxgkDdiQueryChildRelations. Если устройство ACPI является самим видеоадаптером, для этого параметра необходимо задать значение DISPLAY_ADAPTER_HW_ID.

[in] AcpiInputBuffer

Указатель на структуру ACPI_EVAL_INPUT_BUFFER_COMPLEX (определенную в Acpiioct.h), выделенную и заполненную драйвером мини-порта дисплея. Структура содержит аргументы, необходимые для метода ACPI. Дополнительные сведения см. в следующем разделе Примечаний.

[in] AcpiInputSize

Общий размер (в байтах) буфера, на который указывает AcpiInputBuffer.

[out] AcpiOutputBuffer

Указатель на структуру ACPI_EVAL_OUTPUT_BUFFER (определенную в acpiioct.h), которая получает возвращаемое значение метода ACPI. Этот параметр может принимать значение NULL.

[in] AcpiOutputSize

Общий размер (в байтах) буфера, на который указывает AcpiOutputBuffer.

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

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

Комментарии

Чтобы оценить методы ACPI на устройстве ACPI, само устройство должно находиться в пространстве имен ACPI. Кроме того, драйвер мини-порта дисплея должен задать более низкие 16 бит значения ChildUid для всех дочерних устройств ACPI, которые драйвер минипорта дисплея сообщает идентификатору ACPI.

Перед возвратом DxgkCbEvalAcpiMethod сбрасывает элемент Signature структуры ACPI_EVAL_INPUT_BUFFER_COMPLEX на ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE. В Windows Vista с пакетом обновления 1 (SP1), Windows Server 2008 и более поздних версиях операционных систем Windows, если драйвер мини-порта дисплея имеет дочерние устройства, перед вызовом DxgkCbEvalAcpiMethod необходимо задать для свойства Signature значение DXGK_ACPI_PASS_ARGS_TO_CHILDREN.

Примечание Подсистема ядра графики Microsoft DirectX не может оценивать методы ACPI, которые находятся за пределами пространства имен устройства.
 
Примечание Драйверы мини-портов для отображения могут использовать DxgkCbEvalAcpiMethod только для графических адаптеров с каналом вывода.
 

Примеры

В следующем примере кода показано, как оценить метод ACPI.

if (HwDeviceExtension->AcpiChildren != NULL) {
    ULONG ChildIndex;
    PACPI_METHOD_ARGUMENT AcpiChildrenArray = 
 &(((PACPI_EVAL_OUTPUT_BUFFER)HwDeviceExtension->AcpiChildren) 
   ->Argument[0]);
   ULONG ChildCount = ((PACPI_EVAL_OUTPUT_BUFFER) 
   (HwDeviceExtension->AcpiChildren))->Count;
  ULONG ChildUid;
  ACPI_EVAL_INPUT_BUFFER_COMPLEX AcpiInputBuffer = {'\0'};
   ACPI_EVAL_OUTPUT_BUFFER AcpiOutputBuffer;
    pDesiredStatus = ExAllocatePoolWithTag(PagedPool,
 sizeof(DESIRED_CHILD_STATUS) * ChildCount,
 ATI_TAG);

  if (pDesiredStatus == NULL) {
     Status = STATUS_NO_MEMORY;
        goto cleanup;
  }

 RtlZeroMemory(pDesiredStatus, sizeof(DESIRED_CHILD_STATUS) * ChildCount);

 for (ChildIndex = 0; ChildIndex < ChildCount; ChildIndex++) {
 // If not a video output child, go to the next child.
 if (AcpiChildrenArray[ChildIndex].Argument
   & ACPI_NON_VIDEO_OUTPUT_DEVICE) {
   continue;
      }
      // A video output child so the ChildUid is the VidPnTargetId.
       ChildUid = (AcpiChildrenArray[ChildIndex].Argument
   & ACPI_HARDWARE_ID) | HW_ID_DISPLAY_CHILD;

      // Query ACPI for the required state.
      //
  // Beginning with Windows Vista SP1 and Windows Server 2008,
  // use DXGK_ACPI_PASS_ARGS_TO_CHILDREN.

  #if (NTDDI_VERSION >= NTDDI_WIN6SP1)
   AcpiInputBuffer.Signature = 
   DXGK_ACPI_PASS_ARGS_TO_CHILDREN;
     #else
    AcpiInputBuffer.Signature = 
   ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE;
       #endif

     AcpiInputBuffer.MethodNameAsUlong = 
   ACPI_METHOD_OUTPUT_DGS;
     Status = DxgkCbEvalAcpiMethod(HwDeviceExtension->DeviceHandle,
         ChildUid,
         &AcpiInputBuffer,
         sizeof(ACPI_EVAL_INPUT_BUFFER_COMPLEX),
         &AcpiOutputBuffer,
         sizeof(ACPI_EVAL_OUTPUT_BUFFER));
     if (!NT_SUCCESS(Status)) {
         // Something really wrong
         goto cleanup;
     }
      // Determine what the new VidPn should be and
      // allow RecommendFunctionalVidPn to return it.
      // AcpiOutputBuffer.Argument[0].Argument == 1 indicates active
       // AcpiOutputBuffer.Argument[0].Argument == 0 
       // indicates not active
       pDesiredStatus[ChildIndex].bActive = 
   (AcpiOutputBuffer.Argument[0].Argument == 1) ? TRUE : FALSE;
      // Always use the first source because this is a keyboard shortcut.
      pDesiredStatus[ChildIndex].ulSourceId = 0;
      pDesiredStatus[ChildIndex].ulTargetId = ChildUid;
  }

 Status = InvalidateVidPnForHotKey(HwDeviceExtension, pDesiredStatus);
}

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows Vista и более поздних версиях операционных систем Windows.
Целевая платформа Персональный компьютер
Верхняя часть dispmprt.h (включая Dispmprt.h)
IRQL PASSIVE_LEVEL

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

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations