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.
Se o driver chamar WdfRequestStopAcknowledge, ele deverá chamar esse método de dentro de sua função de retorno de chamada EvtIoStop .

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.

Se o driver tiver chamado anteriormente WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx, ele deverá chamar WdfRequestUnmarkCancelable antes de chamar WdfRequestStopAcknowledge com Requeue definido como TRUE.

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)

Confira também

EvtIoStop

EvtRequestCancel

WdfRequestComplete