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 に設定する必要があります。
例
次のコード例は、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 |