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

表示顯示配接器的句柄。 顯示迷你埠驅動程式先前在傳遞給 DxgkDdiStartDeviceDXGKRNL_INTERFACE 結構的 DeviceHandle 成員中取得此句柄。

[in] DeviceUid

將評估方法之 ACPI 裝置的唯一標識碼。 如果 ACPI 裝置是顯示器適配卡的子系,這是顯示迷你埠驅動程式在 DxgkDdiQueryChildRelations 期間填入之DXGK_CHILD_DESCRIPTOR結構的 ChildUid 成員。 如果 ACPI 裝置是顯示器適配卡本身,此參數必須設定為DISPLAY_ADAPTER_HW_ID。

[in] AcpiInputBuffer

ACPI_EVAL_INPUT_BUFFER_COMPLEX結構的指標, (在 Acpiioct.h 中定義,) 顯示迷你埠驅動程式所配置並填入。 結構包含 ACPI 方法所需的自變數。 如需詳細資訊,請參閱下列一節。

[in] AcpiInputSize

AcpiInputBuffer 所指向緩衝區的總大小,以位元組為單位。

[out] AcpiOutputBuffer

Acpiioct.h) 中定義的ACPI_EVAL_OUTPUT_BUFFER結構指標 (,可接收 ACPI 方法的傳回值。 此參數可以是 Null

[in] AcpiOutputSize

AcpiOutputBuffer 所指向緩衝區的總大小,以位元組為單位。

傳回值

如果成功,DxgkCbEvalAcpiMethod 會傳回STATUS_SUCCESS。 否則,它會傳回 Ntstatus.h 中定義的其中一個錯誤碼。

備註

若要評估 ACPI 裝置上的 ACPI 方法,裝置本身必須位於 ACPI 命名空間中。 此外,顯示器迷你埠驅動程式必須針對顯示迷你埠驅動程序回報的任何 ACPI 子裝置,將 ChildUid 值較低的 16 位設定為 ACPI 報告的識別碼。

在傳回之前,DxgkCbEvalAcpiMethod 會將ACPI_EVAL_INPUT_BUFFER_COMPLEX結構的 Signature 成員重設為ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE。 在 Windows Vista 的 Service Pack 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 和更新版本的 Windows 作業系統中使用。
目標平台 桌面
標頭 dispmprt.h (包含 Dispmprt.h)
IRQL PASSIVE_LEVEL

另請參閱

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations