Compartir a través de


KDEFERRED_ROUTINE función de devolución de llamada (wdm.h)

La rutina de devolución de llamada realiza acciones, después de que un InterruptService devuelva, de un DPC en subproceso,

La rutina de CustomDpc finaliza el mantenimiento de una operación de E/S, después de que se devuelva una rutina de InterruptService.

La rutina customThreadedDpc realiza la acción de un DPC en subproceso. El sistema ejecuta esta rutina cuando se ejecuta el DPC en subproceso.

La rutina CustomTimerDpc se ejecuta después de que expire el intervalo de tiempo de un objeto de temporizador.

Sintaxis

KDEFERRED_ROUTINE KdeferredRoutine;

void KdeferredRoutine(
  [in]           _KDPC *Dpc,
  [in, optional] PVOID DeferredContext,
  [in, optional] PVOID SystemArgument1,
  [in, optional] PVOID SystemArgument2
)
{...}

Parámetros

[in] Dpc

Puntero proporcionado por el autor de la llamada a una estructura de KDPC, que representa el objeto DPC asociado a esta rutina de devolución de llamada.

[in, optional] DeferredContext

Para CustomDpc, un puntero proporcionado por el autor de la llamada a la información de contexto definida por el controlador que se especificó en una llamada anterior a KeInitializeDpc.

Para CustomThreadedDpc, especifica información de contexto definida por el controlador. Cuando inicializó el objeto DPC, el controlador proporcionó este valor como parámetro DeferredContext para KeInitializeThreadedDpc.

Puntero proporcionado por el llamador a una estructura de de KDPC, que representa el objeto DPC asociado a esta rutina de CustomTimerDpc.

[in, optional] SystemArgument1

Puntero proporcionado por el autor de la llamada a la información proporcionada por el controlador que se especificó en una llamada anterior a KeInsertQueueDpc. Cuando agregó el DPC a la cola DPC, el controlador proporcionó este valor como parámetro SystemArgument1 a KeInsertQueueDpc.

Para customTimerDpc, este valor no se usa.

[in, optional] SystemArgument2

Especifica información de contexto definida por el controlador. Cuando agregó el DPC a la cola DPC, el controlador proporcionó este valor como parámetro de SystemArgument2 a KeInsertQueueDpc.

Para customTimerDpc, este valor no se usa.

Valor devuelto

Ninguno

Observaciones

Para crear un objeto DPC y registrar una rutina de CustomDpc para ese objeto, un controlador debe llamar a KeInitializeDpc. (Si solo necesita una rutina DPC, puede usar una rutina de DpcForIsr y el objeto DPC asignado por el sistema).

Para poner en cola una rutina de customDpc para su ejecución, la rutina de Interrupt Service de un controlador debe llamar a KeInsertQueueDpc.

Se pueden usar una o más rutinas de CustomDpc en lugar de, o junto con, una rutina de DpcForIsr. Un controlador que mantiene varias colas IRP internas normalmente proporciona una rutina de CustomDpc para cada cola. Cada rutina de CustomDpc suele ser responsable de al menos las siguientes tareas:

  • Finalización de la operación de E/S descrita por el IRP actual.

  • Poner en cola el siguiente IRP de una de las colas irP del controlador. (Los controladores que usan la cola IRP proporcionada por el sistema junto con una llamada rutinaria StartIoIoStartNextPacket).

  • Establecer el bloque de estado de E/S en el IRP actual y llamar a ioCompleteRequest para la solicitud completada.

Una rutina de CustomDpc también podría reintentar una operación con errores o configurar la siguiente transferencia para una solicitud de E/S grande que se ha dividido en partes más pequeñas.

Para obtener más información sobre rutinas de CustomDpc, consulte DPC Objects and DPCs.

Un controlador registra un customThreadedDpc de para un objeto DPC llamando a KeInitializeThreadedDpc. Para agregar realmente el DPC a la cola DPC para que se ejecute la rutina customThreadedDpc, llame a KeInsertQueueDpc.

Para obtener más información sobre el uso de rutinas de CustomThreadedDpc, consulte Introduction to Threaded DPCs.

Una rutina de CustomThreadedDpc puede ejecutarse en IRQL = DISPATCH_LEVEL, o bien puede ejecutarse en IRQL = PASSIVE_LEVEL en un subproceso en tiempo real.

Para crear un objeto DPC y registrar una rutina de CustomTimerDpc para ese objeto, un controlador debe llamar a KeInitializeDpc.

Para poner en cola una rutina de CustomTimerDpc para su ejecución, una rutina de controlador debe llamar a KeSetTimer o KeSetTimerEx, proporcionando un puntero de objeto DPC devuelto por KeInitializeDpc. El sistema llama a la customTimerDpc rutina cuando expira el intervalo del temporizador.

Para obtener más información sobre rutinas de CustomTimerDpc, consulte Objetos de temporizador y DPCs.

Ejemplos

Para definir una rutina de devolución de llamada, primero debe proporcionar una declaración de función que identifique el tipo de rutina de devolución de llamada que va a definir. Windows proporciona un conjunto de tipos de función de devolución de llamada para controladores. Declarar una función mediante los tipos de función de devolución de llamada ayuda a Análisis de código para controladores, comprobador de controladores estáticos (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.

Por ejemplo, para definir un CustomDpc rutina de devolución de llamada denominada MyCustomDpc, use el tipo KDEFERRED_ROUTINE tal como se muestra en este ejemplo de código:

KDEFERRED_ROUTINE MyCustomDpc;

A continuación, implemente la rutina de devolución de llamada de la siguiente manera:

_Use_decl_annotations_
VOID
  MyCustomDpc(
    struct _KDPC  *Dpc,
    PVOID  DeferredContext,
    PVOID  SystemArgument1,
    PVOID  SystemArgument2
    )
  {
      // Function body
  }

Requisitos

Requisito Valor
de la plataforma de destino de Escritorio
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
irQL Se llama en DISPATCH_LEVEL.

Consulte también

KeInsertQueueDpc

keSetTimer

KeSetTimerEx