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.
Menampilkan nilai
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.
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 | Windows Vista |
Target Platform | Desktop |
Header | dispmprt.h (termasuk Dispmprt.h) |
IRQL | PASSIVE_LEVEL |