Macro WdfDeviceStopIdle (wdfdevice.h)
[Aplica-se a KMDF e UMDF]
O método WdfDeviceStopIdle informa à estrutura que o dispositivo especificado deve ser colocado em seu estado de energia de trabalho (D0).
Sintaxe
NTSTATUS WdfDeviceStopIdle(
_In_ WDFDEVICE Device,
_In_ BOOLEAN WaitForD0
);
Parâmetros
[in] Device
Um identificador para um objeto de dispositivo de estrutura.
[in] WaitForD0
Um valor booliano que indica quando WdfDeviceStopIdle retornará. Se TRUE, ele retornará somente depois que o dispositivo especificado tiver inserido o estado de energia do dispositivo D0. Se FALSE, o método retornará imediatamente.
Retornar valor
Nenhum
Comentários
Essa macro pode retornar os seguintes valores:
Valor retornado | Significado |
---|---|
STATUS_PENDING | O dispositivo está sendo ligado de forma assíncrona. |
STATUS_INVALID_DEVICE_STATE | O driver não é o proprietário da política de energia do dispositivo. |
STATUS_POWER_STATE_INVALID | Ocorreu uma falha no dispositivo e o dispositivo não pode inserir seu estado de energia D0. |
O método pode retornar outros valores NTSTATUS.
Observação
Para dispositivos que especificam SystemManagedIdleTimeout ou SystemManagedIdleTimeoutWithHint na enumeração WDF_POWER_POLICY_IDLE_TIMEOUT_TYPE , ao chamar WdfDeviceStopIdle com WaitForD0 definido como FALSE, se o dispositivo ainda estiver em D0 e o período de tempo limite ocioso ainda não tiver decorrido, começando nas versões do WDF 1.33/2.33, WdfDeviceStopIdle retornará STATUS_SUCCESS (em versões anteriores isso resultou em um valor de retorno de STATUS_PENDING).
Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.
Se o dispositivo puder entrar em um estado de baixa potência quando ele ficar ocioso, o driver poderá precisar chamar ocasionalmente WdfDeviceStopIdle para trazer o dispositivo de volta ao estado de trabalho (D0) ou impedir que ele entre em um estado de baixa potência.
WdfDeviceStopIdle não impede que a estrutura faça a transição do dispositivo para um estado de suspensão quando o sistema muda para um estado de suspensão Sx. Seu único efeito é evitar transições para estados de suspensão Dx enquanto o sistema está no estado de trabalho S0. Da mesma forma, se o dispositivo der suporte ao gerenciamento de energia direcionado, WdfDeviceStopIdle não impedirá que o dispositivo insira a energia direcionada.
Aviso
Não chame WdfDeviceStopIdle com WaitForD0 = TRUE durante a desligar, direta ou indiretamente. Por exemplo, se o retorno de chamada EvtDeviceArmWakeFromS0 aguardar em outro thread que chama WdfDeviceStopIdle(TRUE)
, a transição de energia será bloqueada e o sistema falhará.
Seu driver não precisa chamar WdfDeviceStopIdle quando um dispositivo está ocioso e a estrutura coloca uma solicitação de E/S na fila de E/S gerenciada por energia do dispositivo. Além disso, o driver não precisa chamar WdfDeviceStopIdle quando um dispositivo está ocioso e detecta um sinal de ativação. Em ambos os casos, a estrutura solicita que o motorista do barramento restaure o estado de energia do dispositivo para D0.
Embora os drivers normalmente não precisem chamar WdfDeviceStopIdle ao lidar com solicitações de E/S obtidas de uma fila de E/S gerenciada por energia, a chamada é permitida. No entanto, os drivers não devem definir o parâmetro WaitForD0 como TRUE ao lidar com solicitações de E/S de uma fila de E/S gerenciada por energia.
O driver precisa chamar WdfDeviceStopIdle se precisar acessar o dispositivo devido a uma solicitação que o driver recebeu fora de uma fila de E/S gerenciada por energia. Por exemplo, seu driver pode dar suporte a uma interface definida pelo driver ou a uma solicitação WMI que requer acesso ao dispositivo. Nesse caso, você deve garantir que o dispositivo esteja em seu estado de trabalho antes que o driver acesse o dispositivo e que o dispositivo permaneça em seu estado de trabalho até que o driver termine de acessar o dispositivo.
Chamar WdfDeviceStopIdle força o dispositivo para seu estado de trabalho (D0), se o sistema estiver em seu estado de trabalho (S0). O dispositivo permanece em seu estado de trabalho até que o driver chame WdfDeviceResumeIdle, momento em que a estrutura poderá colocar o dispositivo em um estado de baixa potência se ele permanecer ocioso.
Não chame WdfDeviceStopIdle antes que a estrutura tenha chamado a função de retorno de chamada EvtDeviceD0Entry do driver pela primeira vez.
Uma chamada para WdfDeviceStopIdle poderá restaurar um dispositivo ocioso para seu estado de trabalho somente se o sistema estiver em seu estado de trabalho (S0). Se o sistema estiver fazendo a transição para um estado de baixa potência ou o dispositivo já tiver sido desligado em resposta ao Sx (em que x > 0) quando um driver chamar WdfDeviceStopIdle com o parâmetro WaitForD0 definido como TRUE, a função não retornará até que o sistema retorne ao estado S0.
Todas as chamadas bem-sucedidas para WdfDeviceStopIdle devem eventualmente ser seguidas por uma chamada para WdfDeviceResumeIdle ou então o dispositivo nunca retornará a um estado de baixa potência se ele ficar ocioso novamente. As chamadas para WdfDeviceStopIdle podem ser aninhadas, portanto, o número de chamadas para WdfDeviceResumeIdle deve ser igual ao número de chamadas para WdfDeviceStopIdle. Não chame WdfDeviceResumeIdle se uma chamada para WdfDeviceStopIdle falhar.
Se o sistema entrar em um estado de baixa potência após wdfDeviceStopIdle retornar, o dispositivo também entrará em um estado de baixa potência. Quando o sistema retorna ao estado de trabalho (S0), o dispositivo também retorna ao estado de trabalho (D0). A referência de energia da chamada para WdfDeviceStopIdle permanece ativa e impede que o dispositivo insira um estado de baixa potência até que haja uma chamada correspondente para WdfDeviceResumeIdle.
Para obter mais informações, consulte Suporte à ociosidade de energia para baixo.
Se WaitForD0 for TRUE, WdfDeviceStopIdle deverá ser chamado em IRQL = PASSIVE_LEVEL. Se WaitForD0 for FALSE, esse método deverá ser chamado em IRQL <= DISPATCH_LEVEL.
Chamar WdfDeviceStopIdleWithTag em vez de WdfDeviceStopIdle fornece informações adicionais (valor da marca, número de linha e nome do arquivo) que você pode exibir nos depuradores da Microsoft.
Exemplos
No exemplo de código a seguir, WdfDeviceStopIdle retorna depois que o dispositivo especificado inseriu o estado de energia do dispositivo D0.
NTSTATUS status;
status = WdfDeviceStopIdle(Device, TRUE);
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Universal |
Versão mínima do KMDF | 1.0 |
Versão mínima do UMDF | 2,0 |
Cabeçalho | wdfdevice.h (inclua Wdf.h) |
Biblioteca | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | Consulte a seção Observações. |
Regras de conformidade de DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |