Compartir a través de


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

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

Sintaxis

IO_DPC_ROUTINE IoDpcRoutine;

void IoDpcRoutine(
  [in]           PKDPC Dpc,
  [in]           _DEVICE_OBJECT *DeviceObject,
  [in, out]      _IRP *Irp,
  [in, optional] PVOID Context
)
{...}

Parámetros

[in] Dpc

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

[in] DeviceObject

Puntero proporcionado por el autor de la llamada a una estructura de DEVICE_OBJECT . Este es el objeto de dispositivo para el dispositivo de destino, creado anteriormente por la rutina AddDevice del controlador.

[in, out] Irp

Puntero proporcionado por el autor de la llamada a una estructura IRP que describe la operación de E/S.

[in, optional] Context

Puntero proporcionado por el autor de la llamada a la información de contexto definida por el controlador, especificada en una llamada anterior a IoRequestDpc.

Valor devuelto

None

Observaciones

Para registrar una rutina DpcForIsr para un objeto de dispositivo específico, un controlador debe llamar a IoInitializeDpcRequest, lo que hace que el sistema asigne e inicialice un objeto DPC. (Si necesita varias rutinas DPC, use rutinas CustomDpc ).

Para poner en cola una rutina DpcForIsr para su ejecución, la rutina InterruptService de un controlador debe llamar a IoRequestDPC.

Normalmente, una rutina DpcForIsr es responsable de al menos las siguientes tareas:

  • Completar la operación de E/S descrita por el IRP recibido.

  • Poner en cola el siguiente IRP.

    Si el controlador usa la cola IRP proporcionada por el sistema, la rutina DpcForIsr debe llamar a IoStartNextPacket o IoStartNextPacketByKey, por lo que la rutina StartIo del controlador comenzará a procesar la siguiente solicitud de E/S.

    Si el controlador usa colas de IRP internas, la rutina DpcForIsr debe poner en cola el siguiente IRP y comenzar el procesamiento de la siguiente solicitud de E/S.

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

Una rutina DpcForIsr 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 las rutinas de DpcForIsr , consulte DPC Objects and DPCs(Objetos DPC y DPC).

Ejemplos

Para definir una rutina de devolución de llamada DpcForIsr , primero debe proporcionar una declaración de función que identifique el tipo de rutina de devolución de llamada que está definiendo. 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 Code Analysis for Drivers, Static Driver Verifier (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 una rutina de devolución de llamada DpcForIsr denominada MyDpcForIsr, use el tipo IO_DPC_ROUTINE como se muestra en este ejemplo de código:

IO_DPC_ROUTINE MyDpcForIsr;

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

_Use_decl_annotations_
VOID
  MyDpcForIsr(
    PKDPC  Dpc,
    struct _DEVICE_OBJECT  *DeviceObject,
    struct _IRP  *Irp,
    PVOID  Context
    )
  {
      // Function body
  }

El tipo de función IO_DPC_ROUTINE se define en el archivo de encabezado Wdm.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación a la _Use_decl_annotations_ definición de la función. La _Use_decl_annotations_ anotación garantiza que se usen las anotaciones que se aplican al tipo de función IO_DPC_ROUTINE en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de roles de función para controladores WDM. Para obtener información sobre _Use_decl_annotations_, consulte Anotación del comportamiento de la función.

Requisitos

Requisito Value
Plataforma de destino Escritorio
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
IRQL Se llama en DISPATCH_LEVEL.