DXGKCB_EVAL_ACPI_METHOD função de retorno de chamada (dispmprt.h)
A função DxgkCbEvalAcpiMethod avalia um método ACPI especificado em um adaptador de exibição ou em um dispositivo filho de um adaptador de exibição.
Sintaxe
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
)
{...}
Parâmetros
[in] DeviceHandle
Um identificador que representa um adaptador de exibição. O driver de miniporto de exibição obteve anteriormente esse identificador no membro DeviceHandle da estrutura DXGKRNL_INTERFACE que foi passada para DxgkDdiStartDevice.
[in] DeviceUid
O identificador exclusivo para o dispositivo ACPI no qual o método será avaliado. Se o dispositivo ACPI for um filho do adaptador de exibição, esse será o membro ChildUid da estrutura DXGK_CHILD_DESCRIPTOR que o driver de miniporto de exibição preencheu durante DxgkDdiQueryChildRelations. Se o dispositivo ACPI for o próprio adaptador de exibição, esse parâmetro deverá ser definido como DISPLAY_ADAPTER_HW_ID.
[in] AcpiInputBuffer
Um ponteiro para uma estrutura de ACPI_EVAL_INPUT_BUFFER_COMPLEX (definida em Acpiioct.h) alocada e preenchida pelo driver de miniporto de exibição. A estrutura contém os argumentos exigidos pelo método ACPI. Consulte a seção Comentários a seguir para obter mais informações.
[in] AcpiInputSize
O tamanho total, em bytes, do buffer apontado por AcpiInputBuffer.
[out] AcpiOutputBuffer
Um ponteiro para uma estrutura de ACPI_EVAL_OUTPUT_BUFFER (definida em Acpiioct.h) que recebe o valor retornado do método ACPI. Este parâmetro pode ser NULL.
[in] AcpiOutputSize
O tamanho total, em bytes, do buffer apontado por AcpiOutputBuffer.
Retornar valor
DxgkCbEvalAcpiMethod retorna STATUS_SUCCESS se for bem-sucedido. Caso contrário, ele retornará um dos códigos de erro definidos em Ntstatus.h.
Comentários
Para avaliar métodos ACPI em um dispositivo ACPI, o próprio dispositivo deve estar no namespace ACPI. Além disso, o driver de miniporto de exibição deve ter definido os 16 bits inferiores do valor ChildUid para qualquer dispositivo filho ACPI que o driver de miniporto de exibição relata ao identificador relatado pela ACPI.
Antes de retornar, DxgkCbEvalAcpiMethod redefine o membro Signature da estrutura ACPI_EVAL_INPUT_BUFFER_COMPLEX para ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE. No Windows Vista com Service Pack 1 (SP1), Windows Server 2008 e versões posteriores dos sistemas operacionais Windows, se o driver de miniporto de exibição tiver dispositivos filho, ele deverá definir Assinatura como DXGK_ACPI_PASS_ARGS_TO_CHILDREN antes de fazer qualquer chamada para DxgkCbEvalAcpiMethod.
Exemplos
O exemplo de código a seguir mostra como avaliar um método 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);
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows Vista |
Plataforma de Destino | Área de Trabalho |
Cabeçalho | dispmprt.h (inclua Dispmprt.h) |
IRQL | PASSIVE_LEVEL |