Función WdfRequestUnmarkCancelable (wdfrequest.h)

[Se aplica a KMDF y UMDF]

El método WdfRequestUnmarkCancelable deshabilita la cancelación de una solicitud de E/S especificada.

Sintaxis

NTSTATUS WdfRequestUnmarkCancelable(
  [in] WDFREQUEST Request
);

Parámetros

[in] Request

Identificador de un objeto de solicitud de marco.

Valor devuelto

WdfRequestUnmarkCancelable devuelve STATUS_SUCCESS si la operación se realiza correctamente. De lo contrario, este método podría devolver uno de los siguientes valores:

Código devuelto Descripción
STATUS_INVALID_PARAMETER
Un parámetro de entrada no es válido o la solicitud ya no se puede cancelar.
STATUS_INVALID_DEVICE_REQUEST
El controlador no posee la solicitud.
STATUS_CANCELLED
Se ha cancelado la solicitud.
 

Este método también podría devolver otros valores NTSTATUS.

Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.

Comentarios

Un controlador puede llamar a WdfRequestUnmarkCancelable para deshabilitar la cancelación de una solicitud de E/S, si el controlador anteriormente llamado WdfRequestMarkCancelable o WdfRequestMarkCancelableEx para habilitar la cancelación de la solicitud.

Si WdfRequestUnmarkCancelable devuelve un valor distinto de STATUS_CANCELLED, no se llamará a la función de devolución de llamada EvtRequestCancel del controlador para la solicitud.

Si el controlador anteriormente llamado WdfRequestMarkCancelable o WdfRequestMarkCancelableEx, la función de devolución de llamada EvtRequestCancel del controlador puede llamar a WdfRequestComplete con un parámetro Status de STATUS_CANCELLED. La función de devolución de llamada EvtRequestCancel no tiene que llamar a WdfRequestUnmarkCancelable. Si el controlador llama a WdfRequestComplete fuera de su función de devolución de llamada EvtRequestCancel , el controlador primero debe llamar a WdfRequestUnmarkCancelable.

Sin embargo, el controlador no debe llamar a WdfRequestUnmarkCancelable después de que EvtRequestCancel llame a WdfRequestComplete. En la sección Ejemplo siguiente, el ejemplo almacena una copia local del identificador de solicitud y, a continuación, la borra cuando la función de devolución de llamada EvtRequestCancel llama a WdfRequestComplete. El controlador no llama a WdfRequestUnmarkCancelable si se ha borrado la copia local del identificador de solicitud. En este ejemplo se usa la sincronización automática del marco para sincronizar las funciones de devolución de llamada.

Tenga en cuenta que llamar a WdfObjectReference para agregar una referencia adicional al objeto de solicitud no permite al controlador llamar a WdfRequestUnmarkCancelable después de que la función de devolución de llamada EvtRequestCancel del controlador llame a WdfRequestComplete.

Si WdfRequestUnmarkCancelable devuelve STATUS_CANCELLED y, a continuación, EvtRequestCancel completa la solicitud, el controlador no debe usar posteriormente el objeto de solicitud.

Si WdfRequestUnmarkCancelable devuelve STATUS_CANCELLED, el controlador no debe completar la solicitud antes de que el marco llame a EvtRequestCancel. De lo contrario, el marco podría llamar al evtRequestCancel del controlador con una solicitud no válida. Para obtener ejemplos de código relacionados, consulte IWDFIoRequest::UnmarkCancelable.

Para obtener más información sobre WdfRequestUnmarkCancelable, vea Cancelar solicitudes de E/S.

Ejemplos

En el ejemplo de código siguiente se proporcionan versiones simplificadas de las funciones de devolución de llamada EvtIoRead, EvtRequestCancel y EvtTimerFunc que contiene el controlador de ejemplo ECHO . En este ejemplo se muestra cómo llamar a WdfRequestMarkCancelable, WdfRequestUnmarkCancelable y WdfRequestComplete en un controlador que usa la sincronización automática del marco. (El ejemplo ECHO usa la sincronización de nivel de dispositivo).

Si el controlador no usa la sincronización automática del marco, consulte los dos ejemplos de IWDFIoRequest::UnmarkCancelable. Mientras se escribe para un controlador UMDF, estos ejemplos muestran técnicas que puede usar para administrar la sincronización entre la devolución de llamada de cancelación y otro subproceso que llama a la rutina Unmark .

VOID
  EchoEvtIoRead(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN size_t  Length
    )
{
    PQUEUE_CONTEXT queueContext = QueueGetContext(Queue);

    // Prepare for read operation here.
    // (See the Echo sample driver for details.) 
 ...
    // Enable cancellation.
    WdfRequestMarkCancelable(
                             Request,
                             EchoEvtRequestCancel
                             );

    // Save the request handle. We'll clear it after
    // we call WdfRequestComplete.
    queueContext->CurrentRequest = Request;
    return
}


VOID
 EchoEvtRequestCancel(
    IN WDFREQUEST  Request
    )
{
    PQUEUE_CONTEXT queueContext = 
        QueueGetContext(WdfRequestGetIoQueue(Request));

    WdfRequestComplete(
                       Request,
                       STATUS_CANCELLED,
     );
    // Clear the request handle so EchEvtTimerFunc will
    // know that we called WdfRequestComplete.
    queueContext->CurrentRequest = NULL;

    return;
}


VOID
  EchoEvtTimerFunc(
    IN WDFTIMER  Timer
    )
{
    NTSTATUS  Status;
    WDFREQUEST  Request;
    WDFQUEUE  queue;
    PQUEUE_CONTEXT  queueContext;

    // Retrieve our saved copy of the request handle.
    queue = WdfTimerGetParentObject(Timer);
    queueContext = QueueGetContext(queue);
    Request = queueContext->CurrentRequest;

    // We cannot call WdfRequestUnmarkCancelable
    // after a request completes, so check here to see
    // if EchoEvtRequestCancel cleared our saved
    // request handle. 
    if( Request != NULL ) {
        Status = WdfRequestUnmarkCancelable(Request);
        if(Status != STATUS_CANCELLED) {
            queueContext->CurrentRequest = NULL;
            Status = queueContext->CurrentStatus;
            WdfRequestComplete(
                               Request,
                               Status
                               );
        }
    }

    return;
}

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.0
Versión mínima de UMDF 2.0
Encabezado wdfrequest.h (incluir Wdf.h)
Library Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de DDI CompleteCanceledReq(kmdf), DeferredRequestCompleted(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MarkCancOnCancReqLocal(kmdf), ReqIsCancOnCancOnCancReq(kmdf), ReqMarkCancelableSend(kmdf), ReqNotCanceledLocal(kmdf)

Consulte también

EvtRequestCancel

WdfRequestComplete

WdfRequestMarkCancelable

WdfRequestMarkCancelableEx