Compartir a través de


DXGKCB_EVAL_ACPI_METHOD función de devolución de llamada (dispmprt.h)

La función DxgkCbEvalAcpiMethod evalúa un método ACPI especificado en un adaptador de pantalla o en un dispositivo secundario de un adaptador de pantalla.

Sintaxis

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

Identificador que representa un adaptador de pantalla. El controlador de minipuerto de pantalla obtuvo previamente este identificador en el miembro DeviceHandle de la estructura DXGKRNL_INTERFACE que se pasó a DxgkDdiStartDevice.

[in] DeviceUid

Identificador único del dispositivo ACPI en el que se evaluará el método. Si el dispositivo ACPI es un elemento secundario del adaptador de pantalla, este es el miembro ChildUid de la estructura DXGK_CHILD_DESCRIPTOR que el controlador de miniporte de pantalla rellena durante DxgkDdiQueryChildRelations. Si el dispositivo ACPI es el propio adaptador de pantalla, este parámetro debe establecerse en DISPLAY_ADAPTER_HW_ID.

[in] AcpiInputBuffer

Puntero a una estructura de ACPI_EVAL_INPUT_BUFFER_COMPLEX (definida en Acpiioct.h) asignada y rellenada por el controlador de miniporte de pantalla. La estructura contiene los argumentos requeridos por el método ACPI. Consulte la sección Comentarios siguientes para obtener más información.

[in] AcpiInputSize

Tamaño total, en bytes, del búfer al que apunta AcpiInputBuffer.

[out] AcpiOutputBuffer

Puntero a una estructura de ACPI_EVAL_OUTPUT_BUFFER (definida en Acpiioct.h) que recibe el valor devuelto del método ACPI. Este parámetro puede ser NULL.

[in] AcpiOutputSize

Tamaño total, en bytes, del búfer al que apunta AcpiOutputBuffer.

Valor devuelto

DxgkCbEvalAcpiMethod devuelve STATUS_SUCCESS si se realiza correctamente. De lo contrario, devuelve uno de los códigos de error definidos en Ntstatus.h.

Comentarios

Para evaluar los métodos ACPI en un dispositivo ACPI, el propio dispositivo debe estar en el espacio de nombres ACPI. Además, el controlador de minipuerto de pantalla debe haber establecido los 16 bits inferiores del valor ChildUid para los dispositivos secundarios ACPI que el controlador de miniporte de pantalla informa al identificador notificado por ACPI.

Antes de que vuelva, DxgkCbEvalAcpiMethod restablece el miembro Signature de la estructura de ACPI_EVAL_INPUT_BUFFER_COMPLEX a ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE. En Windows Vista con Service Pack 1 (SP1), Windows Server 2008 y versiones posteriores de los sistemas operativos Windows, si el controlador de miniporte de pantalla tiene dispositivos secundarios, debe establecer Signature en DXGK_ACPI_PASS_ARGS_TO_CHILDREN antes de realizar cualquier llamada a DxgkCbEvalAcpiMethod.

Nota El subsistema del kernel de gráficos de Microsoft DirectX no puede evaluar los métodos ACPI que están fuera del espacio de nombres del dispositivo.
 
Nota Los controladores de minipuerto de pantalla pueden usar DxgkCbEvalAcpiMethod solo para adaptadores de gráficos de vínculo potencial.
 

Ejemplos

En el ejemplo de código siguiente se muestra cómo evaluar un 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 Value
Cliente mínimo compatible Windows Vista
Plataforma de destino Escritorio
Encabezado dispmprt.h (include Dispmprt.h)
IRQL PASSIVE_LEVEL

Consulte también

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations