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


функция обратного вызова 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, если драйвер мини-порта дисплея имеет дочерние устройства, он должен задать для signature значение DXGK_ACPI_PASS_ARGS_TO_CHILDREN, прежде чем выполнять вызов DxgkCbEvalAcpiMethod.

Примечание Подсистема ядра графики 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
Целевая платформа Персональный компьютер
Верхняя часть dispmprt.h (включая Dispmprt.h)
IRQL PASSIVE_LEVEL

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

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations