DXGKCB_EVAL_ACPI_METHOD função de retorno de chamada (dispmprt.h)

A função DxgkCbEvalAcpiMethod avalia um método ACPI especificado em um adaptador de exibição ou em um dispositivo filho de um adaptador de exibição.

Sintaxe

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
)
{...}

Parâmetros

[in] DeviceHandle

Um identificador que representa um adaptador de exibição. O driver de miniporto de exibição obteve anteriormente esse identificador no membro DeviceHandle da estrutura DXGKRNL_INTERFACE que foi passada para DxgkDdiStartDevice.

[in] DeviceUid

O identificador exclusivo para o dispositivo ACPI no qual o método será avaliado. Se o dispositivo ACPI for um filho do adaptador de exibição, esse será o membro ChildUid da estrutura DXGK_CHILD_DESCRIPTOR que o driver de miniporto de exibição preencheu durante DxgkDdiQueryChildRelations. Se o dispositivo ACPI for o próprio adaptador de exibição, esse parâmetro deverá ser definido como DISPLAY_ADAPTER_HW_ID.

[in] AcpiInputBuffer

Um ponteiro para uma estrutura de ACPI_EVAL_INPUT_BUFFER_COMPLEX (definida em Acpiioct.h) alocada e preenchida pelo driver de miniporto de exibição. A estrutura contém os argumentos exigidos pelo método ACPI. Consulte a seção Comentários a seguir para obter mais informações.

[in] AcpiInputSize

O tamanho total, em bytes, do buffer apontado por AcpiInputBuffer.

[out] AcpiOutputBuffer

Um ponteiro para uma estrutura de ACPI_EVAL_OUTPUT_BUFFER (definida em Acpiioct.h) que recebe o valor retornado do método ACPI. Este parâmetro pode ser NULL.

[in] AcpiOutputSize

O tamanho total, em bytes, do buffer apontado por AcpiOutputBuffer.

Retornar valor

DxgkCbEvalAcpiMethod retorna STATUS_SUCCESS se for bem-sucedido. Caso contrário, ele retornará um dos códigos de erro definidos em Ntstatus.h.

Comentários

Para avaliar métodos ACPI em um dispositivo ACPI, o próprio dispositivo deve estar no namespace ACPI. Além disso, o driver de miniporto de exibição deve ter definido os 16 bits inferiores do valor ChildUid para qualquer dispositivo filho ACPI que o driver de miniporto de exibição relata ao identificador relatado pela ACPI.

Antes de retornar, DxgkCbEvalAcpiMethod redefine o membro Signature da estrutura ACPI_EVAL_INPUT_BUFFER_COMPLEX para ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE. No Windows Vista com Service Pack 1 (SP1), Windows Server 2008 e versões posteriores dos sistemas operacionais Windows, se o driver de miniporto de exibição tiver dispositivos filho, ele deverá definir Assinatura como DXGK_ACPI_PASS_ARGS_TO_CHILDREN antes de fazer qualquer chamada para DxgkCbEvalAcpiMethod.

Nota O subsistema de kernel de elementos gráficos do Microsoft DirectX não pode avaliar métodos ACPI que estão fora do namespace do dispositivo.
 
Nota Os drivers de miniporte de exibição podem usar DxgkCbEvalAcpiMethod somente para adaptadores gráficos de link de chumbo.
 

Exemplos

O exemplo de código a seguir mostra como avaliar um método 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);
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista
Plataforma de Destino Área de Trabalho
Cabeçalho dispmprt.h (inclua Dispmprt.h)
IRQL PASSIVE_LEVEL

Confira também

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations