Compartilhar via


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 DeviceHandle membro da estrutura DXGKRNL_INTERFACE que foi passada para DxgkDdiStartDevice.

[in] DeviceUid

O identificador exclusivo do dispositivo ACPI no qual o método será avaliado. Se o dispositivo ACPI for um filho do adaptador de exibição, este 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. Esse parâmetro pode ser NULL.

[in] AcpiOutputSize

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

Valor de retorno

DxgkCbEvalAcpiMethod retornará STATUS_SUCCESS se tiver êxito. Caso contrário, ele retornará um dos códigos de erro definidos em Ntstatus.h.

Observações

Para avaliar os 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 para o identificador relatado pela ACPI.

Antes de retornar, DxgkCbEvalAcpiMethod redefine o membro de Assinatura 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 Signature para DXGK_ACPI_PASS_ARGS_TO_CHILDREN antes de fazer qualquer chamada para DxgkCbEvalAcpiMethod.

Observação 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.
 
Observação Os drivers de miniporto de exibição podem usar DxgkCbEvalAcpiMethod somente para adaptadores de elementos gráficos de link principal.
 

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
de cliente com suporte mínimo Windows Vista
da Plataforma de Destino Área de trabalho
cabeçalho dispmprt.h (inclua Dispmprt.h)
IRQL PASSIVE_LEVEL

Consulte também

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations