DXGKCB_EVAL_ACPI_METHOD fungsi panggilan balik (dispmprt.h)

Fungsi DxgkCbEvalAcpiMethod mengevaluasi metode ACPI tertentu pada adaptor tampilan atau pada perangkat anak adaptor tampilan.

Sintaks

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
)
{...}

Parameter

[in] DeviceHandle

Handel yang mewakili adaptor tampilan. Driver miniport tampilan sebelumnya memperoleh handel ini di anggota DeviceHandle dari struktur DXGKRNL_INTERFACE yang diteruskan ke DxgkDdiStartDevice.

[in] DeviceUid

Pengidentifikasi unik untuk perangkat ACPI tempat metode akan dievaluasi. Jika perangkat ACPI adalah anak dari adaptor tampilan, ini adalah anggota ChildUid dari struktur DXGK_CHILD_DESCRIPTOR yang diisi driver miniport tampilan selama DxgkDdiQueryChildRelations. Jika perangkat ACPI adalah adaptor tampilan itu sendiri, parameter ini harus diatur ke DISPLAY_ADAPTER_HW_ID.

[in] AcpiInputBuffer

Penunjuk ke struktur ACPI_EVAL_INPUT_BUFFER_COMPLEX (didefinisikan dalam Acpiioct.h) dialokasikan dan diisi oleh driver miniport tampilan. Struktur berisi argumen yang diperlukan oleh metode ACPI. Lihat bagian Keterangan berikut untuk informasi selengkapnya.

[in] AcpiInputSize

Ukuran total, dalam byte, dari buffer yang diacu oleh AcpiInputBuffer.

[out] AcpiOutputBuffer

Penunjuk ke struktur ACPI_EVAL_OUTPUT_BUFFER (didefinisikan dalam Acpiioct.h) yang menerima nilai pengembalian metode ACPI. Parameter ini bisa NULL.

[in] AcpiOutputSize

Ukuran total, dalam byte, dari buffer yang diacu oleh AcpiOutputBuffer.

Nilai kembali

DxgkCbEvalAcpiMethod mengembalikan STATUS_SUCCESS jika berhasil. Jika tidak, ia mengembalikan salah satu kode kesalahan yang ditentukan dalam Ntstatus.h.

Keterangan

Untuk mengevaluasi metode ACPI pada perangkat ACPI, perangkat itu sendiri harus berada di namespace ACPI. Selain itu, driver miniport tampilan harus telah menetapkan 16 bit yang lebih rendah dari nilai ChildUid untuk perangkat anak ACPI apa pun yang dilaporkan driver miniport tampilan ke pengidentifikasi yang dilaporkan ACPI.

Sebelum kembali, DxgkCbEvalAcpiMethod mengatur ulang anggota Signature dari struktur ACPI_EVAL_INPUT_BUFFER_COMPLEX ke ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE. Di Windows Vista dengan Paket Layanan 1 (SP1), Windows Server 2008, dan versi yang lebih baru dari sistem operasi Windows, jika driver miniport tampilan memiliki perangkat anak, itu harus mengatur Tanda Tangan ke DXGK_ACPI_PASS_ARGS_TO_CHILDREN sebelum melakukan panggilan apa pun ke DxgkCbEvalAcpiMethod.

Catatan Subsistem kernel grafis Microsoft DirectX tidak dapat mengevaluasi metode ACPI yang berada di luar namespace perangkat.
 
Catatan Driver miniport tampilan dapat menggunakan DxgkCbEvalAcpiMethod hanya untuk adaptor grafis tautan prospek.
 

Contoh

Contoh kode berikut menunjukkan cara mengevaluasi metode 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);
}

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia di Windows Vista dan versi yang lebih baru dari sistem operasi Windows.
Target Platform Desktop
Header dispmprt.h (termasuk Dispmprt.h)
IRQL PASSIVE_LEVEL

Lihat juga

ACPI_EVAL_INPUT_BUFFER_COMPLEX

DXGK_CHILD_DESCRIPTOR

DxgkDdiNotifyAcpiEvent

DxgkDdiQueryChildRelations