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


функция обратного вызова 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 сбрасывает элемент сигнатуры структуры ACPI_EVAL_INPUT_BUFFER_COMPLEX на ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE. В Windows Vista с пакетом обновления 1 (SP1), Windows Server 2008 и более поздних версиях операционных систем Windows, если драйвер мини-порта отображения имеет дочерние устройства, он должен задать сигнатуры 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 (include Dispmprt.h)
IRQL PASSIVE_LEVEL

См. также

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations