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 |
---|---|
|
Un parámetro de entrada no es válido o la solicitud ya no se puede cancelar. |
|
El controlador no posee la solicitud. |
|
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) |