Função WdfRequestStopAcknowledge (wdfrequest.h)
[Aplica-se a KMDF e UMDF]
O método WdfRequestStopAcknowledge informa à estrutura que o driver parou de processar uma solicitação de E/S especificada.
Sintaxe
void WdfRequestStopAcknowledge(
[in] WDFREQUEST Request,
[in] BOOLEAN Requeue
);
Parâmetros
[in] Request
Um identificador para um objeto de solicitação de estrutura.
[in] Requeue
Um valor booliano que, se TRUE, faz com que a estrutura enfileira a solicitação na fila para que a estrutura a entregue novamente ao driver. Se FALSE, a estrutura não redireciona a solicitação. Para obter mais informações, consulte a seção Comentários a seguir.
Retornar valor
Nenhum
Comentários
Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.
Se um driver registrar uma função de retorno de chamada EvtIoStop para uma fila de E/S, a estrutura a chamará quando o dispositivo subjacente da fila estiver deixando seu estado de trabalho (D0). A estrutura chama a função de retorno de chamada EvtIoStop para cada solicitação de E/S que o driver não concluiu, incluindo solicitações que o driver possui e aquelas que ele encaminhou para um destino de E/S. O driver deve concluir, cancelar ou adiar o processamento de cada solicitação fazendo um dos seguintes procedimentos:
- Se o driver for o proprietário da solicitação, ele poderá chamar WdfRequestComplete para concluir ou cancelar a solicitação.
- Se o driver encaminhou a solicitação para um destino de E/S, ele pode chamar WdfRequestCancelSentRequest para tentar cancelar a solicitação.
- Se o driver adiar o processamento da solicitação, ele deverá chamar WdfRequestStopAcknowledge.
A estrutura não permite que o dispositivo deixe seu estado de trabalho (D0) até que o driver tenha concluído, cancelado ou adiado todas as solicitações recebidas por uma função de retorno de chamada EvtIoStop . Potencialmente, essa inação pode impedir que um sistema entre em seu estado de hibernação ou em outro estado de baixa energia do sistema.
Quando a função de retorno de chamada EvtIoStop de um driver chama WdfRequestStopAcknowledge, ela pode definir o parâmetro Requeue como TRUE ou FALSE:
-
A configuração de Redirecionar como TRUE faz com que a estrutura coloque a solicitação de volta em sua fila de E/S.
Quando o dispositivo subjacente retornar ao estado de trabalho (D0), a estrutura entregará novamente a solicitação ao driver.
-
A configuração Desembaraço como FALSE faz com que a estrutura não faça a solicitação novamente. Se o driver for o proprietário da solicitação, a propriedade permanecerá com o driver. Se o driver tiver encaminhado a solicitação, o driver será responsável por lidar com a solicitação quando ela for concluída. O driver deve parar de fazer qualquer processamento de E/S que exija acesso ao hardware.
Quando o dispositivo subjacente retornar ao estado de trabalho (D0), a estrutura chamará a função de retorno de chamada EvtIoResume do driver para que o driver possa continuar processando a solicitação.
Antes de chamar WdfRequestStopAcknowledge, a função de retorno de chamada EvtIoStop do driver deve interromper todo o processamento da solicitação de E/S que requer o acesso ao dispositivo subjacente, pois o dispositivo está prestes a entrar em um estado de baixa potência.
Para obter mais informações sobre o método WdfRequestStopAcknowledge , consulte Usando Power-Managed filas de E/S.
Exemplos
Se um driver chamar WdfRequestStopAcknowledge com Requeue definido como TRUE, ele deverá chamar WdfRequestUnmarkCancelable anteriormente.
O exemplo de código a seguir é uma função de retorno de chamada EvtIoStop que verifica se uma solicitação recebida é cancelável e, se for, chama WdfRequestUnmarkCancelable. Se WdfRequestUnmarkCancelable retornar STATUS_CANCELLED, o exemplo retornará apenas porque a função de retorno de chamada EvtRequestCancel do driver manipulará a solicitação. Caso contrário, o exemplo chama WdfRequestStopAcknowledge e especifica TRUE para que a estrutura requeira a solicitação quando o dispositivo subjacente retornar ao estado de trabalho (D0).
VOID
MyEvtIoStop(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN ULONG ActionFlags
)
{
NTSTATUS status;
// TODO: Take steps here to suspend and, if necessary, roll back any processing that has already occurred on this request
if (ActionFlags & WdfRequestStopRequestCancelable) {
status = WdfRequestUnmarkCancelable(Request);
if (status == STATUS_CANCELLED) {
return;
}
}
// Inform framework that driver is postponing processing, cause framework to redeliver request when device returns to D0
WdfRequestStopAcknowledge(Request, TRUE);
}
Normalmente, se um driver chamar WdfRequestStopAcknowledge com Requeue definido como FALSE, ele deixará a solicitação cancelável.
O exemplo de código a seguir é uma função de retorno de chamada EvtIoStop que chama WdfRequestStopAcknowledge e especifica FALSE para que a estrutura eventualmente chame a função de retorno de chamada EvtIoResume do driver, em que o driver retoma o processamento da solicitação.
Você poderá usar um código como esse se for aceitável interromper o processamento de uma solicitação específica e continuar mais tarde, em vez de ter a solicitação entregue novamente e reiniciar o processamento desde o início.
VOID
MyEvtIoStop(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN ULONG ActionFlags
)
{
//TODO: Take steps here to suspend processing of the request so it can be resumed when power returns
// Acknowledge the stop, but leave the request under driver's ownership.
// Provide a corresponding EvtIoResume handler to resume processing when power returns
WdfRequestStopAcknowledge(Request, FALSE);
}
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 | wdfrequest.h (inclua Wdf.h) |
Biblioteca | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
Regras de conformidade da DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), EvtIoStopCompleteOrStopAck(kmdf), EvtIoStopResume(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf), StopAckWithinEvtIoStop(kmdf) |