DXGKCB_EVAL_ACPI_METHOD Rückruffunktion (dispmprt.h)
Die DxgkCbEvalAcpiMethod-Funktion wertet eine angegebene ACPI-Methode auf einer Grafikkarte oder auf einem untergeordneten Gerät einer Grafikkarte aus.
Syntax
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
Ein Handle, das eine Grafikkarte darstellt. Der Anzeige-Miniporttreiber hat dieses Handle zuvor im DeviceHandle-Member der DXGKRNL_INTERFACE-Struktur abgerufen, die an DxgkDdiStartDevice übergeben wurde.
[in] DeviceUid
Der eindeutige Bezeichner für das ACPI-Gerät, auf dem die Methode ausgewertet wird. Wenn das ACPI-Gerät ein untergeordnetes Element der Grafikkarte ist, ist dies der ChildUid-Member der DXGK_CHILD_DESCRIPTOR Struktur, die der Anzeigeminiporttreiber während DxgkDdiQueryChildRelations ausgefüllt hat. Wenn das ACPI-Gerät der Anzeigeadapter selbst ist, muss dieser Parameter auf DISPLAY_ADAPTER_HW_ID festgelegt werden.
[in] AcpiInputBuffer
Ein Zeiger auf eine ACPI_EVAL_INPUT_BUFFER_COMPLEX Struktur (definiert in Acpiioct.h), die vom Anzeigeminiporttreiber zugeordnet und ausgefüllt wird. Die -Struktur enthält die Argumente, die für die ACPI-Methode erforderlich sind. Weitere Informationen finden Sie im abschnitt "Hinweise".
[in] AcpiInputSize
Die Gesamtgröße des Puffers in Bytes, auf den AcpiInputBuffer verweist.
[out] AcpiOutputBuffer
Ein Zeiger auf eine ACPI_EVAL_OUTPUT_BUFFER-Struktur (definiert in Acpiioct.h), die den Rückgabewert der ACPI-Methode empfängt. Dieser Parameter kann NULL sein.
[in] AcpiOutputSize
Die Gesamtgröße des Puffers in Bytes, auf den AcpiOutputBuffer verweist.
Rückgabewert
DxgkCbEvalAcpiMethod gibt bei Erfolg STATUS_SUCCESS zurück. Andernfalls wird einer der in Ntstatus.h definierten Fehlercodes zurückgegeben.
Hinweise
Zum Auswerten von ACPI-Methoden auf einem ACPI-Gerät muss sich das Gerät selbst im ACPI-Namespace befinden. Darüber hinaus muss der Anzeige-Miniporttreiber die unteren 16 Bits des ChildUid-Werts für alle untergeordneten ACPI-Geräte festgelegt haben, die der Anzeige-Miniporttreiber an den von ACPI gemeldeten Bezeichner meldet.
Vor der Rückgabe setzt DxgkCbEvalAcpiMethod den Signature-Member der ACPI_EVAL_INPUT_BUFFER_COMPLEX-Struktur auf ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE zurück. In Windows Vista mit Service Pack 1 (SP1), Windows Server 2008 und höheren Versionen der Windows-Betriebssysteme sollte signature auf DXGK_ACPI_PASS_ARGS_TO_CHILDREN festgelegt werden, bevor dxgkCbEvalAcpiMethod aufgerufen wird, wenn der Display-Miniporttreiber über untergeordnete Geräte verfügt.
Beispiele
Im folgenden Codebeispiel wird gezeigt, wie eine ACPI-Methode ausgewertet wird.
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);
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar in Windows Vista und höheren Versionen der Windows-Betriebssysteme. |
Zielplattform | Desktop |
Kopfzeile | dispmprt.h (include Dispmprt.h) |
IRQL | PASSIVE_LEVEL |
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für