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 SP1(서비스 팩 1), Windows Server 2008 이상 버전의 Windows 운영 체제에서 디스플레이 미니포트 드라이버에 자식 디바이스가 있는 경우 DxgkCbEvalAcpiMethod를 호출하기 전에 서명을 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 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 dispmprt.h(Dispmprt.h 포함)
IRQL PASSIVE_LEVEL

추가 정보

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations