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

ディスプレイ アダプターを表すハンドル。 ディスプレイ ミニポート ドライバーは、DxgkDdiStartDevice に渡されたDXGKRNL_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

ACPI メソッドの戻り値を受け取るACPI_EVAL_OUTPUT_BUFFER構造体 ( Acpiioct.h で定義) へのポインター。 このパラメーターは、NULL でもかまいません。

[in] AcpiOutputSize

AcpiOutputBuffer が指すバッファーの合計サイズ (バイト単位)。

戻り値

DxgkCbEvalAcpiMethod は、成功した場合STATUS_SUCCESSを返します。 それ以外の場合は、 Ntstatus.h で定義されているエラー コードのいずれかを返します。

注釈

ACPI デバイスで ACPI メソッドを評価するには、デバイス自体が ACPI 名前空間に存在する必要があります。 さらに、ディスプレイ ミニポート ドライバーは、ACPI が報告した識別子に表示ミニポート ドライバーが報告するすべての ACPI 子デバイスの ChildUid 値の下位 16 ビットを設定する必要があります。

DxgkCbEvalAcpiMethod は、返される前に、ACPI_EVAL_INPUT_BUFFER_COMPLEX構造体の Signature メンバーをACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATUREにリセットします。 Windows Vista Service Pack 1 (SP1)、Windows Server 2008、およびそれ以降のバージョンの Windows オペレーティング システムでは、ディスプレイ ミニポート ドライバーに子デバイスがある場合は、DxgkCbEvalAcpiMethod を呼び出す前に、Signature を DXGK_ACPI_PASS_ARGS_TO_CHILDREN に設定する必要があります。

メモ 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
対象プラットフォーム デスクトップ
Header dispmprt.h (Dispmprt.h を含む)
IRQL PASSIVE_LEVEL

こちらもご覧ください

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations