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
Acpiioct.h 中定義的ACPI_EVAL_INPUT_BUFFER_COMPLEX結構指標 (,) 由顯示迷你埠驅動程式配置並填入。 結構包含 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。
範例
下列程式代碼範例示範如何評估 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 |
目標平台 | 桌面 |
標頭 | dispmprt.h (包括 Dispmprt.h) |
IRQL | PASSIVE_LEVEL |